2025-10-06 16:12:04 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-06 16:12:04 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-06 16:12:04 - Datos recibidos: {"productos":[{"id":756,"codigo":"BER-756","cantidad":1,"precio":"2000.00","subtotal":2000,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-06 16:12:04 - Content-Type: application/json 2025-10-06 16:12:04 - Resultado de json_decode: OK 2025-10-06 16:12:04 - ID sesión de caja recibido en JSON: 19 2025-10-06 16:12:04 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-06 16:12:04 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-06 16:12:04 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-06 16:12:04 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-06 16:12:04 - Modo API DTE está INACTIVO según configuración. 2025-10-06 16:12:04 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-06 16:12:04 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-06 16:12:04 - Venta insertada con ID: 678 2025-10-06 16:12:04 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-06 16:12:04 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 678) 2025-10-06 16:12:04 - Token de vista generado: 274f0c219d59d6d8bc357adb7fa46ce6 2025-10-06 16:12:04 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-06 16:12:04 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-06 16:12:04 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-06 16:12:04 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-06 16:12:04 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-06 16:12:04 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-06 16:12:04 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-06 16:12:04 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-06 16:12:04 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-06 16:12:04 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-06 16:12:04 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-06 16:12:04 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-06 16:12:04 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-06 16:12:04 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-06 16:12:04 - --- Iniciando procesamiento para Prod0_ID756 --- 2025-10-06 16:12:04 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID756] Params: {"pid":756} 2025-10-06 16:12:04 - [Stock Check] Producto ID: 756, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-06 16:12:04 - [LOTE ESPECÍFICO][Prod0_ID756] Usando LOTE2 (ID: 164) con 100 unidades 2025-10-06 16:12:04 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID756] Lote ID: 164, Cantidad reducida: 1 2025-10-06 16:12:04 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID756] Params: cantidad=1, peso=, lote_id=164 2025-10-06 16:12:04 - [Stock Process][Prod0_ID756] Procesando stock con cantidad: 1 2025-10-06 16:12:04 - [Stock ESPECIAL][Prod0_ID756] Procesando producto especial con códigos de barras 2025-10-06 16:12:04 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID756] Params: {"pid":"756","codigo":"BER-756"} 2025-10-06 16:12:04 - [Stock Especial][Prod0_ID756] Producto especial - solo código de barras genérico: 153 2025-10-06 16:12:04 - [Stock Especial][Prod0_ID756] Actualizado código escaneado ID: 153. Descontado: 1 2025-10-06 16:12:04 - [Stock Strategy ESPECIAL][Prod0_ID756] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-06 16:12:04 - [Stock Update ESPECIAL][Prod0_ID756] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-06 16:12:04 - [Stock Update ESPECIAL][Prod0_ID756] Stock anterior: 200, cantidad a restar: 1, stock nuevo: 199 2025-10-06 16:12:04 - [Stock Update ESPECIAL][Prod0_ID756] Actualizando productos.stock manualmente 2025-10-06 16:12:04 - [Stock Update ESPECIAL][Prod0_ID756] productos.stock actualizado correctamente: 200 -> 199 2025-10-06 16:12:04 - [Stock Update ESPECIAL][Prod0_ID756] inventario.cantidad actualizado correctamente: 199 2025-10-06 16:12:04 - [Stock Update ESPECIAL][Prod0_ID756] Código genérico capturado: ID 153 2025-10-06 16:12:04 - [Stock Update ESPECIAL][Prod0_ID756] codigos_barras actualizado correctamente: 199 2025-10-06 16:12:04 - [Stock Update ESPECIAL][Prod0_ID756] resumen_productos actualizado correctamente: 199 2025-10-06 16:12:04 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 756, Cantidad: 1, Venta ID: 678 2025-10-06 16:12:04 - [Movimiento Stock] Registrando movimiento para Producto ID: 756, Cantidad: 1 2025-10-06 16:12:04 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 756 2025-10-06 16:12:04 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-06 16:12:04 - [DTE Detalle][Prod0_ID756] Agregado a venta_detalles_para_api con formato original 2025-10-06 16:12:04 - --- Fin procesamiento para Prod0_ID756 --- 2025-10-06 16:12:04 - Detalles de venta insertados y stock actualizado. 2025-10-06 16:12:04 - No se intentó la emisión DTE para Venta ID: 678 (Modo API inactivo o condiciones no cumplidas). 2025-10-06 16:12:04 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 678 2025-10-06 16:12:04 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-06 16:12:04 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-06 16:12:04 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-06 16:12:04 - Transacción completada con éxito para Venta ID: 678 2025-10-06 16:12:04 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-06 16:12:04 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 15:00:37 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 15:00:37 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 15:00:37 - Datos recibidos: {"productos":[{"id":767,"codigo":"TRO-767","cantidad":1,"precio":"2500.00","subtotal":2500,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":2500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 15:00:37 - Content-Type: application/json 2025-10-07 15:00:37 - Resultado de json_decode: OK 2025-10-07 15:00:37 - ID sesión de caja recibido en JSON: 19 2025-10-07 15:00:37 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 15:00:37 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 15:00:37 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 15:00:37 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 15:00:37 - Modo API DTE está INACTIVO según configuración. 2025-10-07 15:00:37 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 15:00:37 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 15:00:37 - Venta insertada con ID: 679 2025-10-07 15:00:37 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 15:00:37 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 679) 2025-10-07 15:00:37 - Token de vista generado: b63547347e4f380a72db10bcaf5729a4 2025-10-07 15:00:37 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 15:00:37 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 15:00:37 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 15:00:37 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 15:00:37 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 15:00:37 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 15:00:37 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 15:00:37 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 15:00:37 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 15:00:37 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 15:00:37 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 15:00:37 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 15:00:37 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 15:00:37 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 15:00:37 - --- Iniciando procesamiento para Prod0_ID767 --- 2025-10-07 15:00:37 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID767] Params: {"pid":767} 2025-10-07 15:00:37 - [Stock Check] Producto ID: 767, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 15:00:37 - [LOTE ESPECÍFICO][Prod0_ID767] Usando LOTE2 (ID: 186) con 250 unidades 2025-10-07 15:00:37 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID767] Lote ID: 186, Cantidad reducida: 1 2025-10-07 15:00:37 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID767] Params: cantidad=1, peso=, lote_id=186 2025-10-07 15:00:37 - [Stock Process][Prod0_ID767] Procesando stock con cantidad: 1 2025-10-07 15:00:37 - [Stock ESPECIAL][Prod0_ID767] Procesando producto especial con códigos de barras 2025-10-07 15:00:37 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID767] Params: {"pid":"767","codigo":"TRO-767"} 2025-10-07 15:00:37 - [Stock Especial][Prod0_ID767] Producto especial - solo código de barras genérico: 164 2025-10-07 15:00:37 - [Stock Especial][Prod0_ID767] Actualizado código escaneado ID: 164. Descontado: 1 2025-10-07 15:00:37 - [Stock Strategy ESPECIAL][Prod0_ID767] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-07 15:00:37 - [Stock Update ESPECIAL][Prod0_ID767] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 15:00:37 - [Stock Update ESPECIAL][Prod0_ID767] Stock anterior: 350, cantidad a restar: 1, stock nuevo: 349 2025-10-07 15:00:37 - [Stock Update ESPECIAL][Prod0_ID767] Actualizando productos.stock manualmente 2025-10-07 15:00:37 - [Stock Update ESPECIAL][Prod0_ID767] productos.stock actualizado correctamente: 350 -> 349 2025-10-07 15:00:37 - [Stock Update ESPECIAL][Prod0_ID767] inventario.cantidad actualizado correctamente: 349 2025-10-07 15:00:37 - [Stock Update ESPECIAL][Prod0_ID767] Código genérico capturado: ID 164 2025-10-07 15:00:37 - [Stock Update ESPECIAL][Prod0_ID767] codigos_barras actualizado correctamente: 349 2025-10-07 15:00:37 - [Stock Update ESPECIAL][Prod0_ID767] resumen_productos actualizado correctamente: 349 2025-10-07 15:00:37 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 767, Cantidad: 1, Venta ID: 679 2025-10-07 15:00:37 - [Movimiento Stock] Registrando movimiento para Producto ID: 767, Cantidad: 1 2025-10-07 15:00:37 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 767 2025-10-07 15:00:37 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 15:00:37 - [DTE Detalle][Prod0_ID767] Agregado a venta_detalles_para_api con formato original 2025-10-07 15:00:37 - --- Fin procesamiento para Prod0_ID767 --- 2025-10-07 15:00:37 - Detalles de venta insertados y stock actualizado. 2025-10-07 15:00:37 - No se intentó la emisión DTE para Venta ID: 679 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 15:00:37 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 679 2025-10-07 15:00:37 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 15:00:37 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 15:00:37 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 15:00:37 - Transacción completada con éxito para Venta ID: 679 2025-10-07 15:00:37 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 15:00:37 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 15:11:34 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 15:11:34 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 15:11:34 - Datos recibidos: {"productos":[{"id":766,"codigo":"BER-766","cantidad":1,"precio":"2000.00","subtotal":2000,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 15:11:34 - Content-Type: application/json 2025-10-07 15:11:34 - Resultado de json_decode: OK 2025-10-07 15:11:34 - ID sesión de caja recibido en JSON: 19 2025-10-07 15:11:34 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 15:11:34 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 15:11:34 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 15:11:34 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 15:11:34 - Modo API DTE está INACTIVO según configuración. 2025-10-07 15:11:34 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 15:11:34 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 15:11:34 - Venta insertada con ID: 680 2025-10-07 15:11:34 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 15:11:34 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 680) 2025-10-07 15:11:34 - Token de vista generado: e872a8df6e7c1a19b6ca18887df488b1 2025-10-07 15:11:34 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 15:11:34 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 15:11:34 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 15:11:34 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 15:11:34 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 15:11:34 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 15:11:34 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 15:11:34 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 15:11:34 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 15:11:34 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 15:11:34 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 15:11:34 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 15:11:34 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 15:11:34 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 15:11:34 - --- Iniciando procesamiento para Prod0_ID766 --- 2025-10-07 15:11:34 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID766] Params: {"pid":766} 2025-10-07 15:11:34 - [Stock Check] Producto ID: 766, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 15:11:34 - [LOTE ESPECÍFICO][Prod0_ID766] Usando LOTE2 (ID: 184) con 100 unidades 2025-10-07 15:11:34 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID766] Lote ID: 184, Cantidad reducida: 1 2025-10-07 15:11:34 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID766] Params: cantidad=1, peso=, lote_id=184 2025-10-07 15:11:34 - [Stock Process][Prod0_ID766] Procesando stock con cantidad: 1 2025-10-07 15:11:34 - [Stock ESPECIAL][Prod0_ID766] Procesando producto especial con códigos de barras 2025-10-07 15:11:34 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID766] Params: {"pid":"766","codigo":"BER-766"} 2025-10-07 15:11:34 - [Stock Especial][Prod0_ID766] Producto especial - solo código de barras genérico: 163 2025-10-07 15:11:34 - [Stock Especial][Prod0_ID766] Actualizado código escaneado ID: 163. Descontado: 1 2025-10-07 15:11:34 - [Stock Strategy ESPECIAL][Prod0_ID766] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-07 15:11:34 - [Stock Update ESPECIAL][Prod0_ID766] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 15:11:34 - [Stock Update ESPECIAL][Prod0_ID766] Stock anterior: 200, cantidad a restar: 1, stock nuevo: 199 2025-10-07 15:11:34 - [Stock Update ESPECIAL][Prod0_ID766] Actualizando productos.stock manualmente 2025-10-07 15:11:34 - [Stock Update ESPECIAL][Prod0_ID766] productos.stock actualizado correctamente: 200 -> 199 2025-10-07 15:11:34 - [Stock Update ESPECIAL][Prod0_ID766] inventario.cantidad actualizado correctamente: 199 2025-10-07 15:11:34 - [Stock Update ESPECIAL][Prod0_ID766] Código genérico capturado: ID 163 2025-10-07 15:11:34 - [Stock Update ESPECIAL][Prod0_ID766] codigos_barras actualizado correctamente: 199 2025-10-07 15:11:34 - [Stock Update ESPECIAL][Prod0_ID766] resumen_productos actualizado correctamente: 199 2025-10-07 15:11:34 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 766, Cantidad: 1, Venta ID: 680 2025-10-07 15:11:34 - [Movimiento Stock] Registrando movimiento para Producto ID: 766, Cantidad: 1 2025-10-07 15:11:34 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 766 2025-10-07 15:11:34 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 15:11:34 - [DTE Detalle][Prod0_ID766] Agregado a venta_detalles_para_api con formato original 2025-10-07 15:11:34 - --- Fin procesamiento para Prod0_ID766 --- 2025-10-07 15:11:34 - Detalles de venta insertados y stock actualizado. 2025-10-07 15:11:34 - No se intentó la emisión DTE para Venta ID: 680 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 15:11:34 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 680 2025-10-07 15:11:34 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 15:11:34 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 15:11:34 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 15:11:34 - Transacción completada con éxito para Venta ID: 680 2025-10-07 15:11:34 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 15:11:34 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 15:17:04 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 15:17:04 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 15:17:04 - Datos recibidos: {"productos":[{"id":770,"codigo":"BEL-770","cantidad":1,"precio":"2000.00","subtotal":2000,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 15:17:04 - Content-Type: application/json 2025-10-07 15:17:04 - Resultado de json_decode: OK 2025-10-07 15:17:04 - ID sesión de caja recibido en JSON: 19 2025-10-07 15:17:04 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 15:17:04 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 15:17:04 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 15:17:04 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 15:17:04 - Modo API DTE está INACTIVO según configuración. 2025-10-07 15:17:04 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 15:17:04 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 15:17:04 - Venta insertada con ID: 681 2025-10-07 15:17:04 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 15:17:04 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 681) 2025-10-07 15:17:04 - Token de vista generado: 4f96a3ace82203b408e1cb36ecc879fb 2025-10-07 15:17:04 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 15:17:04 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 15:17:04 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 15:17:04 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 15:17:04 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 15:17:04 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 15:17:04 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 15:17:04 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 15:17:04 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 15:17:04 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 15:17:04 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 15:17:04 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 15:17:04 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 15:17:04 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 15:17:04 - --- Iniciando procesamiento para Prod0_ID770 --- 2025-10-07 15:17:04 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID770] Params: {"pid":770} 2025-10-07 15:17:04 - [Stock Check] Producto ID: 770, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 15:17:04 - [LOTE ESPECÍFICO][Prod0_ID770] Usando LOTE2 (ID: 188) con 100 unidades 2025-10-07 15:17:04 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID770] Lote ID: 188, Cantidad reducida: 1 2025-10-07 15:17:04 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID770] Params: cantidad=1, peso=, lote_id=188 2025-10-07 15:17:04 - [Stock Process][Prod0_ID770] Procesando stock con cantidad: 1 2025-10-07 15:17:04 - [Stock ESPECIAL][Prod0_ID770] Procesando producto especial con códigos de barras 2025-10-07 15:17:04 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID770] Params: {"pid":"770","codigo":"BEL-770"} 2025-10-07 15:17:04 - [Stock Especial][Prod0_ID770] Producto especial - solo código de barras genérico: 170 2025-10-07 15:17:04 - [Stock Especial][Prod0_ID770] Actualizado código escaneado ID: 170. Descontado: 1 2025-10-07 15:17:04 - [Stock Strategy ESPECIAL][Prod0_ID770] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-07 15:17:04 - [Stock Update ESPECIAL][Prod0_ID770] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 15:17:04 - [Stock Update ESPECIAL][Prod0_ID770] Stock anterior: 200, cantidad a restar: 1, stock nuevo: 199 2025-10-07 15:17:04 - [Stock Update ESPECIAL][Prod0_ID770] Actualizando productos.stock manualmente 2025-10-07 15:17:04 - [Stock Update ESPECIAL][Prod0_ID770] productos.stock actualizado correctamente: 200 -> 199 2025-10-07 15:17:04 - [Stock Update ESPECIAL][Prod0_ID770] inventario.cantidad actualizado correctamente: 199 2025-10-07 15:17:04 - [Stock Update ESPECIAL][Prod0_ID770] Código genérico capturado: ID 170 2025-10-07 15:17:04 - [Stock Update ESPECIAL][Prod0_ID770] codigos_barras actualizado correctamente: 199 2025-10-07 15:17:04 - [Stock Update ESPECIAL][Prod0_ID770] resumen_productos actualizado correctamente: 199 2025-10-07 15:17:04 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 770, Cantidad: 1, Venta ID: 681 2025-10-07 15:17:04 - [Movimiento Stock] Registrando movimiento para Producto ID: 770, Cantidad: 1 2025-10-07 15:17:04 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 770 2025-10-07 15:17:04 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 15:17:04 - [DTE Detalle][Prod0_ID770] Agregado a venta_detalles_para_api con formato original 2025-10-07 15:17:04 - --- Fin procesamiento para Prod0_ID770 --- 2025-10-07 15:17:04 - Detalles de venta insertados y stock actualizado. 2025-10-07 15:17:04 - No se intentó la emisión DTE para Venta ID: 681 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 15:17:04 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 681 2025-10-07 15:17:04 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 15:17:04 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 15:17:04 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 15:17:04 - Transacción completada con éxito para Venta ID: 681 2025-10-07 15:17:04 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 15:17:04 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 15:57:14 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 15:57:14 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 15:57:14 - Datos recibidos: {"productos":[{"id":771,"codigo":"BER-771","cantidad":1,"precio":"2800.00","subtotal":2800,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":2800,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 15:57:14 - Content-Type: application/json 2025-10-07 15:57:14 - Resultado de json_decode: OK 2025-10-07 15:57:14 - ID sesión de caja recibido en JSON: 19 2025-10-07 15:57:14 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 15:57:14 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 15:57:14 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 15:57:14 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 15:57:14 - Modo API DTE está INACTIVO según configuración. 2025-10-07 15:57:14 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 15:57:14 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 15:57:14 - Venta insertada con ID: 682 2025-10-07 15:57:14 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 15:57:14 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 682) 2025-10-07 15:57:14 - Token de vista generado: 4f5e775100e13a4d85cd321120463d3f 2025-10-07 15:57:14 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 15:57:14 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 15:57:14 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 15:57:14 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 15:57:14 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 15:57:14 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 15:57:14 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 15:57:14 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 15:57:14 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 15:57:14 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 15:57:14 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 15:57:14 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 15:57:14 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 15:57:14 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 15:57:14 - --- Iniciando procesamiento para Prod0_ID771 --- 2025-10-07 15:57:14 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID771] Params: {"pid":771} 2025-10-07 15:57:14 - [Stock Check] Producto ID: 771, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 15:57:14 - [LOTE ESPECÍFICO][Prod0_ID771] Usando LOTE2 (ID: 190) con 100 unidades 2025-10-07 15:57:14 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID771] Lote ID: 190, Cantidad reducida: 1 2025-10-07 15:57:14 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID771] Params: cantidad=1, peso=, lote_id=190 2025-10-07 15:57:14 - [Stock Process][Prod0_ID771] Procesando stock con cantidad: 1 2025-10-07 15:57:14 - [Stock ESPECIAL][Prod0_ID771] Procesando producto especial con códigos de barras 2025-10-07 15:57:14 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID771] Params: {"pid":"771","codigo":"BER-771"} 2025-10-07 15:57:14 - [Stock Especial][Prod0_ID771] Producto especial - solo código de barras genérico: 171 2025-10-07 15:57:14 - [Stock Especial][Prod0_ID771] Actualizado código escaneado ID: 171. Descontado: 1 2025-10-07 15:57:14 - [Stock Strategy ESPECIAL][Prod0_ID771] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-07 15:57:14 - [Stock Update ESPECIAL][Prod0_ID771] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 15:57:14 - [Stock Update ESPECIAL][Prod0_ID771] Stock anterior: 200, cantidad a restar: 1, stock nuevo: 199 2025-10-07 15:57:14 - [Stock Update ESPECIAL][Prod0_ID771] Actualizando productos.stock manualmente 2025-10-07 15:57:14 - [Stock Update ESPECIAL][Prod0_ID771] productos.stock actualizado correctamente: 200 -> 199 2025-10-07 15:57:14 - [Stock Update ESPECIAL][Prod0_ID771] inventario.cantidad actualizado correctamente: 199 2025-10-07 15:57:14 - [Stock Update ESPECIAL][Prod0_ID771] Código genérico capturado: ID 171 2025-10-07 15:57:14 - [Stock Update ESPECIAL][Prod0_ID771] codigos_barras actualizado correctamente: 199 2025-10-07 15:57:14 - [Stock Update ESPECIAL][Prod0_ID771] resumen_productos actualizado correctamente: 199 2025-10-07 15:57:14 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 771, Cantidad: 1, Venta ID: 682 2025-10-07 15:57:14 - [Movimiento Stock] Registrando movimiento para Producto ID: 771, Cantidad: 1 2025-10-07 15:57:14 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 771 2025-10-07 15:57:14 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 15:57:14 - [DTE Detalle][Prod0_ID771] Agregado a venta_detalles_para_api con formato original 2025-10-07 15:57:14 - --- Fin procesamiento para Prod0_ID771 --- 2025-10-07 15:57:14 - Detalles de venta insertados y stock actualizado. 2025-10-07 15:57:14 - No se intentó la emisión DTE para Venta ID: 682 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 15:57:14 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 682 2025-10-07 15:57:14 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 15:57:14 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 15:57:14 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 15:57:14 - Transacción completada con éxito para Venta ID: 682 2025-10-07 15:57:14 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 15:57:14 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 16:26:10 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 16:26:10 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 16:26:10 - Datos recibidos: {"productos":[{"id":771,"codigo":"BER-771","cantidad":2,"precio":"2800.00","subtotal":5600,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":5600,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 16:26:10 - Content-Type: application/json 2025-10-07 16:26:10 - Resultado de json_decode: OK 2025-10-07 16:26:10 - ID sesión de caja recibido en JSON: 19 2025-10-07 16:26:10 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 16:26:10 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 16:26:10 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 16:26:10 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 16:26:10 - Modo API DTE está INACTIVO según configuración. 2025-10-07 16:26:10 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 16:26:10 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 16:26:10 - Venta insertada con ID: 683 2025-10-07 16:26:10 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 16:26:10 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 683) 2025-10-07 16:26:10 - Token de vista generado: 9f7ced30a3bee1da4634882f60a3a9d0 2025-10-07 16:26:10 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 16:26:10 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 16:26:10 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 16:26:10 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 16:26:10 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 16:26:10 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 16:26:10 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:26:10 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:26:10 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:26:10 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:26:10 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 16:26:10 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:26:10 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 16:26:10 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:26:10 - --- Iniciando procesamiento para Prod0_ID771 --- 2025-10-07 16:26:10 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID771] Params: {"pid":771} 2025-10-07 16:26:10 - [Stock Check] Producto ID: 771, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 16:26:10 - [LOTE ESPECÍFICO][Prod0_ID771] Usando LOTE2 (ID: 190) con 100 unidades 2025-10-07 16:26:10 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID771] Lote ID: 190, Cantidad reducida: 2 2025-10-07 16:26:10 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID771] Params: cantidad=2, peso=, lote_id=190 2025-10-07 16:26:10 - [Stock Process][Prod0_ID771] Procesando stock con cantidad: 2 2025-10-07 16:26:10 - [Stock ESPECIAL][Prod0_ID771] Procesando producto especial con códigos de barras 2025-10-07 16:26:10 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID771] Params: {"pid":"771","codigo":"BER-771"} 2025-10-07 16:26:10 - [Stock Especial][Prod0_ID771] Producto especial - solo código de barras genérico: 171 2025-10-07 16:26:10 - [Stock Especial][Prod0_ID771] Actualizado código escaneado ID: 171. Descontado: 2 2025-10-07 16:26:10 - [Stock Strategy ESPECIAL][Prod0_ID771] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 2 2025-10-07 16:26:10 - [Stock Update ESPECIAL][Prod0_ID771] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 16:26:10 - [Stock Update ESPECIAL][Prod0_ID771] Stock anterior: 200, cantidad a restar: 2, stock nuevo: 198 2025-10-07 16:26:10 - [Stock Update ESPECIAL][Prod0_ID771] Actualizando productos.stock manualmente 2025-10-07 16:26:10 - [Stock Update ESPECIAL][Prod0_ID771] productos.stock actualizado correctamente: 200 -> 198 2025-10-07 16:26:10 - [Stock Update ESPECIAL][Prod0_ID771] inventario.cantidad actualizado correctamente: 198 2025-10-07 16:26:10 - [Stock Update ESPECIAL][Prod0_ID771] Código genérico capturado: ID 171 2025-10-07 16:26:10 - [Stock Update ESPECIAL][Prod0_ID771] codigos_barras actualizado correctamente: 198 2025-10-07 16:26:10 - [Stock Update ESPECIAL][Prod0_ID771] resumen_productos actualizado correctamente: 198 2025-10-07 16:26:10 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 771, Cantidad: 2, Venta ID: 683 2025-10-07 16:26:10 - [Movimiento Stock] Registrando movimiento para Producto ID: 771, Cantidad: 2 2025-10-07 16:26:10 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 771 2025-10-07 16:26:10 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 16:26:10 - [DTE Detalle][Prod0_ID771] Agregado a venta_detalles_para_api con formato original 2025-10-07 16:26:10 - --- Fin procesamiento para Prod0_ID771 --- 2025-10-07 16:26:10 - Detalles de venta insertados y stock actualizado. 2025-10-07 16:26:10 - No se intentó la emisión DTE para Venta ID: 683 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 16:26:10 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 683 2025-10-07 16:26:10 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 16:26:10 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 16:26:10 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 16:26:10 - Transacción completada con éxito para Venta ID: 683 2025-10-07 16:26:10 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 16:26:10 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 16:26:54 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 16:26:54 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 16:26:54 - Datos recibidos: {"productos":[{"id":771,"codigo":"BER-771","cantidad":5,"precio":"2800.00","subtotal":14000,"es_busqueda_por_codigo":false}],"metodo_pago":"2","total":14000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 16:26:54 - Content-Type: application/json 2025-10-07 16:26:54 - Resultado de json_decode: OK 2025-10-07 16:26:54 - ID sesión de caja recibido en JSON: 19 2025-10-07 16:26:54 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 16:26:54 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 16:26:54 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 16:26:54 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 16:26:54 - Modo API DTE está INACTIVO según configuración. 2025-10-07 16:26:54 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 16:26:54 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 16:26:54 - Venta insertada con ID: 684 2025-10-07 16:26:54 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 16:26:54 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 684) 2025-10-07 16:26:54 - Token de vista generado: 56f367591f697ff714ac91207806007e 2025-10-07 16:26:54 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 16:26:54 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 16:26:54 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 16:26:54 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 16:26:54 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 16:26:54 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 16:26:54 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:26:54 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:26:54 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:26:54 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:26:54 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 16:26:54 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:26:54 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 16:26:54 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:26:54 - --- Iniciando procesamiento para Prod0_ID771 --- 2025-10-07 16:26:54 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID771] Params: {"pid":771} 2025-10-07 16:26:54 - [Stock Check] Producto ID: 771, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 16:26:54 - [LOTE ACTUALIZADO][Prod0_ID771] Lote ID: 189, Cantidad reducida: 5 2025-10-07 16:26:54 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID771] Params: cantidad=5, peso=, lote_id=189 2025-10-07 16:26:54 - [Stock Process][Prod0_ID771] Procesando stock con cantidad: 5 2025-10-07 16:26:54 - [Stock ESPECIAL][Prod0_ID771] Procesando producto especial con códigos de barras 2025-10-07 16:26:54 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID771] Params: {"pid":"771","codigo":"BER-771"} 2025-10-07 16:26:54 - [Stock Especial][Prod0_ID771] Producto especial - solo código de barras genérico: 171 2025-10-07 16:26:54 - [Stock Especial][Prod0_ID771] Actualizado código escaneado ID: 171. Descontado: 5 2025-10-07 16:26:54 - [Stock Strategy ESPECIAL][Prod0_ID771] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 5 2025-10-07 16:26:54 - [Stock Update ESPECIAL][Prod0_ID771] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 16:26:54 - [Stock Update ESPECIAL][Prod0_ID771] Stock anterior: 200, cantidad a restar: 5, stock nuevo: 195 2025-10-07 16:26:54 - [Stock Update ESPECIAL][Prod0_ID771] Actualizando productos.stock manualmente 2025-10-07 16:26:54 - [Stock Update ESPECIAL][Prod0_ID771] productos.stock actualizado correctamente: 200 -> 195 2025-10-07 16:26:54 - [Stock Update ESPECIAL][Prod0_ID771] inventario.cantidad actualizado correctamente: 195 2025-10-07 16:26:54 - [Stock Update ESPECIAL][Prod0_ID771] Código genérico capturado: ID 171 2025-10-07 16:26:54 - [Stock Update ESPECIAL][Prod0_ID771] codigos_barras actualizado correctamente: 195 2025-10-07 16:26:54 - [Stock Update ESPECIAL][Prod0_ID771] resumen_productos actualizado correctamente: 195 2025-10-07 16:26:54 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 771, Cantidad: 5, Venta ID: 684 2025-10-07 16:26:54 - [Movimiento Stock] Registrando movimiento para Producto ID: 771, Cantidad: 5 2025-10-07 16:26:54 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 771 2025-10-07 16:26:54 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 16:26:54 - [DTE Detalle][Prod0_ID771] Agregado a venta_detalles_para_api con formato original 2025-10-07 16:26:54 - --- Fin procesamiento para Prod0_ID771 --- 2025-10-07 16:26:54 - Detalles de venta insertados y stock actualizado. 2025-10-07 16:26:54 - No se intentó la emisión DTE para Venta ID: 684 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 16:26:54 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 684 2025-10-07 16:26:54 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 16:26:54 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 16:26:54 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 16:26:54 - Transacción completada con éxito para Venta ID: 684 2025-10-07 16:26:54 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 16:26:54 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 16:28:35 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 16:28:35 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 16:28:35 - Datos recibidos: {"productos":[{"id":771,"codigo":"BER-771","cantidad":5,"precio":"2800.00","subtotal":14000,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":14000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 16:28:35 - Content-Type: application/json 2025-10-07 16:28:35 - Resultado de json_decode: OK 2025-10-07 16:28:35 - ID sesión de caja recibido en JSON: 19 2025-10-07 16:28:35 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 16:28:35 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 16:28:35 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 16:28:35 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 16:28:35 - Modo API DTE está INACTIVO según configuración. 2025-10-07 16:28:35 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 16:28:35 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 16:28:35 - Venta insertada con ID: 685 2025-10-07 16:28:35 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 16:28:35 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 685) 2025-10-07 16:28:35 - Token de vista generado: b8a206afa9d401f9ee0d853c9eaed973 2025-10-07 16:28:35 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 16:28:35 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 16:28:35 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 16:28:35 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 16:28:35 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 16:28:35 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 16:28:35 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:28:35 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:28:35 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:28:35 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:28:35 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 16:28:35 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:28:35 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 16:28:35 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:28:35 - --- Iniciando procesamiento para Prod0_ID771 --- 2025-10-07 16:28:35 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID771] Params: {"pid":771} 2025-10-07 16:28:35 - [Stock Check] Producto ID: 771, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 16:28:35 - [LOTE ESPECÍFICO][Prod0_ID771] Usando LOTE2 (ID: 190) con 100 unidades 2025-10-07 16:28:35 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID771] Lote ID: 190, Cantidad reducida: 5 2025-10-07 16:28:35 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID771] Params: cantidad=5, peso=, lote_id=190 2025-10-07 16:28:35 - [Stock Process][Prod0_ID771] Procesando stock con cantidad: 5 2025-10-07 16:28:35 - [Stock ESPECIAL][Prod0_ID771] Procesando producto especial con códigos de barras 2025-10-07 16:28:35 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID771] Params: {"pid":"771","codigo":"BER-771"} 2025-10-07 16:28:35 - [Stock Especial][Prod0_ID771] Producto especial - solo código de barras genérico: 171 2025-10-07 16:28:35 - [Stock Especial][Prod0_ID771] Actualizado código escaneado ID: 171. Descontado: 5 2025-10-07 16:28:35 - [Stock Strategy ESPECIAL][Prod0_ID771] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 5 2025-10-07 16:28:35 - [Stock Update ESPECIAL][Prod0_ID771] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 16:28:35 - [Stock Update ESPECIAL][Prod0_ID771] Stock anterior: 200, cantidad a restar: 5, stock nuevo: 195 2025-10-07 16:28:35 - [Stock Update ESPECIAL][Prod0_ID771] Actualizando productos.stock manualmente 2025-10-07 16:28:35 - [Stock Update ESPECIAL][Prod0_ID771] productos.stock actualizado correctamente: 200 -> 195 2025-10-07 16:28:35 - [Stock Update ESPECIAL][Prod0_ID771] inventario.cantidad actualizado correctamente: 195 2025-10-07 16:28:35 - [Stock Update ESPECIAL][Prod0_ID771] Código genérico capturado: ID 171 2025-10-07 16:28:35 - [Stock Update ESPECIAL][Prod0_ID771] codigos_barras actualizado correctamente: 195 2025-10-07 16:28:35 - [Stock Update ESPECIAL][Prod0_ID771] resumen_productos actualizado correctamente: 195 2025-10-07 16:28:35 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 771, Cantidad: 5, Venta ID: 685 2025-10-07 16:28:35 - [Movimiento Stock] Registrando movimiento para Producto ID: 771, Cantidad: 5 2025-10-07 16:28:35 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 771 2025-10-07 16:28:35 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 16:28:35 - [DTE Detalle][Prod0_ID771] Agregado a venta_detalles_para_api con formato original 2025-10-07 16:28:35 - --- Fin procesamiento para Prod0_ID771 --- 2025-10-07 16:28:35 - Detalles de venta insertados y stock actualizado. 2025-10-07 16:28:35 - No se intentó la emisión DTE para Venta ID: 685 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 16:28:35 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 685 2025-10-07 16:28:35 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 16:28:35 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 16:28:35 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 16:28:35 - Transacción completada con éxito para Venta ID: 685 2025-10-07 16:28:35 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 16:28:35 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 16:28:48 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 16:28:48 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 16:28:48 - Datos recibidos: {"productos":[{"id":771,"codigo":"BER-771","cantidad":5,"precio":"2800.00","subtotal":14000,"es_busqueda_por_codigo":false}],"metodo_pago":"2","total":14000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 16:28:48 - Content-Type: application/json 2025-10-07 16:28:48 - Resultado de json_decode: OK 2025-10-07 16:28:48 - ID sesión de caja recibido en JSON: 19 2025-10-07 16:28:48 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 16:28:48 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 16:28:48 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 16:28:48 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 16:28:48 - Modo API DTE está INACTIVO según configuración. 2025-10-07 16:28:48 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 16:28:48 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 16:28:48 - Venta insertada con ID: 686 2025-10-07 16:28:48 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 16:28:48 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 686) 2025-10-07 16:28:48 - Token de vista generado: 77964ad2133a2c834f42fb05e4721ed3 2025-10-07 16:28:48 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 16:28:48 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 16:28:48 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 16:28:48 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 16:28:48 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 16:28:48 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 16:28:48 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:28:48 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:28:48 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:28:48 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:28:48 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 16:28:48 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:28:48 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 16:28:48 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:28:48 - --- Iniciando procesamiento para Prod0_ID771 --- 2025-10-07 16:28:48 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID771] Params: {"pid":771} 2025-10-07 16:28:48 - [Stock Check] Producto ID: 771, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 16:28:48 - [LOTE ACTUALIZADO][Prod0_ID771] Lote ID: 189, Cantidad reducida: 5 2025-10-07 16:28:48 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID771] Params: cantidad=5, peso=, lote_id=189 2025-10-07 16:28:48 - [Stock Process][Prod0_ID771] Procesando stock con cantidad: 5 2025-10-07 16:28:48 - [Stock ESPECIAL][Prod0_ID771] Procesando producto especial con códigos de barras 2025-10-07 16:28:48 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID771] Params: {"pid":"771","codigo":"BER-771"} 2025-10-07 16:28:48 - [Stock Especial][Prod0_ID771] Producto especial - solo código de barras genérico: 171 2025-10-07 16:28:48 - [Stock Especial][Prod0_ID771] Actualizado código escaneado ID: 171. Descontado: 5 2025-10-07 16:28:48 - [Stock Strategy ESPECIAL][Prod0_ID771] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 5 2025-10-07 16:28:48 - [Stock Update ESPECIAL][Prod0_ID771] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 16:28:48 - [Stock Update ESPECIAL][Prod0_ID771] Stock anterior: 195, cantidad a restar: 5, stock nuevo: 190 2025-10-07 16:28:48 - [Stock Update ESPECIAL][Prod0_ID771] Actualizando productos.stock manualmente 2025-10-07 16:28:48 - [Stock Update ESPECIAL][Prod0_ID771] productos.stock actualizado correctamente: 195 -> 190 2025-10-07 16:28:48 - [Stock Update ESPECIAL][Prod0_ID771] inventario.cantidad actualizado correctamente: 190 2025-10-07 16:28:48 - [Stock Update ESPECIAL][Prod0_ID771] Código genérico capturado: ID 171 2025-10-07 16:28:48 - [Stock Update ESPECIAL][Prod0_ID771] codigos_barras actualizado correctamente: 190 2025-10-07 16:28:48 - [Stock Update ESPECIAL][Prod0_ID771] resumen_productos actualizado correctamente: 190 2025-10-07 16:28:48 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 771, Cantidad: 5, Venta ID: 686 2025-10-07 16:28:48 - [Movimiento Stock] Registrando movimiento para Producto ID: 771, Cantidad: 5 2025-10-07 16:28:48 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 771 2025-10-07 16:28:48 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 16:28:48 - [DTE Detalle][Prod0_ID771] Agregado a venta_detalles_para_api con formato original 2025-10-07 16:28:48 - --- Fin procesamiento para Prod0_ID771 --- 2025-10-07 16:28:48 - Detalles de venta insertados y stock actualizado. 2025-10-07 16:28:48 - No se intentó la emisión DTE para Venta ID: 686 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 16:28:48 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 686 2025-10-07 16:28:48 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 16:28:48 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 16:28:48 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 16:28:48 - Transacción completada con éxito para Venta ID: 686 2025-10-07 16:28:48 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 16:28:48 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 16:45:29 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 16:45:29 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 16:45:29 - Datos recibidos: {"productos":[{"id":772,"codigo":"BER-772","cantidad":5,"precio":"2000.00","subtotal":10000,"es_busqueda_por_codigo":false}],"metodo_pago":"2","total":10000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 16:45:29 - Content-Type: application/json 2025-10-07 16:45:29 - Resultado de json_decode: OK 2025-10-07 16:45:29 - ID sesión de caja recibido en JSON: 19 2025-10-07 16:45:29 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 16:45:29 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 16:45:29 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 16:45:29 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 16:45:29 - Modo API DTE está INACTIVO según configuración. 2025-10-07 16:45:29 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 16:45:29 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 16:45:29 - Venta insertada con ID: 687 2025-10-07 16:45:29 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 16:45:29 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 687) 2025-10-07 16:45:29 - Token de vista generado: 7c24d5bbd021ac5c86dfc64ad7b09694 2025-10-07 16:45:29 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 16:45:29 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 16:45:29 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 16:45:29 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 16:45:29 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 16:45:29 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 16:45:29 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:45:29 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:45:29 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:45:29 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:45:29 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 16:45:29 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:45:29 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 16:45:29 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:45:29 - --- Iniciando procesamiento para Prod0_ID772 --- 2025-10-07 16:45:29 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID772] Params: {"pid":772} 2025-10-07 16:45:29 - [Stock Check] Producto ID: 772, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 16:45:29 - [LOTE ACTUALIZADO][Prod0_ID772] Lote ID: 191, Cantidad reducida: 5 2025-10-07 16:45:29 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID772] Params: cantidad=5, peso=, lote_id=191 2025-10-07 16:45:29 - [Stock Process][Prod0_ID772] Procesando stock con cantidad: 5 2025-10-07 16:45:29 - [Stock ESPECIAL][Prod0_ID772] Procesando producto especial con códigos de barras 2025-10-07 16:45:29 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID772] Params: {"pid":"772","codigo":"BER-772"} 2025-10-07 16:45:29 - [Stock Especial][Prod0_ID772] Producto especial - solo código de barras genérico: 172 2025-10-07 16:45:29 - [Stock Especial][Prod0_ID772] Actualizado código escaneado ID: 172. Descontado: 5 2025-10-07 16:45:29 - [Stock Strategy ESPECIAL][Prod0_ID772] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 5 2025-10-07 16:45:29 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 16:45:29 - [Stock Update ESPECIAL][Prod0_ID772] Stock anterior: 200, cantidad a restar: 5, stock nuevo: 195 2025-10-07 16:45:29 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando productos.stock manualmente 2025-10-07 16:45:29 - [Stock Update ESPECIAL][Prod0_ID772] productos.stock actualizado correctamente: 200 -> 195 2025-10-07 16:45:29 - [Stock Update ESPECIAL][Prod0_ID772] inventario.cantidad actualizado correctamente: 195 2025-10-07 16:45:29 - [Stock Update ESPECIAL][Prod0_ID772] Código genérico capturado: ID 172 2025-10-07 16:45:29 - [Stock Update ESPECIAL][Prod0_ID772] codigos_barras actualizado correctamente: 195 2025-10-07 16:45:29 - [Stock Update ESPECIAL][Prod0_ID772] resumen_productos actualizado correctamente: 195 2025-10-07 16:45:29 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 772, Cantidad: 5, Venta ID: 687 2025-10-07 16:45:29 - [Movimiento Stock] Registrando movimiento para Producto ID: 772, Cantidad: 5 2025-10-07 16:45:29 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 772 2025-10-07 16:45:29 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 16:45:29 - [DTE Detalle][Prod0_ID772] Agregado a venta_detalles_para_api con formato original 2025-10-07 16:45:29 - --- Fin procesamiento para Prod0_ID772 --- 2025-10-07 16:45:29 - Detalles de venta insertados y stock actualizado. 2025-10-07 16:45:29 - No se intentó la emisión DTE para Venta ID: 687 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 16:45:29 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 687 2025-10-07 16:45:29 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 16:45:29 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 16:45:29 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 16:45:29 - Transacción completada con éxito para Venta ID: 687 2025-10-07 16:45:29 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 16:45:29 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 16:45:38 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 16:45:38 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 16:45:38 - Datos recibidos: {"productos":[{"id":772,"codigo":"BER-772","cantidad":5,"precio":"2000.00","subtotal":10000,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":10000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 16:45:38 - Content-Type: application/json 2025-10-07 16:45:38 - Resultado de json_decode: OK 2025-10-07 16:45:38 - ID sesión de caja recibido en JSON: 19 2025-10-07 16:45:38 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 16:45:38 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 16:45:38 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 16:45:38 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 16:45:38 - Modo API DTE está INACTIVO según configuración. 2025-10-07 16:45:38 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 16:45:38 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 16:45:38 - Venta insertada con ID: 688 2025-10-07 16:45:38 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 16:45:38 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 688) 2025-10-07 16:45:38 - Token de vista generado: 4988d036efbc8c3028d397f6beae6a2e 2025-10-07 16:45:38 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 16:45:38 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 16:45:38 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 16:45:38 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 16:45:38 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 16:45:38 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 16:45:38 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:45:38 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:45:38 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:45:38 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:45:38 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 16:45:38 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:45:38 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 16:45:38 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:45:38 - --- Iniciando procesamiento para Prod0_ID772 --- 2025-10-07 16:45:38 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID772] Params: {"pid":772} 2025-10-07 16:45:38 - [Stock Check] Producto ID: 772, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 16:45:38 - [LOTE ESPECÍFICO][Prod0_ID772] Usando LOTE2 (ID: 192) con 100 unidades 2025-10-07 16:45:38 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID772] Lote ID: 192, Cantidad reducida: 5 2025-10-07 16:45:38 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID772] Params: cantidad=5, peso=, lote_id=192 2025-10-07 16:45:38 - [Stock Process][Prod0_ID772] Procesando stock con cantidad: 5 2025-10-07 16:45:38 - [Stock ESPECIAL][Prod0_ID772] Procesando producto especial con códigos de barras 2025-10-07 16:45:38 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID772] Params: {"pid":"772","codigo":"BER-772"} 2025-10-07 16:45:38 - [Stock Especial][Prod0_ID772] Producto especial - solo código de barras genérico: 172 2025-10-07 16:45:38 - [Stock Especial][Prod0_ID772] Actualizado código escaneado ID: 172. Descontado: 5 2025-10-07 16:45:38 - [Stock Strategy ESPECIAL][Prod0_ID772] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 5 2025-10-07 16:45:38 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 16:45:38 - [Stock Update ESPECIAL][Prod0_ID772] Stock anterior: 195, cantidad a restar: 5, stock nuevo: 190 2025-10-07 16:45:38 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando productos.stock manualmente 2025-10-07 16:45:38 - [Stock Update ESPECIAL][Prod0_ID772] productos.stock actualizado correctamente: 195 -> 190 2025-10-07 16:45:38 - [Stock Update ESPECIAL][Prod0_ID772] inventario.cantidad actualizado correctamente: 190 2025-10-07 16:45:38 - [Stock Update ESPECIAL][Prod0_ID772] Código genérico capturado: ID 172 2025-10-07 16:45:38 - [Stock Update ESPECIAL][Prod0_ID772] codigos_barras actualizado correctamente: 190 2025-10-07 16:45:38 - [Stock Update ESPECIAL][Prod0_ID772] resumen_productos actualizado correctamente: 190 2025-10-07 16:45:38 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 772, Cantidad: 5, Venta ID: 688 2025-10-07 16:45:38 - [Movimiento Stock] Registrando movimiento para Producto ID: 772, Cantidad: 5 2025-10-07 16:45:38 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 772 2025-10-07 16:45:38 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 16:45:38 - [DTE Detalle][Prod0_ID772] Agregado a venta_detalles_para_api con formato original 2025-10-07 16:45:38 - --- Fin procesamiento para Prod0_ID772 --- 2025-10-07 16:45:38 - Detalles de venta insertados y stock actualizado. 2025-10-07 16:45:38 - No se intentó la emisión DTE para Venta ID: 688 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 16:45:38 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 688 2025-10-07 16:45:38 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 16:45:38 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 16:45:38 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 16:45:38 - Transacción completada con éxito para Venta ID: 688 2025-10-07 16:45:38 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 16:45:38 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 16:48:56 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 16:48:56 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 16:48:56 - Datos recibidos: {"productos":[{"id":772,"codigo":"BER-772","cantidad":5,"precio":"2000.00","subtotal":10000,"es_busqueda_por_codigo":false}],"metodo_pago":"2","total":10000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 16:48:56 - Content-Type: application/json 2025-10-07 16:48:56 - Resultado de json_decode: OK 2025-10-07 16:48:56 - ID sesión de caja recibido en JSON: 19 2025-10-07 16:48:56 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 16:48:56 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 16:48:56 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 16:48:56 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 16:48:56 - Modo API DTE está INACTIVO según configuración. 2025-10-07 16:48:56 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 16:48:56 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 16:48:56 - Venta insertada con ID: 689 2025-10-07 16:48:56 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 16:48:56 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 689) 2025-10-07 16:48:56 - Token de vista generado: b6275c47023eadf2ad4ab0ca66427cfc 2025-10-07 16:48:56 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 16:48:56 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 16:48:56 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 16:48:56 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 16:48:56 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 16:48:56 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 16:48:56 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:48:56 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:48:56 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:48:56 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:48:56 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 16:48:56 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:48:56 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 16:48:56 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:48:56 - --- Iniciando procesamiento para Prod0_ID772 --- 2025-10-07 16:48:56 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID772] Params: {"pid":772} 2025-10-07 16:48:56 - [Stock Check] Producto ID: 772, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 16:48:56 - [LOTE ACTUALIZADO][Prod0_ID772] Lote ID: 191, Cantidad reducida: 5 2025-10-07 16:48:56 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID772] Params: cantidad=5, peso=, lote_id=191 2025-10-07 16:48:56 - [Stock Process][Prod0_ID772] Procesando stock con cantidad: 5 2025-10-07 16:48:56 - [Stock ESPECIAL][Prod0_ID772] Procesando producto especial con códigos de barras 2025-10-07 16:48:56 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID772] Params: {"pid":"772","codigo":"BER-772"} 2025-10-07 16:48:56 - [Stock Especial][Prod0_ID772] Producto especial - solo código de barras genérico: 172 2025-10-07 16:48:56 - [Stock Especial][Prod0_ID772] Actualizado código escaneado ID: 172. Descontado: 5 2025-10-07 16:48:56 - [Stock Strategy ESPECIAL][Prod0_ID772] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 5 2025-10-07 16:48:56 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 16:48:56 - [Stock Update ESPECIAL][Prod0_ID772] Stock anterior: 200, cantidad a restar: 5, stock nuevo: 195 2025-10-07 16:48:56 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando productos.stock manualmente 2025-10-07 16:48:56 - [Stock Update ESPECIAL][Prod0_ID772] productos.stock actualizado correctamente: 200 -> 195 2025-10-07 16:48:56 - [Stock Update ESPECIAL][Prod0_ID772] inventario.cantidad actualizado correctamente: 195 2025-10-07 16:48:56 - [Stock Update ESPECIAL][Prod0_ID772] Código genérico capturado: ID 172 2025-10-07 16:48:56 - [Stock Update ESPECIAL][Prod0_ID772] codigos_barras actualizado correctamente: 195 2025-10-07 16:48:56 - [Stock Update ESPECIAL][Prod0_ID772] resumen_productos actualizado correctamente: 195 2025-10-07 16:48:56 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 772, Cantidad: 5, Venta ID: 689 2025-10-07 16:48:56 - [Movimiento Stock] Registrando movimiento para Producto ID: 772, Cantidad: 5 2025-10-07 16:48:56 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 772 2025-10-07 16:48:56 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 16:48:56 - [DTE Detalle][Prod0_ID772] Agregado a venta_detalles_para_api con formato original 2025-10-07 16:48:56 - --- Fin procesamiento para Prod0_ID772 --- 2025-10-07 16:48:56 - Detalles de venta insertados y stock actualizado. 2025-10-07 16:48:56 - No se intentó la emisión DTE para Venta ID: 689 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 16:48:56 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 689 2025-10-07 16:48:56 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 16:48:56 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 16:48:56 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 16:48:56 - Transacción completada con éxito para Venta ID: 689 2025-10-07 16:48:56 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 16:48:56 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 16:49:07 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 16:49:07 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 16:49:07 - Datos recibidos: {"productos":[{"id":772,"codigo":"BER-772","cantidad":6,"precio":"2000.00","subtotal":12000,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":12000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 16:49:07 - Content-Type: application/json 2025-10-07 16:49:07 - Resultado de json_decode: OK 2025-10-07 16:49:07 - ID sesión de caja recibido en JSON: 19 2025-10-07 16:49:07 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 16:49:07 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 16:49:07 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 16:49:07 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 16:49:07 - Modo API DTE está INACTIVO según configuración. 2025-10-07 16:49:07 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 16:49:07 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 16:49:07 - Venta insertada con ID: 690 2025-10-07 16:49:07 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 16:49:07 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 690) 2025-10-07 16:49:07 - Token de vista generado: 6bf5b14b322c15a6a60cdfb1c4c43e59 2025-10-07 16:49:07 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 16:49:07 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 16:49:07 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 16:49:07 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 16:49:07 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 16:49:07 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 16:49:07 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:49:07 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:49:07 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:49:07 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:49:07 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 16:49:07 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 16:49:07 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 16:49:07 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 16:49:07 - --- Iniciando procesamiento para Prod0_ID772 --- 2025-10-07 16:49:07 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID772] Params: {"pid":772} 2025-10-07 16:49:07 - [Stock Check] Producto ID: 772, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 16:49:07 - [LOTE ESPECÍFICO][Prod0_ID772] Usando LOTE2 (ID: 192) con 100 unidades 2025-10-07 16:49:07 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID772] Lote ID: 192, Cantidad reducida: 6 2025-10-07 16:49:07 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID772] Params: cantidad=6, peso=, lote_id=192 2025-10-07 16:49:07 - [Stock Process][Prod0_ID772] Procesando stock con cantidad: 6 2025-10-07 16:49:07 - [Stock ESPECIAL][Prod0_ID772] Procesando producto especial con códigos de barras 2025-10-07 16:49:07 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID772] Params: {"pid":"772","codigo":"BER-772"} 2025-10-07 16:49:07 - [Stock Especial][Prod0_ID772] Producto especial - solo código de barras genérico: 172 2025-10-07 16:49:07 - [Stock Especial][Prod0_ID772] Actualizado código escaneado ID: 172. Descontado: 6 2025-10-07 16:49:07 - [Stock Strategy ESPECIAL][Prod0_ID772] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 6 2025-10-07 16:49:07 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 16:49:07 - [Stock Update ESPECIAL][Prod0_ID772] Stock anterior: 195, cantidad a restar: 6, stock nuevo: 189 2025-10-07 16:49:07 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando productos.stock manualmente 2025-10-07 16:49:07 - [Stock Update ESPECIAL][Prod0_ID772] productos.stock actualizado correctamente: 195 -> 189 2025-10-07 16:49:07 - [Stock Update ESPECIAL][Prod0_ID772] inventario.cantidad actualizado correctamente: 189 2025-10-07 16:49:07 - [Stock Update ESPECIAL][Prod0_ID772] Código genérico capturado: ID 172 2025-10-07 16:49:07 - [Stock Update ESPECIAL][Prod0_ID772] codigos_barras actualizado correctamente: 189 2025-10-07 16:49:07 - [Stock Update ESPECIAL][Prod0_ID772] resumen_productos actualizado correctamente: 189 2025-10-07 16:49:07 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 772, Cantidad: 6, Venta ID: 690 2025-10-07 16:49:07 - [Movimiento Stock] Registrando movimiento para Producto ID: 772, Cantidad: 6 2025-10-07 16:49:07 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 772 2025-10-07 16:49:07 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 16:49:07 - [DTE Detalle][Prod0_ID772] Agregado a venta_detalles_para_api con formato original 2025-10-07 16:49:07 - --- Fin procesamiento para Prod0_ID772 --- 2025-10-07 16:49:07 - Detalles de venta insertados y stock actualizado. 2025-10-07 16:49:07 - No se intentó la emisión DTE para Venta ID: 690 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 16:49:07 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 690 2025-10-07 16:49:07 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 16:49:07 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 16:49:07 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 16:49:07 - Transacción completada con éxito para Venta ID: 690 2025-10-07 16:49:07 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 16:49:07 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:03:15 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:03:15 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:03:15 - Datos recibidos: {"productos":[{"id":772,"codigo":"BER-772","cantidad":5,"precio":"2000.00","subtotal":10000,"es_busqueda_por_codigo":false}],"metodo_pago":"2","total":10000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:03:15 - Content-Type: application/json 2025-10-07 17:03:15 - Resultado de json_decode: OK 2025-10-07 17:03:15 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:03:15 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:03:15 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:03:15 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:03:15 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:03:15 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:03:15 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:03:15 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:03:15 - Venta insertada con ID: 691 2025-10-07 17:03:15 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:03:15 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 691) 2025-10-07 17:03:15 - Token de vista generado: b485cb11992771ee5b2be60a211749ce 2025-10-07 17:03:15 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:03:15 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:03:15 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:03:15 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:03:15 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:03:15 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:03:15 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:03:15 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:03:15 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:03:15 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:03:15 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:03:15 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:03:15 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:03:15 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:03:15 - --- Iniciando procesamiento para Prod0_ID772 --- 2025-10-07 17:03:15 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID772] Params: {"pid":772} 2025-10-07 17:03:15 - [Stock Check] Producto ID: 772, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:03:15 - [LOTE ACTUALIZADO][Prod0_ID772] Lote ID: 191, Cantidad reducida: 5 2025-10-07 17:03:15 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID772] Params: cantidad=5, peso=, lote_id=191 2025-10-07 17:03:15 - [Stock Process][Prod0_ID772] Procesando stock con cantidad: 5 2025-10-07 17:03:15 - [Stock ESPECIAL][Prod0_ID772] Procesando producto especial con códigos de barras 2025-10-07 17:03:15 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID772] Params: {"pid":"772","codigo":"BER-772"} 2025-10-07 17:03:15 - [Stock Especial][Prod0_ID772] Producto especial - solo código de barras genérico: 172 2025-10-07 17:03:15 - [Stock Especial][Prod0_ID772] Actualizado código escaneado ID: 172. Descontado: 5 2025-10-07 17:03:15 - [Stock Strategy ESPECIAL][Prod0_ID772] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 5 2025-10-07 17:03:15 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 17:03:15 - [Stock Update ESPECIAL][Prod0_ID772] Stock anterior: 200, cantidad a restar: 5, stock nuevo: 195 2025-10-07 17:03:15 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando productos.stock manualmente 2025-10-07 17:03:15 - [Stock Update ESPECIAL][Prod0_ID772] productos.stock actualizado correctamente: 200 -> 195 2025-10-07 17:03:15 - [Stock Update ESPECIAL][Prod0_ID772] inventario.cantidad actualizado correctamente: 195 2025-10-07 17:03:15 - [Stock Update ESPECIAL][Prod0_ID772] Código genérico capturado: ID 172 2025-10-07 17:03:15 - [Stock Update ESPECIAL][Prod0_ID772] codigos_barras actualizado correctamente: 195 2025-10-07 17:03:15 - [Stock Update ESPECIAL][Prod0_ID772] resumen_productos actualizado correctamente: 195 2025-10-07 17:03:15 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 772, Cantidad: 5, Venta ID: 691 2025-10-07 17:03:15 - [Movimiento Stock] Registrando movimiento para Producto ID: 772, Cantidad: 5 2025-10-07 17:03:15 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 772 2025-10-07 17:03:15 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 17:03:15 - [DTE Detalle][Prod0_ID772] Agregado a venta_detalles_para_api con formato original 2025-10-07 17:03:15 - --- Fin procesamiento para Prod0_ID772 --- 2025-10-07 17:03:15 - Detalles de venta insertados y stock actualizado. 2025-10-07 17:03:15 - No se intentó la emisión DTE para Venta ID: 691 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 17:03:15 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 691 2025-10-07 17:03:15 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 17:03:15 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 17:03:15 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 17:03:15 - Transacción completada con éxito para Venta ID: 691 2025-10-07 17:03:15 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 17:03:15 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:03:39 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:03:39 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:03:39 - Datos recibidos: {"productos":[{"id":772,"codigo":"BER-772","cantidad":5,"precio":"2000.00","subtotal":10000,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":10000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:03:39 - Content-Type: application/json 2025-10-07 17:03:39 - Resultado de json_decode: OK 2025-10-07 17:03:39 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:03:39 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:03:39 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:03:39 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:03:39 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:03:39 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:03:39 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:03:39 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:03:39 - Venta insertada con ID: 692 2025-10-07 17:03:39 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:03:39 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 692) 2025-10-07 17:03:39 - Token de vista generado: f4e9c701db3f3a55a6960b4c699f3ac9 2025-10-07 17:03:39 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:03:39 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:03:39 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:03:39 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:03:39 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:03:39 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:03:39 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:03:39 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:03:39 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:03:39 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:03:39 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:03:39 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:03:39 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:03:39 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:03:39 - --- Iniciando procesamiento para Prod0_ID772 --- 2025-10-07 17:03:39 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID772] Params: {"pid":772} 2025-10-07 17:03:39 - [Stock Check] Producto ID: 772, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:03:39 - [LOTE ESPECÍFICO][Prod0_ID772] Usando LOTE2 (ID: 192) con 100 unidades 2025-10-07 17:03:39 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID772] Lote ID: 192, Cantidad reducida: 5 2025-10-07 17:03:39 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID772] Params: cantidad=5, peso=, lote_id=192 2025-10-07 17:03:39 - [Stock Process][Prod0_ID772] Procesando stock con cantidad: 5 2025-10-07 17:03:39 - [Stock ESPECIAL][Prod0_ID772] Procesando producto especial con códigos de barras 2025-10-07 17:03:39 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID772] Params: {"pid":"772","codigo":"BER-772"} 2025-10-07 17:03:39 - [Stock Especial][Prod0_ID772] Producto especial - solo código de barras genérico: 172 2025-10-07 17:03:39 - [Stock Especial][Prod0_ID772] Actualizado código escaneado ID: 172. Descontado: 5 2025-10-07 17:03:39 - [Stock Strategy ESPECIAL][Prod0_ID772] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 5 2025-10-07 17:03:39 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 17:03:39 - [Stock Update ESPECIAL][Prod0_ID772] Stock anterior: 200, cantidad a restar: 5, stock nuevo: 195 2025-10-07 17:03:39 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando productos.stock manualmente 2025-10-07 17:03:39 - [Stock Update ESPECIAL][Prod0_ID772] productos.stock actualizado correctamente: 200 -> 195 2025-10-07 17:03:39 - [Stock Update ESPECIAL][Prod0_ID772] inventario.cantidad actualizado correctamente: 195 2025-10-07 17:03:39 - [Stock Update ESPECIAL][Prod0_ID772] Código genérico capturado: ID 172 2025-10-07 17:03:39 - [Stock Update ESPECIAL][Prod0_ID772] codigos_barras actualizado correctamente: 195 2025-10-07 17:03:39 - [Stock Update ESPECIAL][Prod0_ID772] resumen_productos actualizado correctamente: 195 2025-10-07 17:03:39 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 772, Cantidad: 5, Venta ID: 692 2025-10-07 17:03:39 - [Movimiento Stock] Registrando movimiento para Producto ID: 772, Cantidad: 5 2025-10-07 17:03:39 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 772 2025-10-07 17:03:39 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 17:03:39 - [DTE Detalle][Prod0_ID772] Agregado a venta_detalles_para_api con formato original 2025-10-07 17:03:39 - --- Fin procesamiento para Prod0_ID772 --- 2025-10-07 17:03:39 - Detalles de venta insertados y stock actualizado. 2025-10-07 17:03:39 - No se intentó la emisión DTE para Venta ID: 692 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 17:03:39 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 692 2025-10-07 17:03:39 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 17:03:39 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 17:03:39 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 17:03:39 - Transacción completada con éxito para Venta ID: 692 2025-10-07 17:03:39 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 17:03:39 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:03:48 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:03:48 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:03:48 - Datos recibidos: {"productos":[{"id":772,"codigo":"BER-772","cantidad":5,"precio":"2000.00","subtotal":10000,"es_busqueda_por_codigo":false}],"metodo_pago":"2","total":10000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:03:48 - Content-Type: application/json 2025-10-07 17:03:48 - Resultado de json_decode: OK 2025-10-07 17:03:48 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:03:48 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:03:48 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:03:48 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:03:48 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:03:48 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:03:48 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:03:48 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:03:48 - Venta insertada con ID: 693 2025-10-07 17:03:48 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:03:48 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 693) 2025-10-07 17:03:48 - Token de vista generado: f2f63df0f8096fc3b58a44fd3a37bedb 2025-10-07 17:03:48 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:03:48 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:03:48 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:03:48 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:03:48 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:03:48 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:03:48 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:03:48 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:03:48 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:03:48 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:03:48 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:03:48 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:03:48 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:03:48 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:03:48 - --- Iniciando procesamiento para Prod0_ID772 --- 2025-10-07 17:03:48 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID772] Params: {"pid":772} 2025-10-07 17:03:48 - [Stock Check] Producto ID: 772, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:03:48 - [LOTE ACTUALIZADO][Prod0_ID772] Lote ID: 191, Cantidad reducida: 5 2025-10-07 17:03:48 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID772] Params: cantidad=5, peso=, lote_id=191 2025-10-07 17:03:48 - [Stock Process][Prod0_ID772] Procesando stock con cantidad: 5 2025-10-07 17:03:48 - [Stock ESPECIAL][Prod0_ID772] Procesando producto especial con códigos de barras 2025-10-07 17:03:48 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID772] Params: {"pid":"772","codigo":"BER-772"} 2025-10-07 17:03:48 - [Stock Especial][Prod0_ID772] Producto especial - solo código de barras genérico: 172 2025-10-07 17:03:48 - [Stock Especial][Prod0_ID772] Actualizado código escaneado ID: 172. Descontado: 5 2025-10-07 17:03:48 - [Stock Strategy ESPECIAL][Prod0_ID772] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 5 2025-10-07 17:03:48 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 17:03:48 - [Stock Update ESPECIAL][Prod0_ID772] Stock anterior: 195, cantidad a restar: 5, stock nuevo: 190 2025-10-07 17:03:48 - [Stock Update ESPECIAL][Prod0_ID772] Actualizando productos.stock manualmente 2025-10-07 17:03:48 - [Stock Update ESPECIAL][Prod0_ID772] productos.stock actualizado correctamente: 195 -> 190 2025-10-07 17:03:48 - [Stock Update ESPECIAL][Prod0_ID772] inventario.cantidad actualizado correctamente: 190 2025-10-07 17:03:48 - [Stock Update ESPECIAL][Prod0_ID772] Código genérico capturado: ID 172 2025-10-07 17:03:48 - [Stock Update ESPECIAL][Prod0_ID772] codigos_barras actualizado correctamente: 190 2025-10-07 17:03:48 - [Stock Update ESPECIAL][Prod0_ID772] resumen_productos actualizado correctamente: 190 2025-10-07 17:03:48 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 772, Cantidad: 5, Venta ID: 693 2025-10-07 17:03:48 - [Movimiento Stock] Registrando movimiento para Producto ID: 772, Cantidad: 5 2025-10-07 17:03:48 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 772 2025-10-07 17:03:48 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 17:03:48 - [DTE Detalle][Prod0_ID772] Agregado a venta_detalles_para_api con formato original 2025-10-07 17:03:48 - --- Fin procesamiento para Prod0_ID772 --- 2025-10-07 17:03:48 - Detalles de venta insertados y stock actualizado. 2025-10-07 17:03:48 - No se intentó la emisión DTE para Venta ID: 693 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 17:03:48 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 693 2025-10-07 17:03:48 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 17:03:48 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 17:03:48 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 17:03:48 - Transacción completada con éxito para Venta ID: 693 2025-10-07 17:03:48 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 17:03:48 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:15:54 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:15:54 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:15:54 - Datos recibidos: {"productos":[{"id":773,"codigo":"17598679542925","cantidad":5,"precio":2000,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":173,"codigo":"17598679542925","tipo_codigo":"masivo","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":10000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:15:54 - Content-Type: application/json 2025-10-07 17:15:54 - Resultado de json_decode: OK 2025-10-07 17:15:54 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:15:54 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:15:54 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:15:54 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:15:54 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:15:54 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:15:54 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:15:54 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:15:54 - Venta insertada con ID: 694 2025-10-07 17:15:54 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:15:54 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 694) 2025-10-07 17:15:54 - Token de vista generado: aa881528422b1fb5c13c7828a6d51ba2 2025-10-07 17:15:54 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:15:54 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:15:54 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:15:54 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:15:54 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:15:54 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:15:54 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:15:54 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:15:54 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:15:54 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:15:54 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:15:54 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:15:54 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:15:54 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:15:54 - --- Iniciando procesamiento para Prod0_ID773 --- 2025-10-07 17:15:54 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID773] Params: {"pid":773} 2025-10-07 17:15:54 - [Stock Check] Producto ID: 773, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:15:54 - [WARNING LOTE][Prod0_ID773] No se encontró lote disponible para producto 773 2025-10-07 17:15:54 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID773] Params: cantidad=5, peso=, lote_id= 2025-10-07 17:15:54 - [Stock Process][Prod0_ID773] Procesando stock con cantidad: 5 2025-10-07 17:15:54 - [Stock Masivo][Prod0_ID773] Aplicando lógica de UPDATE. 2025-10-07 17:15:54 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID773] Params: {"pid":"773"} 2025-10-07 17:15:54 - [Stock Masivo][Prod0_ID773] Producto masivo - solo código de barras principal: 173 2025-10-07 17:15:54 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID773] Params: {"cant":"5","id":173} 2025-10-07 17:15:54 - [Stock Masivo][Prod0_ID773] Stock actualizado para ID: 173. Descontado: 5. 2025-10-07 17:15:54 - [Stock Strategy NORMAL][Prod0_ID773] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 17:15:54 - [Stock Update NORMAL][Prod0_ID773] codigos_barras ya actualizado en sección anterior 2025-10-07 17:15:54 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 773, Cantidad: 5, Venta ID: 694 2025-10-07 17:15:54 - [Movimiento Stock] Registrando movimiento para Producto ID: 773, Cantidad: 5 2025-10-07 17:15:54 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 773 2025-10-07 17:15:54 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 17:15:54 - [Stock Strategy NORMAL][Prod0_ID773] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 17:15:54 - [DTE Detalle][Prod0_ID773] Agregado a venta_detalles_para_api con formato original 2025-10-07 17:15:54 - --- Fin procesamiento para Prod0_ID773 --- 2025-10-07 17:15:54 - Detalles de venta insertados y stock actualizado. 2025-10-07 17:15:54 - No se intentó la emisión DTE para Venta ID: 694 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 17:15:54 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 694 2025-10-07 17:15:54 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 17:15:54 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 17:15:54 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 17:15:54 - Transacción completada con éxito para Venta ID: 694 2025-10-07 17:15:54 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 17:15:54 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:21:14 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:21:14 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:21:14 - Datos recibidos: {"productos":[{"id":774,"codigo":"17598683968982","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":22500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:21:14 - Content-Type: application/json 2025-10-07 17:21:14 - Resultado de json_decode: OK 2025-10-07 17:21:14 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:21:14 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:21:14 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:21:14 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:21:14 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:21:14 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:21:14 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:21:14 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:21:14 - Venta insertada con ID: 695 2025-10-07 17:21:14 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:21:14 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 695) 2025-10-07 17:21:14 - Token de vista generado: 0083b1493dc1e646a7ae1e8f22e4845d 2025-10-07 17:21:14 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:21:14 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:21:14 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:21:14 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:21:14 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:21:14 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:21:14 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:21:14 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:21:14 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:21:14 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:21:14 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:21:14 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:21:14 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:21:14 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:21:14 - --- Iniciando procesamiento para Prod0_ID774 --- 2025-10-07 17:21:14 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID774] Params: {"pid":774} 2025-10-07 17:21:14 - [Stock Check] Producto ID: 774, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:21:14 - [WARNING LOTE][Prod0_ID774] No se encontró lote disponible para producto 774 2025-10-07 17:21:14 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID774] Params: cantidad=5, peso=, lote_id= 2025-10-07 17:21:14 - [Stock Process][Prod0_ID774] Procesando stock con cantidad: 5 2025-10-07 17:21:14 - [Stock manual][Prod0_ID774] Aplicando lógica basada en cantidad. 2025-10-07 17:21:14 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID774] Params: {"pid":"774","codigo":"17598683968982"} 2025-10-07 17:21:14 - [Stock Manual][Prod0_ID774] Producto manual - solo código de barras específico: 174 2025-10-07 17:21:14 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID774_Esc] Params: {"cant":"5","id":174} 2025-10-07 17:21:14 - [Stock manual][Prod0_ID774] Actualizado código escaneado ID: 174. Descontado: 5 2025-10-07 17:21:14 - [Stock Strategy NORMAL][Prod0_ID774] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 17:21:14 - [Stock Update NORMAL][Prod0_ID774] codigos_barras ya actualizado en sección anterior 2025-10-07 17:21:14 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 774, Cantidad: 5, Venta ID: 695 2025-10-07 17:21:14 - [Movimiento Stock] Registrando movimiento para Producto ID: 774, Cantidad: 5 2025-10-07 17:21:14 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 774 2025-10-07 17:21:14 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 17:21:14 - [Stock Strategy NORMAL][Prod0_ID774] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 17:21:14 - [DTE Detalle][Prod0_ID774] Agregado a venta_detalles_para_api con formato original 2025-10-07 17:21:14 - --- Fin procesamiento para Prod0_ID774 --- 2025-10-07 17:21:14 - Detalles de venta insertados y stock actualizado. 2025-10-07 17:21:14 - No se intentó la emisión DTE para Venta ID: 695 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 17:21:14 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 695 2025-10-07 17:21:14 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 17:21:14 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 17:21:14 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 17:21:14 - Transacción completada con éxito para Venta ID: 695 2025-10-07 17:21:14 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 17:21:14 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:36:07 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:36:07 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:36:07 - Datos recibidos: {"productos":[{"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":22500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:36:07 - Content-Type: application/json 2025-10-07 17:36:07 - Resultado de json_decode: OK 2025-10-07 17:36:07 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:36:07 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:36:07 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:36:07 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:36:07 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:36:07 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:36:07 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:36:07 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:36:07 - Venta insertada con ID: 696 2025-10-07 17:36:07 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:36:07 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 696) 2025-10-07 17:36:07 - Token de vista generado: 006ed4a65732cd10ce3c89a6914a11f9 2025-10-07 17:36:07 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:36:07 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:36:07 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:36:07 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:36:07 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:36:07 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:36:07 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:36:07 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:36:07 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:36:07 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:36:07 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:36:07 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:36:07 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:36:07 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:36:07 - --- Iniciando procesamiento para Prod0_ID774 --- 2025-10-07 17:36:07 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID774] Params: {"pid":774} 2025-10-07 17:36:07 - [Stock Check] Producto ID: 774, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:36:07 - [WARNING LOTE][Prod0_ID774] No se encontró lote disponible para producto 774 2025-10-07 17:36:07 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID774] Params: cantidad=5, peso=, lote_id= 2025-10-07 17:36:07 - [Stock Process][Prod0_ID774] Procesando stock con cantidad: 5 2025-10-07 17:36:07 - [Stock manual][Prod0_ID774] Aplicando lógica basada en cantidad. 2025-10-07 17:36:07 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID774] Params: {"pid":"774","codigo":"17598683968092"} 2025-10-07 17:36:07 - [Stock Manual][Prod0_ID774] Producto manual - solo código de barras específico: 175 2025-10-07 17:36:07 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID774_Esc] Params: {"cant":"5","id":175} 2025-10-07 17:36:07 - [Stock manual][Prod0_ID774] Actualizado código escaneado ID: 175. Descontado: 5 2025-10-07 17:36:07 - [Stock Strategy NORMAL][Prod0_ID774] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 17:36:07 - [Stock Update NORMAL][Prod0_ID774] codigos_barras ya actualizado en sección anterior 2025-10-07 17:36:07 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 774, Cantidad: 5, Venta ID: 696 2025-10-07 17:36:07 - [Movimiento Stock] Registrando movimiento para Producto ID: 774, Cantidad: 5 2025-10-07 17:36:07 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 774 2025-10-07 17:36:07 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 17:36:07 - [Stock Strategy NORMAL][Prod0_ID774] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 17:36:07 - [DTE Detalle][Prod0_ID774] Agregado a venta_detalles_para_api con formato original 2025-10-07 17:36:07 - --- Fin procesamiento para Prod0_ID774 --- 2025-10-07 17:36:07 - Detalles de venta insertados y stock actualizado. 2025-10-07 17:36:07 - No se intentó la emisión DTE para Venta ID: 696 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 17:36:07 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 696 2025-10-07 17:36:07 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 17:36:07 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 17:36:07 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 17:36:07 - Transacción completada con éxito para Venta ID: 696 2025-10-07 17:36:07 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 17:36:07 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:39:14 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:39:14 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:39:14 - Datos recibidos: {"productos":[{"id":774,"codigo":"17598683968092","cantidad":6,"precio":4500,"subtotal":27000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":27000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:39:14 - Content-Type: application/json 2025-10-07 17:39:14 - Resultado de json_decode: OK 2025-10-07 17:39:14 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:39:14 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:39:14 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:39:14 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:39:14 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:39:14 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:39:14 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:39:14 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:39:14 - Venta insertada con ID: 697 2025-10-07 17:39:14 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:39:14 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 697) 2025-10-07 17:39:14 - Token de vista generado: 39e5be848f3469cefffcf4f16fab71c7 2025-10-07 17:39:14 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:39:14 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:39:14 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:39:14 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:39:14 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:39:14 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:39:14 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:39:14 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:39:14 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:39:14 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:39:14 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:39:14 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:39:14 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:39:14 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:39:14 - --- Iniciando procesamiento para Prod0_ID774 --- 2025-10-07 17:39:14 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID774] Params: {"pid":774} 2025-10-07 17:39:14 - [Stock Check] Producto ID: 774, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:39:14 - [WARNING LOTE][Prod0_ID774] No se encontró lote disponible para producto 774 2025-10-07 17:39:14 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID774] Params: cantidad=6, peso=, lote_id= 2025-10-07 17:39:14 - [Stock Process][Prod0_ID774] Procesando stock con cantidad: 6 2025-10-07 17:39:14 - [Stock manual][Prod0_ID774] Aplicando lógica basada en cantidad. 2025-10-07 17:39:14 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID774] Params: {"pid":"774","codigo":"17598683968092"} 2025-10-07 17:39:14 - [Stock Manual][Prod0_ID774] Producto manual - solo código de barras específico: 175 2025-10-07 17:39:14 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID774_Esc] Params: {"cant":"6","id":175} 2025-10-07 17:39:14 - [Stock manual][Prod0_ID774] Actualizado código escaneado ID: 175. Descontado: 6 2025-10-07 17:39:14 - [Stock Strategy NORMAL][Prod0_ID774] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 6 2025-10-07 17:39:14 - [Stock Update NORMAL][Prod0_ID774] codigos_barras ya actualizado en sección anterior 2025-10-07 17:39:14 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 774, Cantidad: 6, Venta ID: 697 2025-10-07 17:39:14 - [Movimiento Stock] Registrando movimiento para Producto ID: 774, Cantidad: 6 2025-10-07 17:39:14 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 774 2025-10-07 17:39:14 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 17:39:14 - [Stock Strategy NORMAL][Prod0_ID774] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 17:39:14 - [DTE Detalle][Prod0_ID774] Agregado a venta_detalles_para_api con formato original 2025-10-07 17:39:14 - --- Fin procesamiento para Prod0_ID774 --- 2025-10-07 17:39:14 - Detalles de venta insertados y stock actualizado. 2025-10-07 17:39:14 - No se intentó la emisión DTE para Venta ID: 697 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 17:39:14 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 697 2025-10-07 17:39:14 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 17:39:14 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 17:39:14 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 17:39:14 - Transacción completada con éxito para Venta ID: 697 2025-10-07 17:39:14 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 17:39:14 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:44:06 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:44:06 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:44:06 - Datos recibidos: {"productos":[{"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"94.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":22500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:44:06 - Content-Type: application/json 2025-10-07 17:44:06 - Resultado de json_decode: OK 2025-10-07 17:44:06 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:44:06 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:44:06 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:44:06 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:44:06 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:44:06 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:44:06 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:44:06 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:44:06 - Venta insertada con ID: 698 2025-10-07 17:44:06 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:44:06 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 698) 2025-10-07 17:44:06 - Token de vista generado: 0d48c86d4e4ace6e17c505f1d2d52195 2025-10-07 17:44:06 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:44:06 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:44:06 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:44:06 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:44:06 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:44:06 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:44:06 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:44:06 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:44:06 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:44:06 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:44:06 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:44:06 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:44:06 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:44:06 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:44:06 - --- Iniciando procesamiento para Prod0_ID774 --- 2025-10-07 17:44:06 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID774] Params: {"pid":774} 2025-10-07 17:44:06 - [Stock Check] Producto ID: 774, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:44:06 - [WARNING LOTE][Prod0_ID774] No se encontró lote disponible para producto 774 2025-10-07 17:44:06 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID774] Params: cantidad=5, peso=, lote_id= 2025-10-07 17:44:06 - [Stock Process][Prod0_ID774] Procesando stock con cantidad: 5 2025-10-07 17:44:06 - [Stock manual][Prod0_ID774] Aplicando lógica basada en cantidad. 2025-10-07 17:44:06 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID774] Params: {"pid":"774","codigo":"17598683968092"} 2025-10-07 17:44:06 - [Stock Manual][Prod0_ID774] Producto manual - código de barras específico: 175, numero_lote: LOTE2 2025-10-07 17:44:06 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID774_Esc] Params: {"cant":"5","id":175} 2025-10-07 17:44:06 - [Stock manual][Prod0_ID774] Actualizado código escaneado ID: 175. Descontado: 5 2025-10-07 17:44:06 - [Stock Strategy NORMAL][Prod0_ID774] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 17:44:06 - [Stock Update NORMAL][Prod0_ID774] codigos_barras ya actualizado en sección anterior 2025-10-07 17:44:06 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 774, Cantidad: 5, Venta ID: 698 2025-10-07 17:44:06 - [Movimiento Stock] Registrando movimiento para Producto ID: 774, Cantidad: 5 2025-10-07 17:44:06 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 774 2025-10-07 17:44:06 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 17:44:06 - [Stock Strategy NORMAL][Prod0_ID774] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 17:44:06 - [DTE Detalle][Prod0_ID774] Agregado a venta_detalles_para_api con formato original 2025-10-07 17:44:06 - --- Fin procesamiento para Prod0_ID774 --- 2025-10-07 17:44:06 - Detalles de venta insertados y stock actualizado. 2025-10-07 17:44:06 - No se intentó la emisión DTE para Venta ID: 698 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 17:44:06 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 698 2025-10-07 17:44:06 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 17:44:06 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 17:44:06 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 17:44:06 - Transacción completada con éxito para Venta ID: 698 2025-10-07 17:44:06 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 17:44:06 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:46:50 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:46:50 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:46:50 - Datos recibidos: {"productos":[{"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"89.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":22500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:46:50 - Content-Type: application/json 2025-10-07 17:46:50 - Resultado de json_decode: OK 2025-10-07 17:46:50 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:46:50 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:46:50 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:46:50 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:46:50 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:46:50 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:46:50 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:46:50 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:46:50 - Venta insertada con ID: 699 2025-10-07 17:46:50 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:46:50 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 699) 2025-10-07 17:46:50 - Token de vista generado: 71c72e3b5afaaec2d5eebbbf431226fa 2025-10-07 17:46:50 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:46:50 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:46:50 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:46:50 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:46:50 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:46:50 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:46:50 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:46:50 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:46:50 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:46:50 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:46:50 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:46:50 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:46:50 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:46:50 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:46:50 - --- Iniciando procesamiento para Prod0_ID774 --- 2025-10-07 17:46:50 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID774] Params: {"pid":774} 2025-10-07 17:46:50 - [Stock Check] Producto ID: 774, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:46:50 - [WARNING LOTE][Prod0_ID774] No se encontró lote disponible para producto 774 2025-10-07 17:46:50 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID774] Params: cantidad=5, peso=, lote_id= 2025-10-07 17:46:50 - [Stock Process][Prod0_ID774] Procesando stock con cantidad: 5 2025-10-07 17:46:50 - [Stock manual][Prod0_ID774] Aplicando lógica basada en cantidad. 2025-10-07 17:46:50 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID774] Params: {"pid":"774","codigo":"17598683968092"} 2025-10-07 17:46:50 - [Stock Manual][Prod0_ID774] Producto manual - código de barras específico: 175, numero_lote: LOTE2 2025-10-07 17:46:50 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID774_Esc] Params: {"cant":"5","id":175} 2025-10-07 17:46:50 - [Stock manual][Prod0_ID774] Actualizado código escaneado ID: 175. Descontado: 5 2025-10-07 17:46:50 - [Stock Strategy NORMAL][Prod0_ID774] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 17:46:50 - [Stock Update NORMAL][Prod0_ID774] codigos_barras ya actualizado en sección anterior 2025-10-07 17:46:50 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 774, Cantidad: 5, Venta ID: 699 2025-10-07 17:46:50 - [Movimiento Stock] Registrando movimiento para Producto ID: 774, Cantidad: 5 2025-10-07 17:46:50 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 774 2025-10-07 17:46:50 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 17:46:50 - [Stock Strategy NORMAL][Prod0_ID774] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 17:46:50 - [DTE Detalle][Prod0_ID774] Agregado a venta_detalles_para_api con formato original 2025-10-07 17:46:50 - --- Fin procesamiento para Prod0_ID774 --- 2025-10-07 17:46:50 - Detalles de venta insertados y stock actualizado. 2025-10-07 17:46:50 - No se intentó la emisión DTE para Venta ID: 699 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 17:46:50 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 699 2025-10-07 17:46:50 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 17:46:50 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 17:46:50 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 17:46:50 - Transacción completada con éxito para Venta ID: 699 2025-10-07 17:46:50 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 17:46:50 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:49:48 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:49:48 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:49:48 - Datos recibidos: {"productos":[{"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"84.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":22500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:49:48 - Content-Type: application/json 2025-10-07 17:49:48 - Resultado de json_decode: OK 2025-10-07 17:49:48 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:49:48 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:49:48 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:49:48 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:49:48 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:49:48 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:49:48 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:49:48 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:49:48 - Venta insertada con ID: 700 2025-10-07 17:49:48 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:49:48 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 700) 2025-10-07 17:49:48 - Token de vista generado: b2a3ee9d8e3d3fceea4badb1b849e374 2025-10-07 17:49:48 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:49:48 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:49:48 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:49:48 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:49:48 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:49:48 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:49:48 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:49:48 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:49:48 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:49:48 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:49:48 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:49:48 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:49:48 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:49:48 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:49:48 - --- Iniciando procesamiento para Prod0_ID774 --- 2025-10-07 17:49:48 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID774] Params: {"pid":774} 2025-10-07 17:49:48 - [Stock Check] Producto ID: 774, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:49:48 - [WARNING LOTE][Prod0_ID774] No se encontró lote disponible para producto 774 2025-10-07 17:49:48 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID774] Params: cantidad=5, peso=, lote_id= 2025-10-07 17:49:48 - [Stock Process][Prod0_ID774] Procesando stock con cantidad: 5 2025-10-07 17:49:48 - [Stock manual][Prod0_ID774] Aplicando lógica basada en cantidad. 2025-10-07 17:49:48 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID774] Params: {"pid":"774","codigo":"17598683968092"} 2025-10-07 17:49:48 - [Stock Manual][Prod0_ID774] Producto manual - código de barras específico: 175, numero_lote: LOTE2 2025-10-07 17:49:48 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID774_Esc] Params: {"cant":"5","id":175} 2025-10-07 17:49:48 - [Stock manual][Prod0_ID774] Actualizado código escaneado ID: 175. Descontado: 5 2025-10-07 17:49:48 - [Stock Strategy NORMAL][Prod0_ID774] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 17:49:48 - [Stock Update NORMAL][Prod0_ID774] codigos_barras ya actualizado en sección anterior 2025-10-07 17:49:48 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 774, Cantidad: 5, Venta ID: 700 2025-10-07 17:49:48 - [Movimiento Stock] Registrando movimiento para Producto ID: 774, Cantidad: 5 2025-10-07 17:49:48 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 774 2025-10-07 17:49:48 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 17:49:48 - [Stock Strategy NORMAL][Prod0_ID774] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 17:49:48 - [DTE Detalle][Prod0_ID774] Agregado a venta_detalles_para_api con formato original 2025-10-07 17:49:48 - --- Fin procesamiento para Prod0_ID774 --- 2025-10-07 17:49:48 - Detalles de venta insertados y stock actualizado. 2025-10-07 17:49:48 - No se intentó la emisión DTE para Venta ID: 700 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 17:49:48 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 700 2025-10-07 17:49:48 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 17:49:48 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 17:49:48 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 17:49:48 - Transacción completada con éxito para Venta ID: 700 2025-10-07 17:49:48 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 17:49:48 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:56:03 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:56:03 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:56:03 - Datos recibidos: {"productos":[{"id":774,"codigo":"17598683968092","cantidad":6,"precio":4500,"subtotal":27000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"79.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":27000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:56:03 - Content-Type: application/json 2025-10-07 17:56:03 - Resultado de json_decode: OK 2025-10-07 17:56:03 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:56:03 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:56:03 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:56:03 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:56:03 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:56:03 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:56:03 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:56:03 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:56:03 - Venta insertada con ID: 701 2025-10-07 17:56:03 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:56:03 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 701) 2025-10-07 17:56:03 - Token de vista generado: 1b28b51cbab7afeb5c3ee8217ddf14f2 2025-10-07 17:56:03 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:56:03 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:56:03 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:56:03 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:56:03 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:56:03 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:56:03 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:56:03 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:56:03 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:56:03 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:56:03 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:56:03 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:56:03 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:56:03 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:56:03 - --- Iniciando procesamiento para Prod0_ID774 --- 2025-10-07 17:56:03 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID774] Params: {"pid":774} 2025-10-07 17:56:03 - [Stock Check] Producto ID: 774, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:56:03 - [DEBUG PRODUCTO][Prod0_ID774] Datos recibidos: {"id":774,"codigo":"17598683968092","cantidad":6,"precio":4500,"subtotal":27000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"79.00","fecha_vencimiento":null}]} 2025-10-07 17:56:03 - [LOTE ESPECÍFICO NORMAL][Prod0_ID774] Usando LOTE2 (numero_lote: LOTE2) con 79.00 unidades 2025-10-07 17:56:03 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID774] Params: cantidad=6, peso=, lote_id=LOTE2 2025-10-07 17:56:03 - ERROR FATAL: Error al procesar la venta: SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect integer value: 'LOTE2' for column `sgb_db`.`detalle_ventas`.`lote_id` at row 1\nLínea: 723\nArchivo: /var/www/html/SGB/negocio/venta/procesar_venta.php 2025-10-07 17:56:03 - [Transaction] *** EJECUTANDO ROLLBACK DEBIDO A ERROR *** 2025-10-07 17:56:03 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:56:40 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:56:40 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:56:40 - Datos recibidos: {"productos":[{"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"79.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":22500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:56:40 - Content-Type: application/json 2025-10-07 17:56:40 - Resultado de json_decode: OK 2025-10-07 17:56:40 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:56:40 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:56:40 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:56:40 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:56:40 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:56:40 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:56:40 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:56:40 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:56:40 - Venta insertada con ID: 702 2025-10-07 17:56:40 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:56:40 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 702) 2025-10-07 17:56:40 - Token de vista generado: 903dea5ab6d195b0452310b348f883d1 2025-10-07 17:56:40 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:56:40 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:56:40 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:56:40 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:56:40 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:56:40 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:56:40 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:56:40 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:56:40 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:56:40 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:56:40 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:56:40 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:56:40 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:56:40 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:56:40 - --- Iniciando procesamiento para Prod0_ID774 --- 2025-10-07 17:56:40 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID774] Params: {"pid":774} 2025-10-07 17:56:40 - [Stock Check] Producto ID: 774, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:56:40 - [DEBUG PRODUCTO][Prod0_ID774] Datos recibidos: {"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"79.00","fecha_vencimiento":null}]} 2025-10-07 17:56:40 - [LOTE ESPECÍFICO NORMAL][Prod0_ID774] Usando LOTE2 (codigo_barras_id: 175) con 79.00 unidades 2025-10-07 17:56:40 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID774] Params: cantidad=5, peso=, lote_id=175 2025-10-07 17:56:40 - [Stock Process][Prod0_ID774] Procesando stock con cantidad: 5 2025-10-07 17:56:40 - [Stock manual][Prod0_ID774] Aplicando lógica basada en cantidad. 2025-10-07 17:56:40 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID774] Params: {"pid":"774","codigo":"17598683968092"} 2025-10-07 17:56:40 - [Stock Manual][Prod0_ID774] Producto manual - código de barras específico: 175, numero_lote: LOTE2 2025-10-07 17:56:40 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID774_Esc] Params: {"cant":"5","id":175} 2025-10-07 17:56:40 - [Stock manual][Prod0_ID774] Actualizado código escaneado ID: 175. Descontado: 5 2025-10-07 17:56:40 - [Stock Strategy NORMAL][Prod0_ID774] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 17:56:40 - [Stock Update NORMAL][Prod0_ID774] codigos_barras ya actualizado en sección anterior 2025-10-07 17:56:40 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 774, Cantidad: 5, Venta ID: 702 2025-10-07 17:56:40 - [Movimiento Stock] Registrando movimiento para Producto ID: 774, Cantidad: 5 2025-10-07 17:56:40 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 774 2025-10-07 17:56:40 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 17:56:40 - [Stock Strategy NORMAL][Prod0_ID774] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 17:56:40 - [DTE Detalle][Prod0_ID774] Agregado a venta_detalles_para_api con formato original 2025-10-07 17:56:40 - --- Fin procesamiento para Prod0_ID774 --- 2025-10-07 17:56:40 - Detalles de venta insertados y stock actualizado. 2025-10-07 17:56:40 - No se intentó la emisión DTE para Venta ID: 702 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 17:56:40 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 702 2025-10-07 17:56:40 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 17:56:40 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 17:56:40 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 17:56:40 - Transacción completada con éxito para Venta ID: 702 2025-10-07 17:56:40 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 17:56:40 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 17:58:25 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 17:58:25 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 17:58:25 - Datos recibidos: {"productos":[{"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"74.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":22500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 17:58:25 - Content-Type: application/json 2025-10-07 17:58:25 - Resultado de json_decode: OK 2025-10-07 17:58:25 - ID sesión de caja recibido en JSON: 19 2025-10-07 17:58:25 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 17:58:25 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 17:58:25 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 17:58:25 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 17:58:25 - Modo API DTE está INACTIVO según configuración. 2025-10-07 17:58:25 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 17:58:25 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 17:58:25 - Venta insertada con ID: 703 2025-10-07 17:58:25 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 17:58:25 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 703) 2025-10-07 17:58:25 - Token de vista generado: 01e6d48cf159765ecb5900807bb64ddf 2025-10-07 17:58:25 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 17:58:25 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 17:58:25 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 17:58:25 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 17:58:25 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 17:58:25 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 17:58:25 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:58:25 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:58:25 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:58:25 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:58:25 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 17:58:25 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 17:58:25 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 17:58:25 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 17:58:25 - --- Iniciando procesamiento para Prod0_ID774 --- 2025-10-07 17:58:25 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID774] Params: {"pid":774} 2025-10-07 17:58:25 - [Stock Check] Producto ID: 774, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 17:58:25 - [DEBUG PRODUCTO][Prod0_ID774] Datos recibidos: {"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"74.00","fecha_vencimiento":null}]} 2025-10-07 17:58:25 - [LOTE ESPECÍFICO NORMAL][Prod0_ID774] Usando LOTE2 (codigo_barras_id: 175) con 74.00 unidades 2025-10-07 17:58:25 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID774] Params: cantidad=5, peso=, lote_id=175 2025-10-07 17:58:25 - [Stock Process][Prod0_ID774] Procesando stock con cantidad: 5 2025-10-07 17:58:25 - [Stock manual][Prod0_ID774] Aplicando lógica basada en cantidad. 2025-10-07 17:58:25 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID774] Params: {"pid":"774","codigo":"17598683968092"} 2025-10-07 17:58:25 - [Stock Manual][Prod0_ID774] Producto manual - código de barras específico: 175, numero_lote: LOTE2 2025-10-07 17:58:25 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID774_Esc] Params: {"cant":"5","id":175} 2025-10-07 17:58:25 - [Stock manual][Prod0_ID774] Actualizado código escaneado ID: 175. Descontado: 5 2025-10-07 17:58:25 - [Stock Strategy NORMAL][Prod0_ID774] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 17:58:25 - [Stock Update NORMAL][Prod0_ID774] codigos_barras ya actualizado en sección anterior 2025-10-07 17:58:25 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 774, Cantidad: 5, Venta ID: 703 2025-10-07 17:58:25 - [Movimiento Stock] Registrando movimiento para Producto ID: 774, Cantidad: 5 2025-10-07 17:58:25 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 774 2025-10-07 17:58:25 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 17:58:25 - [Stock Strategy NORMAL][Prod0_ID774] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 17:58:25 - [DTE Detalle][Prod0_ID774] Agregado a venta_detalles_para_api con formato original 2025-10-07 17:58:25 - --- Fin procesamiento para Prod0_ID774 --- 2025-10-07 17:58:25 - Detalles de venta insertados y stock actualizado. 2025-10-07 17:58:25 - No se intentó la emisión DTE para Venta ID: 703 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 17:58:25 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 703 2025-10-07 17:58:25 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 17:58:25 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 17:58:25 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 17:58:25 - Transacción completada con éxito para Venta ID: 703 2025-10-07 17:58:25 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 17:58:25 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 19:14:34 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 19:14:34 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 19:14:34 - Datos recibidos: {"productos":[{"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"169.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"169.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":22500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 19:14:34 - Content-Type: application/json 2025-10-07 19:14:34 - Resultado de json_decode: OK 2025-10-07 19:14:34 - ID sesión de caja recibido en JSON: 19 2025-10-07 19:14:34 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 19:14:34 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 19:14:34 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 19:14:34 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 19:14:34 - Modo API DTE está INACTIVO según configuración. 2025-10-07 19:14:34 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 19:14:34 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 19:14:34 - Venta insertada con ID: 704 2025-10-07 19:14:34 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 19:14:34 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 704) 2025-10-07 19:14:34 - Token de vista generado: b86bc87ade6faf2d93bf705fcae6b1d7 2025-10-07 19:14:34 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 19:14:34 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 19:14:34 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 19:14:34 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 19:14:34 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 19:14:34 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 19:14:34 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:14:34 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:14:34 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:14:34 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:14:34 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 19:14:34 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:14:34 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 19:14:34 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:14:34 - --- Iniciando procesamiento para Prod0_ID774 --- 2025-10-07 19:14:34 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID774] Params: {"pid":774} 2025-10-07 19:14:34 - [Stock Check] Producto ID: 774, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:14:34 - [DEBUG PRODUCTO][Prod0_ID774] Datos recibidos: {"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"169.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"169.00","fecha_vencimiento":null}]} 2025-10-07 19:14:34 - [LOTE ESPECÍFICO NORMAL][Prod0_ID774] Usando LOTE2 (codigo_barras_id: 175) con 169.00 unidades 2025-10-07 19:14:34 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID774] Params: cantidad=5, peso=, lote_id=175 2025-10-07 19:14:34 - [Stock Process][Prod0_ID774] Procesando stock con cantidad: 5 2025-10-07 19:14:34 - [Stock manual][Prod0_ID774] Aplicando lógica basada en cantidad. 2025-10-07 19:14:34 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID774] Params: {"pid":"774","codigo":"17598683968092"} 2025-10-07 19:14:34 - [Stock Manual][Prod0_ID774] Producto manual - código de barras específico: 175, numero_lote: LOTE2 2025-10-07 19:14:34 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID774_Esc] Params: {"cant":"5","id":175} 2025-10-07 19:14:34 - [Stock manual][Prod0_ID774] Actualizado código escaneado ID: 175. Descontado: 5 2025-10-07 19:14:34 - [Stock Strategy NORMAL][Prod0_ID774] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 19:14:34 - [Stock Update NORMAL][Prod0_ID774] codigos_barras ya actualizado en sección anterior 2025-10-07 19:14:34 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 774, Cantidad: 5, Venta ID: 704 2025-10-07 19:14:34 - [Movimiento Stock] Registrando movimiento para Producto ID: 774, Cantidad: 5 2025-10-07 19:14:34 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 774 2025-10-07 19:14:34 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:14:34 - [Stock Strategy NORMAL][Prod0_ID774] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:14:34 - [DTE Detalle][Prod0_ID774] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:14:34 - --- Fin procesamiento para Prod0_ID774 --- 2025-10-07 19:14:34 - Detalles de venta insertados y stock actualizado. 2025-10-07 19:14:34 - No se intentó la emisión DTE para Venta ID: 704 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 19:14:34 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 704 2025-10-07 19:14:34 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 19:14:34 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 19:14:34 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 19:14:34 - Transacción completada con éxito para Venta ID: 704 2025-10-07 19:14:34 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 19:14:34 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 19:18:51 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 19:18:51 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 19:18:51 - Datos recibidos: {"productos":[{"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"338.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"338.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":22500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 19:18:51 - Content-Type: application/json 2025-10-07 19:18:51 - Resultado de json_decode: OK 2025-10-07 19:18:51 - ID sesión de caja recibido en JSON: 19 2025-10-07 19:18:51 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 19:18:51 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 19:18:51 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 19:18:51 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 19:18:51 - Modo API DTE está INACTIVO según configuración. 2025-10-07 19:18:51 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 19:18:51 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 19:18:51 - Venta insertada con ID: 705 2025-10-07 19:18:51 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 19:18:51 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 705) 2025-10-07 19:18:51 - Token de vista generado: 94d4edf87314632ccc54c86ef4a80585 2025-10-07 19:18:51 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 19:18:51 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 19:18:51 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 19:18:51 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 19:18:51 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 19:18:51 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 19:18:51 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:18:51 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:18:51 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:18:51 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:18:51 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 19:18:51 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:18:51 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 19:18:51 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:18:51 - --- Iniciando procesamiento para Prod0_ID774 --- 2025-10-07 19:18:51 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID774] Params: {"pid":774} 2025-10-07 19:18:51 - [Stock Check] Producto ID: 774, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:18:51 - [DEBUG PRODUCTO][Prod0_ID774] Datos recibidos: {"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"338.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"338.00","fecha_vencimiento":null}]} 2025-10-07 19:18:51 - [LOTE ESPECÍFICO NORMAL][Prod0_ID774] Usando LOTE2 (codigo_barras_id: 175) con 338.00 unidades 2025-10-07 19:18:51 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID774] Params: cantidad=5, peso=, lote_id=175 2025-10-07 19:18:51 - [Stock Process][Prod0_ID774] Procesando stock con cantidad: 5 2025-10-07 19:18:51 - [Stock manual][Prod0_ID774] Aplicando lógica basada en cantidad. 2025-10-07 19:18:51 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID774] Params: {"pid":"774","codigo":"17598683968092"} 2025-10-07 19:18:51 - [Stock Manual][Prod0_ID774] Producto manual - código de barras específico: 175, numero_lote: LOTE2 2025-10-07 19:18:51 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID774_Esc] Params: {"cant":"5","id":175} 2025-10-07 19:18:51 - [Stock manual][Prod0_ID774] Actualizado código escaneado ID: 175. Descontado: 5 2025-10-07 19:18:51 - [Stock Strategy NORMAL][Prod0_ID774] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 19:18:51 - [Stock Update NORMAL][Prod0_ID774] codigos_barras ya actualizado en sección anterior 2025-10-07 19:18:51 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 774, Cantidad: 5, Venta ID: 705 2025-10-07 19:18:51 - [Movimiento Stock] Registrando movimiento para Producto ID: 774, Cantidad: 5 2025-10-07 19:18:51 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 774 2025-10-07 19:18:51 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:18:51 - [Stock Strategy NORMAL][Prod0_ID774] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:18:51 - [DTE Detalle][Prod0_ID774] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:18:51 - --- Fin procesamiento para Prod0_ID774 --- 2025-10-07 19:18:51 - Detalles de venta insertados y stock actualizado. 2025-10-07 19:18:51 - No se intentó la emisión DTE para Venta ID: 705 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 19:18:51 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 705 2025-10-07 19:18:51 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 19:18:51 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 19:18:51 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 19:18:51 - Transacción completada con éxito para Venta ID: 705 2025-10-07 19:18:51 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 19:18:51 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 19:20:39 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 19:20:39 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 19:20:39 - Datos recibidos: {"productos":[{"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"676.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"676.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":22500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 19:20:39 - Content-Type: application/json 2025-10-07 19:20:39 - Resultado de json_decode: OK 2025-10-07 19:20:39 - ID sesión de caja recibido en JSON: 19 2025-10-07 19:20:39 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 19:20:39 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 19:20:39 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 19:20:39 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 19:20:39 - Modo API DTE está INACTIVO según configuración. 2025-10-07 19:20:39 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 19:20:39 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 19:20:39 - Venta insertada con ID: 706 2025-10-07 19:20:39 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 19:20:39 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 706) 2025-10-07 19:20:39 - Token de vista generado: e127469fd4cf7aaeb3fe3e2c6737979c 2025-10-07 19:20:39 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 19:20:39 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 19:20:39 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 19:20:39 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 19:20:39 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 19:20:39 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 19:20:39 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:20:39 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:20:39 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:20:39 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:20:39 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 19:20:39 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:20:39 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 19:20:39 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:20:39 - --- Iniciando procesamiento para Prod0_ID774 --- 2025-10-07 19:20:39 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID774] Params: {"pid":774} 2025-10-07 19:20:39 - [Stock Check] Producto ID: 774, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:20:39 - [DEBUG PRODUCTO][Prod0_ID774] Datos recibidos: {"id":774,"codigo":"17598683968092","cantidad":5,"precio":4500,"subtotal":22500,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":174,"codigo":"17598683968982","tipo_codigo":"manual","cantidad":"676.00","fecha_vencimiento":null},{"id":175,"codigo":"17598683968092","tipo_codigo":"manual","cantidad":"676.00","fecha_vencimiento":null}]} 2025-10-07 19:20:39 - [LOTE ESPECÍFICO NORMAL][Prod0_ID774] Usando LOTE2 (codigo_barras_id: 175) con 676.00 unidades 2025-10-07 19:20:39 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID774] Params: cantidad=5, peso=, lote_id=175 2025-10-07 19:20:39 - [Stock Process][Prod0_ID774] Procesando stock con cantidad: 5 2025-10-07 19:20:39 - [Stock manual][Prod0_ID774] Aplicando lógica basada en cantidad. 2025-10-07 19:20:39 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID774] Params: {"pid":"774","codigo":"17598683968092"} 2025-10-07 19:20:39 - [Stock Manual][Prod0_ID774] Producto manual - código de barras específico: 175, numero_lote: LOTE2 2025-10-07 19:20:39 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID774_Esc] Params: {"cant":"5","id":175} 2025-10-07 19:20:39 - [Stock manual][Prod0_ID774] Actualizado código escaneado ID: 175. Descontado: 5 2025-10-07 19:20:39 - [Stock Strategy NORMAL][Prod0_ID774] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 19:20:39 - [Stock Update NORMAL][Prod0_ID774] codigos_barras ya actualizado en sección anterior 2025-10-07 19:20:39 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 774, Cantidad: 5, Venta ID: 706 2025-10-07 19:20:39 - [Movimiento Stock] Registrando movimiento para Producto ID: 774, Cantidad: 5 2025-10-07 19:20:39 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 774 2025-10-07 19:20:39 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:20:39 - [Stock Strategy NORMAL][Prod0_ID774] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:20:39 - [DTE Detalle][Prod0_ID774] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:20:39 - --- Fin procesamiento para Prod0_ID774 --- 2025-10-07 19:20:39 - Detalles de venta insertados y stock actualizado. 2025-10-07 19:20:39 - No se intentó la emisión DTE para Venta ID: 706 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 19:20:39 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 706 2025-10-07 19:20:39 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 19:20:39 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 19:20:39 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 19:20:39 - Transacción completada con éxito para Venta ID: 706 2025-10-07 19:20:39 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 19:20:39 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 19:22:37 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 19:22:37 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 19:22:37 - Datos recibidos: {"productos":[{"id":775,"codigo":"17598756873946","cantidad":5,"precio":2000,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":10000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 19:22:37 - Content-Type: application/json 2025-10-07 19:22:37 - Resultado de json_decode: OK 2025-10-07 19:22:37 - ID sesión de caja recibido en JSON: 19 2025-10-07 19:22:37 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 19:22:37 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 19:22:37 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 19:22:37 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 19:22:37 - Modo API DTE está INACTIVO según configuración. 2025-10-07 19:22:37 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 19:22:37 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 19:22:37 - Venta insertada con ID: 707 2025-10-07 19:22:37 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 19:22:37 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 707) 2025-10-07 19:22:37 - Token de vista generado: 644de457506e3ca06dc14960fd2266d6 2025-10-07 19:22:37 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 19:22:37 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 19:22:37 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 19:22:37 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 19:22:37 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 19:22:37 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 19:22:37 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:22:37 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:22:37 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:22:37 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:22:37 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 19:22:37 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:22:37 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 19:22:37 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:22:37 - --- Iniciando procesamiento para Prod0_ID775 --- 2025-10-07 19:22:37 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID775] Params: {"pid":775} 2025-10-07 19:22:37 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:22:37 - [DEBUG PRODUCTO][Prod0_ID775] Datos recibidos: {"id":775,"codigo":"17598756873946","cantidad":5,"precio":2000,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-07 19:22:37 - [LOTE ESPECÍFICO NORMAL][Prod0_ID775] Usando LOTE2 (codigo_barras_id: 177) con 100.00 unidades 2025-10-07 19:22:37 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID775] Params: cantidad=5, peso=, lote_id=177 2025-10-07 19:22:37 - [Stock Process][Prod0_ID775] Procesando stock con cantidad: 5 2025-10-07 19:22:37 - [Stock manual][Prod0_ID775] Aplicando lógica basada en cantidad. 2025-10-07 19:22:37 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID775] Params: {"pid":"775","codigo":"17598756873946"} 2025-10-07 19:22:37 - [Stock Manual][Prod0_ID775] Producto manual - código de barras específico: 177, numero_lote: LOTE2 2025-10-07 19:22:37 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID775_Esc] Params: {"cant":"5","id":177} 2025-10-07 19:22:37 - [Stock manual][Prod0_ID775] Actualizado código escaneado ID: 177. Descontado: 5 2025-10-07 19:22:37 - [Stock Strategy NORMAL][Prod0_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 19:22:37 - [Stock Update NORMAL][Prod0_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 19:22:37 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 5, Venta ID: 707 2025-10-07 19:22:37 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 5 2025-10-07 19:22:37 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 19:22:37 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:22:37 - [Stock Strategy NORMAL][Prod0_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:22:37 - [DTE Detalle][Prod0_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:22:37 - --- Fin procesamiento para Prod0_ID775 --- 2025-10-07 19:22:37 - Detalles de venta insertados y stock actualizado. 2025-10-07 19:22:37 - No se intentó la emisión DTE para Venta ID: 707 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 19:22:37 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 707 2025-10-07 19:22:37 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 19:22:37 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 19:22:37 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 19:22:37 - Transacción completada con éxito para Venta ID: 707 2025-10-07 19:22:37 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 19:22:37 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 19:23:49 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 19:23:49 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 19:23:49 - Datos recibidos: {"productos":[{"id":775,"codigo":"17598756861805","cantidad":50,"precio":2000,"subtotal":100000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":100000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 19:23:49 - Content-Type: application/json 2025-10-07 19:23:49 - Resultado de json_decode: OK 2025-10-07 19:23:49 - ID sesión de caja recibido en JSON: 19 2025-10-07 19:23:49 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 19:23:49 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 19:23:49 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 19:23:49 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 19:23:49 - Modo API DTE está INACTIVO según configuración. 2025-10-07 19:23:49 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 19:23:49 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 19:23:49 - Venta insertada con ID: 708 2025-10-07 19:23:49 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 19:23:49 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 708) 2025-10-07 19:23:49 - Token de vista generado: 54098a495d71c66ceac95e15accbdc43 2025-10-07 19:23:49 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 19:23:49 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 19:23:49 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 19:23:49 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 19:23:49 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 19:23:49 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 19:23:49 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:23:49 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:23:49 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:23:49 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:23:49 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 19:23:49 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:23:49 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 19:23:49 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:23:49 - --- Iniciando procesamiento para Prod0_ID775 --- 2025-10-07 19:23:49 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID775] Params: {"pid":775} 2025-10-07 19:23:49 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:23:49 - [DEBUG PRODUCTO][Prod0_ID775] Datos recibidos: {"id":775,"codigo":"17598756861805","cantidad":50,"precio":2000,"subtotal":100000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-07 19:23:49 - [WARNING LOTE][Prod0_ID775] No se encontró lote disponible para producto 775 2025-10-07 19:23:49 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID775] Params: cantidad=50, peso=, lote_id= 2025-10-07 19:23:49 - [Stock Process][Prod0_ID775] Procesando stock con cantidad: 50 2025-10-07 19:23:49 - [Stock manual][Prod0_ID775] Aplicando lógica basada en cantidad. 2025-10-07 19:23:49 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID775] Params: {"pid":"775","codigo":"17598756861805"} 2025-10-07 19:23:49 - [Stock Manual][Prod0_ID775] Producto manual - código de barras específico: 176, numero_lote: LOTE1 2025-10-07 19:23:49 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID775_Esc] Params: {"cant":"50","id":176} 2025-10-07 19:23:49 - [Stock manual][Prod0_ID775] Actualizado código escaneado ID: 176. Descontado: 50 2025-10-07 19:23:49 - [Stock Strategy NORMAL][Prod0_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 50 2025-10-07 19:23:49 - [Stock Update NORMAL][Prod0_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 19:23:49 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 50, Venta ID: 708 2025-10-07 19:23:49 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 50 2025-10-07 19:23:49 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 19:23:49 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:23:49 - [Stock Strategy NORMAL][Prod0_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:23:49 - [DTE Detalle][Prod0_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:23:49 - --- Fin procesamiento para Prod0_ID775 --- 2025-10-07 19:23:49 - Detalles de venta insertados y stock actualizado. 2025-10-07 19:23:49 - No se intentó la emisión DTE para Venta ID: 708 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 19:23:49 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 708 2025-10-07 19:23:49 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 19:23:49 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 19:23:49 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 19:23:49 - Transacción completada con éxito para Venta ID: 708 2025-10-07 19:23:49 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 19:23:49 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 19:26:21 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 19:26:21 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 19:26:21 - Datos recibidos: {"productos":[{"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"50.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 19:26:21 - Content-Type: application/json 2025-10-07 19:26:21 - Resultado de json_decode: OK 2025-10-07 19:26:21 - ID sesión de caja recibido en JSON: 19 2025-10-07 19:26:21 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 19:26:21 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 19:26:21 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 19:26:21 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 19:26:21 - Modo API DTE está INACTIVO según configuración. 2025-10-07 19:26:21 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 19:26:21 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 19:26:21 - Venta insertada con ID: 709 2025-10-07 19:26:21 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 19:26:21 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 709) 2025-10-07 19:26:21 - Token de vista generado: 6a132bc8e0f32d7d6a342ba14eed4b11 2025-10-07 19:26:21 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 19:26:21 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 19:26:21 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 19:26:21 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 19:26:21 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 19:26:21 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 19:26:21 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:26:21 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:26:21 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:26:21 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:26:21 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 19:26:21 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:26:21 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 19:26:21 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:26:21 - --- Iniciando procesamiento para Prod0_ID775 --- 2025-10-07 19:26:21 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID775] Params: {"pid":775} 2025-10-07 19:26:21 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:26:21 - [DEBUG PRODUCTO][Prod0_ID775] Datos recibidos: {"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"50.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-07 19:26:21 - [WARNING LOTE][Prod0_ID775] No se encontró lote disponible para producto 775 2025-10-07 19:26:21 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID775] Params: cantidad=1, peso=, lote_id= 2025-10-07 19:26:21 - [Stock Process][Prod0_ID775] Procesando stock con cantidad: 1 2025-10-07 19:26:21 - [Stock manual][Prod0_ID775] Aplicando lógica basada en cantidad. 2025-10-07 19:26:21 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID775] Params: {"pid":"775","codigo":"17598756861805"} 2025-10-07 19:26:21 - [Stock Manual][Prod0_ID775] Producto manual - código de barras específico: 176, numero_lote: LOTE1 2025-10-07 19:26:21 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID775_Esc] Params: {"cant":"1","id":176} 2025-10-07 19:26:21 - [Stock manual][Prod0_ID775] Actualizado código escaneado ID: 176. Descontado: 1 2025-10-07 19:26:21 - [Stock Strategy NORMAL][Prod0_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-07 19:26:21 - [Stock Update NORMAL][Prod0_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 19:26:21 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 1, Venta ID: 709 2025-10-07 19:26:21 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 1 2025-10-07 19:26:21 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 19:26:21 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:26:21 - [Stock Strategy NORMAL][Prod0_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:26:21 - [DTE Detalle][Prod0_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:26:21 - --- Fin procesamiento para Prod0_ID775 --- 2025-10-07 19:26:21 - Detalles de venta insertados y stock actualizado. 2025-10-07 19:26:21 - No se intentó la emisión DTE para Venta ID: 709 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 19:26:21 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 709 2025-10-07 19:26:21 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 19:26:21 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 19:26:21 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 19:26:21 - Transacción completada con éxito para Venta ID: 709 2025-10-07 19:26:21 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 19:26:21 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 19:34:05 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 19:34:05 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 19:34:05 - Datos recibidos: {"productos":[{"id":775,"codigo":"17598756861805","cantidad":5,"precio":2000,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":10000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 19:34:05 - Content-Type: application/json 2025-10-07 19:34:05 - Resultado de json_decode: OK 2025-10-07 19:34:05 - ID sesión de caja recibido en JSON: 19 2025-10-07 19:34:05 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 19:34:05 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 19:34:05 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 19:34:05 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 19:34:05 - Modo API DTE está INACTIVO según configuración. 2025-10-07 19:34:05 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 19:34:05 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 19:34:05 - Venta insertada con ID: 710 2025-10-07 19:34:05 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 19:34:05 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 710) 2025-10-07 19:34:05 - Token de vista generado: 4de0c9d95cc0ce2dc5d1c69e612582d4 2025-10-07 19:34:05 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 19:34:05 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 19:34:05 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 19:34:05 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 19:34:05 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 19:34:05 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 19:34:05 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 19:34:05 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:34:05 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:34:05 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:34:05 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:34:05 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 19:34:05 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:34:05 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 19:34:05 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:34:05 - --- Iniciando procesamiento para Prod0_ID775 --- 2025-10-07 19:34:05 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID775] Params: {"pid":775} 2025-10-07 19:34:05 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:34:05 - [DEBUG PRODUCTO][Prod0_ID775] Datos recibidos: {"id":775,"codigo":"17598756861805","cantidad":5,"precio":2000,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-07 19:34:05 - [LOTE NORMAL ACTUALIZADO][Prod0_ID775] Código ID: 176, Cantidad reducida: 5 2025-10-07 19:34:05 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID775] Params: cantidad=5, peso=, lote_id=176 2025-10-07 19:34:05 - [Stock Process][Prod0_ID775] Procesando stock con cantidad: 5 2025-10-07 19:34:05 - [Stock manual][Prod0_ID775] Aplicando lógica basada en cantidad. 2025-10-07 19:34:05 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID775] Params: {"pid":"775","codigo":"17598756861805"} 2025-10-07 19:34:05 - [Stock Manual][Prod0_ID775] Producto manual - código de barras específico: 176, numero_lote: LOTE1 2025-10-07 19:34:05 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID775_Esc] Params: {"cant":"5","id":176} 2025-10-07 19:34:05 - [Stock manual][Prod0_ID775] Actualizado código escaneado ID: 176. Descontado: 5 2025-10-07 19:34:05 - [Stock Strategy NORMAL][Prod0_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 19:34:05 - [Stock Update NORMAL][Prod0_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 19:34:05 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 5, Venta ID: 710 2025-10-07 19:34:05 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 5 2025-10-07 19:34:05 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 19:34:05 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:34:05 - [Stock Strategy NORMAL][Prod0_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:34:05 - [DTE Detalle][Prod0_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:34:05 - --- Fin procesamiento para Prod0_ID775 --- 2025-10-07 19:34:05 - Detalles de venta insertados y stock actualizado. 2025-10-07 19:34:05 - No se intentó la emisión DTE para Venta ID: 710 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 19:34:05 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 710 2025-10-07 19:34:05 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 19:34:05 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 19:34:05 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 19:34:05 - Transacción completada con éxito para Venta ID: 710 2025-10-07 19:34:05 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 19:34:05 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 19:36:58 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 19:36:58 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 19:36:58 - Datos recibidos: {"productos":[{"id":775,"codigo":"17598756861805","cantidad":6,"precio":2000,"subtotal":12000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":12000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 19:36:58 - Content-Type: application/json 2025-10-07 19:36:58 - Resultado de json_decode: OK 2025-10-07 19:36:58 - ID sesión de caja recibido en JSON: 19 2025-10-07 19:36:58 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 19:36:58 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 19:36:58 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 19:36:58 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 19:36:58 - Modo API DTE está INACTIVO según configuración. 2025-10-07 19:36:58 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 19:36:58 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 19:36:58 - Venta insertada con ID: 711 2025-10-07 19:36:58 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 19:36:58 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 711) 2025-10-07 19:36:58 - Token de vista generado: 9b17118438b7c811614b432e176e00c8 2025-10-07 19:36:58 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 19:36:58 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 19:36:58 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 19:36:58 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 19:36:58 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 19:36:58 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 19:36:58 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 19:36:58 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:36:58 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:36:58 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:36:58 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:36:58 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 19:36:58 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:36:58 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 19:36:58 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:36:58 - --- Iniciando procesamiento para Prod0_ID775 --- 2025-10-07 19:36:58 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID775] Params: {"pid":775} 2025-10-07 19:36:58 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:36:58 - [DEBUG PRODUCTO][Prod0_ID775] Datos recibidos: {"id":775,"codigo":"17598756861805","cantidad":6,"precio":2000,"subtotal":12000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-07 19:36:58 - [LOTE AUTO-DETECTADO][Prod0_ID775] Código escaneado 17598756861805 pertenece al LOTE1 (ID: 176) 2025-10-07 19:36:58 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID775] Params: cantidad=6, peso=, lote_id=176 2025-10-07 19:36:58 - [Stock Process][Prod0_ID775] Procesando stock con cantidad: 6 2025-10-07 19:36:58 - [Stock manual][Prod0_ID775] Aplicando lógica basada en cantidad. 2025-10-07 19:36:58 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID775] Params: {"pid":"775","codigo":"17598756861805"} 2025-10-07 19:36:58 - [Stock Manual][Prod0_ID775] Producto manual - código de barras específico: 176, numero_lote: LOTE1 2025-10-07 19:36:58 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID775_Esc] Params: {"cant":"6","id":176} 2025-10-07 19:36:58 - [Stock manual][Prod0_ID775] Actualizado código escaneado ID: 176. Descontado: 6 2025-10-07 19:36:58 - [Stock Strategy NORMAL][Prod0_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 6 2025-10-07 19:36:58 - [Stock Update NORMAL][Prod0_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 19:36:58 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 6, Venta ID: 711 2025-10-07 19:36:58 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 6 2025-10-07 19:36:58 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 19:36:58 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:36:58 - [Stock Strategy NORMAL][Prod0_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:36:58 - [DTE Detalle][Prod0_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:36:58 - --- Fin procesamiento para Prod0_ID775 --- 2025-10-07 19:36:58 - Detalles de venta insertados y stock actualizado. 2025-10-07 19:36:58 - No se intentó la emisión DTE para Venta ID: 711 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 19:36:58 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 711 2025-10-07 19:36:58 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 19:36:58 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 19:36:58 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 19:36:58 - Transacción completada con éxito para Venta ID: 711 2025-10-07 19:36:58 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 19:36:58 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 19:37:38 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 19:37:38 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 19:37:38 - Datos recibidos: {"productos":[{"id":775,"codigo":"17598756873946","cantidad":6,"precio":2000,"subtotal":12000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":12000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 19:37:38 - Content-Type: application/json 2025-10-07 19:37:38 - Resultado de json_decode: OK 2025-10-07 19:37:38 - ID sesión de caja recibido en JSON: 19 2025-10-07 19:37:38 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 19:37:38 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 19:37:38 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 19:37:38 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 19:37:38 - Modo API DTE está INACTIVO según configuración. 2025-10-07 19:37:38 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 19:37:38 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 19:37:38 - Venta insertada con ID: 712 2025-10-07 19:37:38 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 19:37:38 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 712) 2025-10-07 19:37:38 - Token de vista generado: f2ba624b684fe6ea011c7712aeb25a5e 2025-10-07 19:37:38 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 19:37:38 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 19:37:38 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 19:37:38 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 19:37:38 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 19:37:38 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 19:37:38 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 19:37:38 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:37:38 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:37:38 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:37:38 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:37:38 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 19:37:38 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:37:38 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 19:37:38 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:37:38 - --- Iniciando procesamiento para Prod0_ID775 --- 2025-10-07 19:37:38 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID775] Params: {"pid":775} 2025-10-07 19:37:38 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:37:38 - [DEBUG PRODUCTO][Prod0_ID775] Datos recibidos: {"id":775,"codigo":"17598756873946","cantidad":6,"precio":2000,"subtotal":12000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-07 19:37:38 - [LOTE ESPECÍFICO NORMAL][Prod0_ID775] Usando LOTE2 (codigo_barras_id: 177) con 100.00 unidades 2025-10-07 19:37:38 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID775] Params: cantidad=6, peso=, lote_id=177 2025-10-07 19:37:38 - [Stock Process][Prod0_ID775] Procesando stock con cantidad: 6 2025-10-07 19:37:38 - [Stock manual][Prod0_ID775] Aplicando lógica basada en cantidad. 2025-10-07 19:37:38 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID775] Params: {"pid":"775","codigo":"17598756873946"} 2025-10-07 19:37:38 - [Stock Manual][Prod0_ID775] Producto manual - código de barras específico: 177, numero_lote: LOTE2 2025-10-07 19:37:38 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID775_Esc] Params: {"cant":"6","id":177} 2025-10-07 19:37:38 - [Stock manual][Prod0_ID775] Actualizado código escaneado ID: 177. Descontado: 6 2025-10-07 19:37:38 - [Stock Strategy NORMAL][Prod0_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 6 2025-10-07 19:37:38 - [Stock Update NORMAL][Prod0_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 19:37:38 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 6, Venta ID: 712 2025-10-07 19:37:38 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 6 2025-10-07 19:37:38 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 19:37:38 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:37:38 - [Stock Strategy NORMAL][Prod0_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:37:38 - [DTE Detalle][Prod0_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:37:38 - --- Fin procesamiento para Prod0_ID775 --- 2025-10-07 19:37:38 - Detalles de venta insertados y stock actualizado. 2025-10-07 19:37:38 - No se intentó la emisión DTE para Venta ID: 712 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 19:37:38 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 712 2025-10-07 19:37:38 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 19:37:38 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 19:37:38 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 19:37:38 - Transacción completada con éxito para Venta ID: 712 2025-10-07 19:37:38 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 19:37:38 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 19:38:45 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 19:38:45 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 19:38:45 - Datos recibidos: {"productos":[{"id":775,"codigo":"17598756861805","cantidad":2,"precio":2000,"subtotal":4000,"es_busqueda_por_codigo":true,"tipo_codigo":"manual","codigo_barras_id":176},{"id":775,"codigo":"17598756873946","cantidad":2,"precio":2000,"subtotal":4000,"es_busqueda_por_codigo":true,"tipo_codigo":"manual","codigo_barras_id":177}],"metodo_pago":"2","total":8000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 19:38:45 - Content-Type: application/json 2025-10-07 19:38:45 - Resultado de json_decode: OK 2025-10-07 19:38:45 - ID sesión de caja recibido en JSON: 19 2025-10-07 19:38:45 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 19:38:45 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 19:38:45 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 19:38:45 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 19:38:45 - Modo API DTE está INACTIVO según configuración. 2025-10-07 19:38:45 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 19:38:45 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 19:38:45 - Venta insertada con ID: 713 2025-10-07 19:38:45 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 19:38:45 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 713) 2025-10-07 19:38:45 - Token de vista generado: 625fe6c45c6fe0415e9a0b040db6b845 2025-10-07 19:38:45 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 19:38:45 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 19:38:45 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 19:38:45 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 19:38:45 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 19:38:45 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 19:38:45 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 19:38:45 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:38:45 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:38:45 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:38:45 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:38:45 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 19:38:45 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:38:45 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 19:38:45 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:38:45 - --- Iniciando procesamiento para Prod0_ID775 --- 2025-10-07 19:38:45 - [Frontend][Prod0_ID775] Usando codigo_barras_id del frontend: 176 2025-10-07 19:38:45 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID775] Params: {"pid":775} 2025-10-07 19:38:45 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:38:45 - [DEBUG PRODUCTO][Prod0_ID775] Datos recibidos: {"id":775,"codigo":"17598756861805","cantidad":2,"precio":2000,"subtotal":4000,"es_busqueda_por_codigo":true,"tipo_codigo":"manual","codigo_barras_id":176} 2025-10-07 19:38:45 - [LOTE AUTO-DETECTADO][Prod0_ID775] Código escaneado 17598756861805 pertenece al LOTE1 (ID: 176) 2025-10-07 19:38:45 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID775] Params: cantidad=2, peso=, lote_id=176 2025-10-07 19:38:45 - [Stock Process][Prod0_ID775] Procesando stock con cantidad: 2 2025-10-07 19:38:45 - [Stock manual][Prod0_ID775] Aplicando lógica basada en cantidad. 2025-10-07 19:38:45 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID775] Params: {"pid":"775","codigo":"17598756861805"} 2025-10-07 19:38:45 - [Stock Manual][Prod0_ID775] Producto manual - código de barras específico: 176, numero_lote: LOTE1 2025-10-07 19:38:45 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID775_Esc] Params: {"cant":"2","id":176} 2025-10-07 19:38:45 - [Stock manual][Prod0_ID775] Actualizado código escaneado ID: 176. Descontado: 2 2025-10-07 19:38:45 - [Stock Strategy NORMAL][Prod0_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 2 2025-10-07 19:38:45 - [Stock Update NORMAL][Prod0_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 19:38:45 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 2, Venta ID: 713 2025-10-07 19:38:45 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 2 2025-10-07 19:38:45 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 19:38:45 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:38:45 - [Stock Strategy NORMAL][Prod0_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:38:45 - [DTE Detalle][Prod0_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:38:45 - --- Fin procesamiento para Prod0_ID775 --- 2025-10-07 19:38:45 - --- Iniciando procesamiento para Prod1_ID775 --- 2025-10-07 19:38:45 - [Frontend][Prod1_ID775] Usando codigo_barras_id del frontend: 177 2025-10-07 19:38:45 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID775] Params: {"pid":775} 2025-10-07 19:38:45 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:38:45 - [DEBUG PRODUCTO][Prod1_ID775] Datos recibidos: {"id":775,"codigo":"17598756873946","cantidad":2,"precio":2000,"subtotal":4000,"es_busqueda_por_codigo":true,"tipo_codigo":"manual","codigo_barras_id":177} 2025-10-07 19:38:45 - [LOTE AUTO-DETECTADO][Prod1_ID775] Código escaneado 17598756873946 pertenece al LOTE2 (ID: 177) 2025-10-07 19:38:45 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID775] Params: cantidad=2, peso=, lote_id=177 2025-10-07 19:38:45 - [Stock Process][Prod1_ID775] Procesando stock con cantidad: 2 2025-10-07 19:38:45 - [Stock manual][Prod1_ID775] Aplicando lógica basada en cantidad. 2025-10-07 19:38:45 - [DB EXECUTE][ID: FindCodeManualLoop_Prod1_ID775] Params: {"pid":"775","codigo":"17598756873946"} 2025-10-07 19:38:45 - [Stock Manual][Prod1_ID775] Producto manual - código de barras específico: 177, numero_lote: LOTE2 2025-10-07 19:38:45 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod1_ID775_Esc] Params: {"cant":"2","id":177} 2025-10-07 19:38:45 - [Stock manual][Prod1_ID775] Actualizado código escaneado ID: 177. Descontado: 2 2025-10-07 19:38:45 - [Stock Strategy NORMAL][Prod1_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 2 2025-10-07 19:38:45 - [Stock Update NORMAL][Prod1_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 19:38:45 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 2, Venta ID: 713 2025-10-07 19:38:45 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 2 2025-10-07 19:38:45 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 19:38:45 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:38:45 - [Stock Strategy NORMAL][Prod1_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:38:45 - [DTE Detalle][Prod1_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:38:45 - --- Fin procesamiento para Prod1_ID775 --- 2025-10-07 19:38:45 - Detalles de venta insertados y stock actualizado. 2025-10-07 19:38:45 - No se intentó la emisión DTE para Venta ID: 713 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 19:38:45 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 713 2025-10-07 19:38:45 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 19:38:45 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 19:38:45 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 19:38:45 - Transacción completada con éxito para Venta ID: 713 2025-10-07 19:38:45 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 19:38:45 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 19:49:35 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 19:49:35 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 19:49:35 - Datos recibidos: {"productos":[{"id":776,"codigo":"BER-776","cantidad":1,"precio":"4888.00","subtotal":4888,"es_busqueda_por_codigo":false},{"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":6888,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 19:49:35 - Content-Type: application/json 2025-10-07 19:49:35 - Resultado de json_decode: OK 2025-10-07 19:49:35 - ID sesión de caja recibido en JSON: 19 2025-10-07 19:49:35 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 19:49:35 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 19:49:35 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 19:49:35 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 19:49:35 - Modo API DTE está INACTIVO según configuración. 2025-10-07 19:49:35 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 19:49:35 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 19:49:35 - Venta insertada con ID: 714 2025-10-07 19:49:35 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 19:49:35 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 714) 2025-10-07 19:49:35 - Token de vista generado: f0af3fee16bff6430d643a19cb813ff5 2025-10-07 19:49:35 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 19:49:35 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 19:49:35 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 19:49:35 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 19:49:35 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 19:49:35 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 19:49:35 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 19:49:35 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:49:35 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:49:35 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:49:35 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:49:35 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 19:49:35 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:49:35 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 19:49:35 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:49:35 - --- Iniciando procesamiento para Prod0_ID776 --- 2025-10-07 19:49:35 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID776] Params: {"pid":776} 2025-10-07 19:49:35 - [Stock Check] Producto ID: 776, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:49:35 - [DEBUG PRODUCTO][Prod0_ID776] Datos recibidos: {"id":776,"codigo":"BER-776","cantidad":1,"precio":"4888.00","subtotal":4888,"es_busqueda_por_codigo":false} 2025-10-07 19:49:35 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID776] Lote ID: 194, Cantidad reducida: 1 2025-10-07 19:49:35 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID776] Params: cantidad=1, peso=, lote_id=194 2025-10-07 19:49:35 - [Stock Process][Prod0_ID776] Procesando stock con cantidad: 1 2025-10-07 19:49:35 - [Stock ESPECIAL][Prod0_ID776] Procesando producto especial con códigos de barras 2025-10-07 19:49:35 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID776] Params: {"pid":"776","codigo":"BER-776"} 2025-10-07 19:49:35 - [Stock Especial][Prod0_ID776] Producto especial - solo código de barras genérico: 178 2025-10-07 19:49:35 - [Stock Especial][Prod0_ID776] Actualizado código escaneado ID: 178. Descontado: 1 2025-10-07 19:49:35 - [Stock Strategy ESPECIAL][Prod0_ID776] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-07 19:49:35 - [Stock Update ESPECIAL][Prod0_ID776] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 19:49:35 - [Stock Update ESPECIAL][Prod0_ID776] Stock anterior: 200, cantidad a restar: 1, stock nuevo: 199 2025-10-07 19:49:35 - [Stock Update ESPECIAL][Prod0_ID776] Actualizando productos.stock manualmente 2025-10-07 19:49:35 - [Stock Update ESPECIAL][Prod0_ID776] productos.stock actualizado correctamente: 200 -> 199 2025-10-07 19:49:35 - [Stock Update ESPECIAL][Prod0_ID776] inventario.cantidad actualizado correctamente: 199 2025-10-07 19:49:35 - [Stock Update ESPECIAL][Prod0_ID776] Código genérico capturado: ID 178 2025-10-07 19:49:35 - [Stock Update ESPECIAL][Prod0_ID776] codigos_barras actualizado correctamente: 199 2025-10-07 19:49:35 - [Stock Update ESPECIAL][Prod0_ID776] resumen_productos actualizado correctamente: 199 2025-10-07 19:49:35 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 776, Cantidad: 1, Venta ID: 714 2025-10-07 19:49:35 - [Movimiento Stock] Registrando movimiento para Producto ID: 776, Cantidad: 1 2025-10-07 19:49:35 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 776 2025-10-07 19:49:35 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:49:35 - [DTE Detalle][Prod0_ID776] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:49:35 - --- Fin procesamiento para Prod0_ID776 --- 2025-10-07 19:49:35 - --- Iniciando procesamiento para Prod1_ID775 --- 2025-10-07 19:49:35 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID775] Params: {"pid":775} 2025-10-07 19:49:35 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:49:35 - [DEBUG PRODUCTO][Prod1_ID775] Datos recibidos: {"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-07 19:49:35 - [LOTE AUTO-DETECTADO][Prod1_ID775] Código escaneado 17598756861805 pertenece al LOTE1 (ID: 176) 2025-10-07 19:49:35 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID775] Params: cantidad=1, peso=, lote_id=176 2025-10-07 19:49:35 - [Stock Process][Prod1_ID775] Procesando stock con cantidad: 1 2025-10-07 19:49:35 - [Stock manual][Prod1_ID775] Aplicando lógica basada en cantidad. 2025-10-07 19:49:35 - [DB EXECUTE][ID: FindCodeManualLoop_Prod1_ID775] Params: {"pid":"775","codigo":"17598756861805"} 2025-10-07 19:49:35 - [Stock Manual][Prod1_ID775] Producto manual - código de barras específico: 176, numero_lote: LOTE1 2025-10-07 19:49:35 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod1_ID775_Esc] Params: {"cant":"1","id":176} 2025-10-07 19:49:35 - [Stock manual][Prod1_ID775] Actualizado código escaneado ID: 176. Descontado: 1 2025-10-07 19:49:35 - [Stock Strategy NORMAL][Prod1_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-07 19:49:35 - [Stock Update NORMAL][Prod1_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 19:49:35 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 1, Venta ID: 714 2025-10-07 19:49:35 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 1 2025-10-07 19:49:35 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 19:49:35 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:49:35 - [Stock Strategy NORMAL][Prod1_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:49:35 - [DTE Detalle][Prod1_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:49:35 - --- Fin procesamiento para Prod1_ID775 --- 2025-10-07 19:49:35 - Detalles de venta insertados y stock actualizado. 2025-10-07 19:49:35 - No se intentó la emisión DTE para Venta ID: 714 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 19:49:35 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 714 2025-10-07 19:49:35 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 19:49:35 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 19:49:35 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 19:49:35 - Transacción completada con éxito para Venta ID: 714 2025-10-07 19:49:35 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 19:49:35 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 19:55:01 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 19:55:01 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 19:55:01 - Datos recibidos: {"productos":[{"id":776,"codigo":"BER-776","cantidad":1,"precio":"4888.00","subtotal":4888,"es_busqueda_por_codigo":false,"lote_especifico":2},{"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":6888,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 19:55:01 - Content-Type: application/json 2025-10-07 19:55:01 - Resultado de json_decode: OK 2025-10-07 19:55:01 - ID sesión de caja recibido en JSON: 19 2025-10-07 19:55:01 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 19:55:01 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 19:55:01 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 19:55:01 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 19:55:01 - Modo API DTE está INACTIVO según configuración. 2025-10-07 19:55:01 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 19:55:01 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 19:55:01 - Venta insertada con ID: 715 2025-10-07 19:55:01 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 19:55:01 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 715) 2025-10-07 19:55:01 - Token de vista generado: 920e325cd43eee77ab3af1943b9b54ab 2025-10-07 19:55:01 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 19:55:01 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 19:55:01 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 19:55:01 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 19:55:01 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 19:55:01 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 19:55:01 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 19:55:01 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:55:01 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:55:01 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:55:01 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:55:01 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 19:55:01 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 19:55:01 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 19:55:01 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 19:55:01 - --- Iniciando procesamiento para Prod0_ID776 --- 2025-10-07 19:55:01 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID776] Params: {"pid":776} 2025-10-07 19:55:01 - [Stock Check] Producto ID: 776, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:55:01 - [DEBUG PRODUCTO][Prod0_ID776] Datos recibidos: {"id":776,"codigo":"BER-776","cantidad":1,"precio":"4888.00","subtotal":4888,"es_busqueda_por_codigo":false,"lote_especifico":2} 2025-10-07 19:55:01 - [LOTE ESPECÍFICO ESPECIAL][Prod0_ID776] Usando LOTE2 (ID: 195) con 100 unidades 2025-10-07 19:55:01 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID776] Lote ID: 195, Cantidad reducida: 1 2025-10-07 19:55:01 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID776] Params: cantidad=1, peso=, lote_id=195 2025-10-07 19:55:01 - [Stock Process][Prod0_ID776] Procesando stock con cantidad: 1 2025-10-07 19:55:01 - [Stock ESPECIAL][Prod0_ID776] Procesando producto especial con códigos de barras 2025-10-07 19:55:01 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID776] Params: {"pid":"776","codigo":"BER-776"} 2025-10-07 19:55:01 - [Stock Especial][Prod0_ID776] Producto especial - solo código de barras genérico: 178 2025-10-07 19:55:01 - [Stock Especial][Prod0_ID776] Actualizado código escaneado ID: 178. Descontado: 1 2025-10-07 19:55:01 - [Stock Strategy ESPECIAL][Prod0_ID776] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-07 19:55:01 - [Stock Update ESPECIAL][Prod0_ID776] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 19:55:01 - [Stock Update ESPECIAL][Prod0_ID776] Stock anterior: 200, cantidad a restar: 1, stock nuevo: 199 2025-10-07 19:55:01 - [Stock Update ESPECIAL][Prod0_ID776] Actualizando productos.stock manualmente 2025-10-07 19:55:01 - [Stock Update ESPECIAL][Prod0_ID776] productos.stock actualizado correctamente: 200 -> 199 2025-10-07 19:55:01 - [Stock Update ESPECIAL][Prod0_ID776] inventario.cantidad actualizado correctamente: 199 2025-10-07 19:55:01 - [Stock Update ESPECIAL][Prod0_ID776] Código genérico capturado: ID 178 2025-10-07 19:55:01 - [Stock Update ESPECIAL][Prod0_ID776] codigos_barras actualizado correctamente: 199 2025-10-07 19:55:01 - [Stock Update ESPECIAL][Prod0_ID776] resumen_productos actualizado correctamente: 199 2025-10-07 19:55:01 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 776, Cantidad: 1, Venta ID: 715 2025-10-07 19:55:01 - [Movimiento Stock] Registrando movimiento para Producto ID: 776, Cantidad: 1 2025-10-07 19:55:01 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 776 2025-10-07 19:55:01 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:55:01 - [DTE Detalle][Prod0_ID776] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:55:01 - --- Fin procesamiento para Prod0_ID776 --- 2025-10-07 19:55:01 - --- Iniciando procesamiento para Prod1_ID775 --- 2025-10-07 19:55:01 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID775] Params: {"pid":775} 2025-10-07 19:55:01 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 19:55:01 - [DEBUG PRODUCTO][Prod1_ID775] Datos recibidos: {"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-07 19:55:01 - [LOTE AUTO-DETECTADO][Prod1_ID775] Código escaneado 17598756861805 pertenece al LOTE1 (ID: 176) 2025-10-07 19:55:01 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID775] Params: cantidad=1, peso=, lote_id=176 2025-10-07 19:55:01 - [Stock Process][Prod1_ID775] Procesando stock con cantidad: 1 2025-10-07 19:55:01 - [Stock manual][Prod1_ID775] Aplicando lógica basada en cantidad. 2025-10-07 19:55:01 - [DB EXECUTE][ID: FindCodeManualLoop_Prod1_ID775] Params: {"pid":"775","codigo":"17598756861805"} 2025-10-07 19:55:01 - [Stock Manual][Prod1_ID775] Producto manual - código de barras específico: 176, numero_lote: LOTE1 2025-10-07 19:55:01 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod1_ID775_Esc] Params: {"cant":"1","id":176} 2025-10-07 19:55:01 - [Stock manual][Prod1_ID775] Actualizado código escaneado ID: 176. Descontado: 1 2025-10-07 19:55:01 - [Stock Strategy NORMAL][Prod1_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-07 19:55:01 - [Stock Update NORMAL][Prod1_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 19:55:01 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 1, Venta ID: 715 2025-10-07 19:55:01 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 1 2025-10-07 19:55:01 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 19:55:01 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 19:55:01 - [Stock Strategy NORMAL][Prod1_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 19:55:01 - [DTE Detalle][Prod1_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 19:55:01 - --- Fin procesamiento para Prod1_ID775 --- 2025-10-07 19:55:01 - Detalles de venta insertados y stock actualizado. 2025-10-07 19:55:01 - No se intentó la emisión DTE para Venta ID: 715 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 19:55:01 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 715 2025-10-07 19:55:01 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 19:55:01 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 19:55:01 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 19:55:01 - Transacción completada con éxito para Venta ID: 715 2025-10-07 19:55:01 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 19:55:01 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 20:00:25 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 20:00:25 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 20:00:25 - Datos recibidos: {"productos":[{"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]},{"id":776,"codigo":"BER-776","cantidad":1,"precio":"4888.00","subtotal":4888,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":6888,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 20:00:25 - Content-Type: application/json 2025-10-07 20:00:25 - Resultado de json_decode: OK 2025-10-07 20:00:25 - ID sesión de caja recibido en JSON: 19 2025-10-07 20:00:25 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 20:00:25 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 20:00:25 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 20:00:25 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 20:00:25 - Modo API DTE está INACTIVO según configuración. 2025-10-07 20:00:25 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 20:00:25 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 20:00:25 - Venta insertada con ID: 716 2025-10-07 20:00:25 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 20:00:25 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 716) 2025-10-07 20:00:25 - Token de vista generado: b1c32f4d637a85b2864ad572f34b3529 2025-10-07 20:00:25 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 20:00:25 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 20:00:25 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 20:00:25 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 20:00:25 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 20:00:25 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 20:00:25 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 20:00:25 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:00:25 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:00:25 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:00:25 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:00:25 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 20:00:25 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:00:25 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 20:00:25 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:00:25 - --- Iniciando procesamiento para Prod0_ID775 --- 2025-10-07 20:00:25 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID775] Params: {"pid":775} 2025-10-07 20:00:25 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 20:00:25 - [DEBUG PRODUCTO][Prod0_ID775] Datos recibidos: {"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-07 20:00:25 - [LOTE AUTO-DETECTADO][Prod0_ID775] Código escaneado 17598756861805 pertenece al LOTE1 (ID: 176) 2025-10-07 20:00:25 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID775] Params: cantidad=1, peso=, lote_id=176 2025-10-07 20:00:25 - [Stock Process][Prod0_ID775] Procesando stock con cantidad: 1 2025-10-07 20:00:25 - [Stock manual][Prod0_ID775] Aplicando lógica basada en cantidad. 2025-10-07 20:00:25 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID775] Params: {"pid":"775","codigo":"17598756861805"} 2025-10-07 20:00:25 - [Stock Manual][Prod0_ID775] Producto manual - código de barras específico: 176, numero_lote: LOTE1 2025-10-07 20:00:25 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID775_Esc] Params: {"cant":"1","id":176} 2025-10-07 20:00:25 - [Stock manual][Prod0_ID775] Actualizado código escaneado ID: 176. Descontado: 1 2025-10-07 20:00:25 - [Stock Strategy NORMAL][Prod0_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-07 20:00:25 - [Stock Update NORMAL][Prod0_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 20:00:25 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 1, Venta ID: 716 2025-10-07 20:00:25 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 1 2025-10-07 20:00:25 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 20:00:25 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 20:00:25 - [Stock Strategy NORMAL][Prod0_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 20:00:25 - [DTE Detalle][Prod0_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 20:00:25 - --- Fin procesamiento para Prod0_ID775 --- 2025-10-07 20:00:25 - --- Iniciando procesamiento para Prod1_ID776 --- 2025-10-07 20:00:25 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID776] Params: {"pid":776} 2025-10-07 20:00:25 - [Stock Check] Producto ID: 776, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 20:00:25 - [DEBUG PRODUCTO][Prod1_ID776] Datos recibidos: {"id":776,"codigo":"BER-776","cantidad":1,"precio":"4888.00","subtotal":4888,"es_busqueda_por_codigo":false,"lote_especifico":2} 2025-10-07 20:00:25 - [LOTE ESPECÍFICO ESPECIAL][Prod1_ID776] Usando LOTE2 (ID: 195) con 100 unidades 2025-10-07 20:00:25 - [LOTE ESPECÍFICO ACTUALIZADO][Prod1_ID776] Lote ID: 195, Cantidad reducida: 1 2025-10-07 20:00:25 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID776] Params: cantidad=1, peso=, lote_id=195 2025-10-07 20:00:25 - [Stock Process][Prod1_ID776] Procesando stock con cantidad: 1 2025-10-07 20:00:25 - [Stock ESPECIAL][Prod1_ID776] Procesando producto especial con códigos de barras 2025-10-07 20:00:25 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod1_ID776] Params: {"pid":"776","codigo":"BER-776"} 2025-10-07 20:00:25 - [Stock Especial][Prod1_ID776] Producto especial - solo código de barras genérico: 178 2025-10-07 20:00:25 - [Stock Especial][Prod1_ID776] Actualizado código escaneado ID: 178. Descontado: 1 2025-10-07 20:00:25 - [Stock Strategy ESPECIAL][Prod1_ID776] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-07 20:00:25 - [Stock Update ESPECIAL][Prod1_ID776] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 20:00:25 - [Stock Update ESPECIAL][Prod1_ID776] Stock anterior: 200, cantidad a restar: 1, stock nuevo: 199 2025-10-07 20:00:25 - [Stock Update ESPECIAL][Prod1_ID776] Actualizando productos.stock manualmente 2025-10-07 20:00:25 - [Stock Update ESPECIAL][Prod1_ID776] productos.stock actualizado correctamente: 200 -> 199 2025-10-07 20:00:25 - [Stock Update ESPECIAL][Prod1_ID776] inventario.cantidad actualizado correctamente: 199 2025-10-07 20:00:25 - [Stock Update ESPECIAL][Prod1_ID776] Código genérico capturado: ID 178 2025-10-07 20:00:25 - [Stock Update ESPECIAL][Prod1_ID776] codigos_barras actualizado correctamente: 199 2025-10-07 20:00:25 - [Stock Update ESPECIAL][Prod1_ID776] resumen_productos actualizado correctamente: 199 2025-10-07 20:00:25 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 776, Cantidad: 1, Venta ID: 716 2025-10-07 20:00:25 - [Movimiento Stock] Registrando movimiento para Producto ID: 776, Cantidad: 1 2025-10-07 20:00:25 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 776 2025-10-07 20:00:25 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 20:00:25 - [DTE Detalle][Prod1_ID776] Agregado a venta_detalles_para_api con formato original 2025-10-07 20:00:25 - --- Fin procesamiento para Prod1_ID776 --- 2025-10-07 20:00:25 - Detalles de venta insertados y stock actualizado. 2025-10-07 20:00:25 - No se intentó la emisión DTE para Venta ID: 716 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 20:00:25 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 716 2025-10-07 20:00:25 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 20:00:25 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 20:00:25 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 20:00:25 - Transacción completada con éxito para Venta ID: 716 2025-10-07 20:00:25 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 20:00:25 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 20:01:05 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 20:01:05 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 20:01:05 - Datos recibidos: {"productos":[{"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]},{"id":776,"codigo":"BER-776","cantidad":1,"precio":"4888.00","subtotal":4888,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":6888,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 20:01:05 - Content-Type: application/json 2025-10-07 20:01:05 - Resultado de json_decode: OK 2025-10-07 20:01:05 - ID sesión de caja recibido en JSON: 19 2025-10-07 20:01:05 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 20:01:05 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 20:01:05 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 20:01:05 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 20:01:05 - Modo API DTE está INACTIVO según configuración. 2025-10-07 20:01:05 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 20:01:05 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 20:01:05 - Venta insertada con ID: 717 2025-10-07 20:01:05 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 20:01:05 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 717) 2025-10-07 20:01:05 - Token de vista generado: 297e16ec7ae40d92e22b4210b9ba18b1 2025-10-07 20:01:05 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 20:01:05 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 20:01:05 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 20:01:05 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 20:01:05 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 20:01:05 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 20:01:05 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 20:01:05 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:01:05 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:01:05 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:01:05 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:01:05 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 20:01:05 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:01:05 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 20:01:05 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:01:05 - --- Iniciando procesamiento para Prod0_ID775 --- 2025-10-07 20:01:05 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID775] Params: {"pid":775} 2025-10-07 20:01:05 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 20:01:05 - [DEBUG PRODUCTO][Prod0_ID775] Datos recibidos: {"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-07 20:01:05 - [LOTE AUTO-DETECTADO][Prod0_ID775] Código escaneado 17598756861805 pertenece al LOTE1 (ID: 176) 2025-10-07 20:01:05 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID775] Params: cantidad=1, peso=, lote_id=176 2025-10-07 20:01:05 - [Stock Process][Prod0_ID775] Procesando stock con cantidad: 1 2025-10-07 20:01:05 - [Stock manual][Prod0_ID775] Aplicando lógica basada en cantidad. 2025-10-07 20:01:05 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID775] Params: {"pid":"775","codigo":"17598756861805"} 2025-10-07 20:01:05 - [Stock Manual][Prod0_ID775] Producto manual - código de barras específico: 176, numero_lote: LOTE1 2025-10-07 20:01:05 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID775_Esc] Params: {"cant":"1","id":176} 2025-10-07 20:01:05 - [Stock manual][Prod0_ID775] Actualizado código escaneado ID: 176. Descontado: 1 2025-10-07 20:01:05 - [Stock Strategy NORMAL][Prod0_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-07 20:01:05 - [Stock Update NORMAL][Prod0_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 20:01:05 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 1, Venta ID: 717 2025-10-07 20:01:05 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 1 2025-10-07 20:01:05 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 20:01:05 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 20:01:05 - [Stock Strategy NORMAL][Prod0_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 20:01:05 - [DTE Detalle][Prod0_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 20:01:05 - --- Fin procesamiento para Prod0_ID775 --- 2025-10-07 20:01:05 - --- Iniciando procesamiento para Prod1_ID776 --- 2025-10-07 20:01:05 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID776] Params: {"pid":776} 2025-10-07 20:01:05 - [Stock Check] Producto ID: 776, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 20:01:05 - [DEBUG PRODUCTO][Prod1_ID776] Datos recibidos: {"id":776,"codigo":"BER-776","cantidad":1,"precio":"4888.00","subtotal":4888,"es_busqueda_por_codigo":false,"lote_especifico":2} 2025-10-07 20:01:05 - [LOTE ESPECÍFICO ESPECIAL][Prod1_ID776] Usando LOTE2 (ID: 195) con 100 unidades 2025-10-07 20:01:05 - [LOTE ESPECÍFICO ACTUALIZADO][Prod1_ID776] Lote ID: 195, Cantidad reducida: 1 2025-10-07 20:01:05 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID776] Params: cantidad=1, peso=, lote_id=195 2025-10-07 20:01:05 - [Stock Process][Prod1_ID776] Procesando stock con cantidad: 1 2025-10-07 20:01:05 - [Stock ESPECIAL][Prod1_ID776] Procesando producto especial con códigos de barras 2025-10-07 20:01:05 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod1_ID776] Params: {"pid":"776","codigo":"BER-776"} 2025-10-07 20:01:05 - [Stock Especial][Prod1_ID776] Producto especial - solo código de barras genérico: 178 2025-10-07 20:01:05 - [Stock Especial][Prod1_ID776] Actualizado código escaneado ID: 178. Descontado: 1 2025-10-07 20:01:05 - [Stock Strategy ESPECIAL][Prod1_ID776] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-07 20:01:05 - [Stock Update ESPECIAL][Prod1_ID776] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 20:01:05 - [Stock Update ESPECIAL][Prod1_ID776] Stock anterior: 200, cantidad a restar: 1, stock nuevo: 199 2025-10-07 20:01:05 - [Stock Update ESPECIAL][Prod1_ID776] Actualizando productos.stock manualmente 2025-10-07 20:01:05 - [Stock Update ESPECIAL][Prod1_ID776] productos.stock actualizado correctamente: 200 -> 199 2025-10-07 20:01:05 - [Stock Update ESPECIAL][Prod1_ID776] inventario.cantidad actualizado correctamente: 199 2025-10-07 20:01:05 - [Stock Update ESPECIAL][Prod1_ID776] Código genérico capturado: ID 178 2025-10-07 20:01:05 - [Stock Update ESPECIAL][Prod1_ID776] codigos_barras actualizado correctamente: 199 2025-10-07 20:01:05 - [Stock Update ESPECIAL][Prod1_ID776] resumen_productos actualizado correctamente: 199 2025-10-07 20:01:05 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 776, Cantidad: 1, Venta ID: 717 2025-10-07 20:01:05 - [Movimiento Stock] Registrando movimiento para Producto ID: 776, Cantidad: 1 2025-10-07 20:01:05 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 776 2025-10-07 20:01:05 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 20:01:05 - [DTE Detalle][Prod1_ID776] Agregado a venta_detalles_para_api con formato original 2025-10-07 20:01:05 - --- Fin procesamiento para Prod1_ID776 --- 2025-10-07 20:01:05 - Detalles de venta insertados y stock actualizado. 2025-10-07 20:01:05 - No se intentó la emisión DTE para Venta ID: 717 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 20:01:05 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 717 2025-10-07 20:01:05 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 20:01:05 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 20:01:05 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 20:01:05 - Transacción completada con éxito para Venta ID: 717 2025-10-07 20:01:05 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 20:01:05 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 20:05:43 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 20:05:43 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 20:05:43 - Datos recibidos: {"productos":[{"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"99.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 20:05:43 - Content-Type: application/json 2025-10-07 20:05:43 - Resultado de json_decode: OK 2025-10-07 20:05:43 - ID sesión de caja recibido en JSON: 19 2025-10-07 20:05:43 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 20:05:43 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 20:05:43 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 20:05:43 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 20:05:43 - Modo API DTE está INACTIVO según configuración. 2025-10-07 20:05:43 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 20:05:43 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 20:05:43 - Venta insertada con ID: 718 2025-10-07 20:05:43 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 20:05:43 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 718) 2025-10-07 20:05:43 - Token de vista generado: 586d63fb45358e9a518654f7cdd6145f 2025-10-07 20:05:43 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 20:05:43 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 20:05:43 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 20:05:43 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 20:05:43 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 20:05:43 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 20:05:43 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 20:05:43 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:05:43 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:05:43 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:05:43 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:05:43 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 20:05:43 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:05:43 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 20:05:43 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:05:43 - --- Iniciando procesamiento para Prod0_ID775 --- 2025-10-07 20:05:43 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID775] Params: {"pid":775} 2025-10-07 20:05:43 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 20:05:43 - [DEBUG PRODUCTO][Prod0_ID775] Datos recibidos: {"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"99.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-07 20:05:43 - [LOTE AUTO-DETECTADO][Prod0_ID775] Código escaneado 17598756861805 pertenece al LOTE1 (ID: 176) 2025-10-07 20:05:43 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID775] Params: cantidad=1, peso=, lote_id=176 2025-10-07 20:05:43 - [Stock Process][Prod0_ID775] Procesando stock con cantidad: 1 2025-10-07 20:05:43 - [Stock manual][Prod0_ID775] Aplicando lógica basada en cantidad. 2025-10-07 20:05:43 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID775] Params: {"pid":"775","codigo":"17598756861805"} 2025-10-07 20:05:43 - [Stock Manual][Prod0_ID775] Producto manual - código de barras específico: 176, numero_lote: LOTE1 2025-10-07 20:05:43 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID775_Esc] Params: {"cant":"1","id":176} 2025-10-07 20:05:43 - [Stock manual][Prod0_ID775] Actualizado código escaneado ID: 176. Descontado: 1 2025-10-07 20:05:43 - [Stock Strategy NORMAL][Prod0_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-07 20:05:43 - [Stock Update NORMAL][Prod0_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 20:05:43 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 1, Venta ID: 718 2025-10-07 20:05:43 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 1 2025-10-07 20:05:43 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 20:05:43 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 20:05:43 - [Stock Strategy NORMAL][Prod0_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 20:05:43 - [DTE Detalle][Prod0_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 20:05:43 - --- Fin procesamiento para Prod0_ID775 --- 2025-10-07 20:05:43 - Detalles de venta insertados y stock actualizado. 2025-10-07 20:05:43 - No se intentó la emisión DTE para Venta ID: 718 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 20:05:43 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 718 2025-10-07 20:05:43 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 20:05:43 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 20:05:43 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 20:05:43 - Transacción completada con éxito para Venta ID: 718 2025-10-07 20:05:43 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 20:05:43 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 20:05:48 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 20:05:48 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 20:05:48 - Datos recibidos: {"productos":[{"id":776,"codigo":"BER-776","cantidad":1,"precio":"4888.00","subtotal":4888,"es_busqueda_por_codigo":false,"lote_especifico":2}],"metodo_pago":"2","total":4888,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 20:05:48 - Content-Type: application/json 2025-10-07 20:05:48 - Resultado de json_decode: OK 2025-10-07 20:05:48 - ID sesión de caja recibido en JSON: 19 2025-10-07 20:05:48 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 20:05:48 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 20:05:48 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 20:05:48 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 20:05:48 - Modo API DTE está INACTIVO según configuración. 2025-10-07 20:05:48 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 20:05:48 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 20:05:48 - Venta insertada con ID: 719 2025-10-07 20:05:48 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 20:05:48 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 719) 2025-10-07 20:05:48 - Token de vista generado: fa8ff7100e4b2384dbdf70f775267fcc 2025-10-07 20:05:48 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 20:05:48 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 20:05:48 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 20:05:48 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 20:05:48 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 20:05:48 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 20:05:48 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 20:05:48 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:05:48 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:05:48 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:05:48 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:05:48 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 20:05:48 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:05:48 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 20:05:48 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:05:48 - --- Iniciando procesamiento para Prod0_ID776 --- 2025-10-07 20:05:48 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID776] Params: {"pid":776} 2025-10-07 20:05:48 - [Stock Check] Producto ID: 776, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 20:05:48 - [DEBUG PRODUCTO][Prod0_ID776] Datos recibidos: {"id":776,"codigo":"BER-776","cantidad":1,"precio":"4888.00","subtotal":4888,"es_busqueda_por_codigo":false,"lote_especifico":2} 2025-10-07 20:05:48 - [LOTE ESPECÍFICO ESPECIAL][Prod0_ID776] Usando LOTE2 (ID: 195) con 100 unidades 2025-10-07 20:05:48 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID776] Lote ID: 195, Cantidad reducida: 1 2025-10-07 20:05:48 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID776] Params: cantidad=1, peso=, lote_id=195 2025-10-07 20:05:48 - [Stock Process][Prod0_ID776] Procesando stock con cantidad: 1 2025-10-07 20:05:48 - [Stock ESPECIAL][Prod0_ID776] Procesando producto especial con códigos de barras 2025-10-07 20:05:48 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID776] Params: {"pid":"776","codigo":"BER-776"} 2025-10-07 20:05:48 - [Stock Especial][Prod0_ID776] Producto especial - solo código de barras genérico: 178 2025-10-07 20:05:48 - [Stock Especial][Prod0_ID776] Actualizado código escaneado ID: 178. Descontado: 1 2025-10-07 20:05:48 - [Stock Strategy ESPECIAL][Prod0_ID776] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-07 20:05:48 - [Stock Update ESPECIAL][Prod0_ID776] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 20:05:48 - [Stock Update ESPECIAL][Prod0_ID776] Stock anterior: 200, cantidad a restar: 1, stock nuevo: 199 2025-10-07 20:05:48 - [Stock Update ESPECIAL][Prod0_ID776] Actualizando productos.stock manualmente 2025-10-07 20:05:48 - [Stock Update ESPECIAL][Prod0_ID776] productos.stock actualizado correctamente: 200 -> 199 2025-10-07 20:05:48 - [Stock Update ESPECIAL][Prod0_ID776] inventario.cantidad actualizado correctamente: 199 2025-10-07 20:05:48 - [Stock Update ESPECIAL][Prod0_ID776] Código genérico capturado: ID 178 2025-10-07 20:05:48 - [Stock Update ESPECIAL][Prod0_ID776] codigos_barras actualizado correctamente: 199 2025-10-07 20:05:48 - [Stock Update ESPECIAL][Prod0_ID776] resumen_productos actualizado correctamente: 199 2025-10-07 20:05:48 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 776, Cantidad: 1, Venta ID: 719 2025-10-07 20:05:48 - [Movimiento Stock] Registrando movimiento para Producto ID: 776, Cantidad: 1 2025-10-07 20:05:48 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 776 2025-10-07 20:05:48 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 20:05:48 - [DTE Detalle][Prod0_ID776] Agregado a venta_detalles_para_api con formato original 2025-10-07 20:05:48 - --- Fin procesamiento para Prod0_ID776 --- 2025-10-07 20:05:48 - Detalles de venta insertados y stock actualizado. 2025-10-07 20:05:48 - No se intentó la emisión DTE para Venta ID: 719 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 20:05:48 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 719 2025-10-07 20:05:48 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 20:05:48 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 20:05:48 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 20:05:48 - Transacción completada con éxito para Venta ID: 719 2025-10-07 20:05:48 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 20:05:48 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 20:06:07 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 20:06:07 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 20:06:07 - Datos recibidos: {"productos":[{"id":776,"codigo":"BER-776","cantidad":1,"precio":"4888.00","subtotal":4888,"es_busqueda_por_codigo":false,"lote_especifico":2},{"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"98.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":6888,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 20:06:07 - Content-Type: application/json 2025-10-07 20:06:07 - Resultado de json_decode: OK 2025-10-07 20:06:07 - ID sesión de caja recibido en JSON: 19 2025-10-07 20:06:07 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 20:06:07 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 20:06:07 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 20:06:07 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 20:06:07 - Modo API DTE está INACTIVO según configuración. 2025-10-07 20:06:07 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 20:06:07 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 20:06:07 - Venta insertada con ID: 720 2025-10-07 20:06:07 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 20:06:07 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 720) 2025-10-07 20:06:07 - Token de vista generado: dd5601706c7515b676a74261d2508515 2025-10-07 20:06:07 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 20:06:07 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 20:06:07 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 20:06:07 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 20:06:07 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 20:06:07 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 20:06:07 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 20:06:07 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:06:07 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:06:07 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:06:07 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:06:07 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 20:06:07 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:06:07 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 20:06:07 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:06:07 - --- Iniciando procesamiento para Prod0_ID776 --- 2025-10-07 20:06:07 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID776] Params: {"pid":776} 2025-10-07 20:06:07 - [Stock Check] Producto ID: 776, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 20:06:07 - [DEBUG PRODUCTO][Prod0_ID776] Datos recibidos: {"id":776,"codigo":"BER-776","cantidad":1,"precio":"4888.00","subtotal":4888,"es_busqueda_por_codigo":false,"lote_especifico":2} 2025-10-07 20:06:07 - [LOTE ESPECÍFICO ESPECIAL][Prod0_ID776] Usando LOTE2 (ID: 195) con 99 unidades 2025-10-07 20:06:07 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID776] Lote ID: 195, Cantidad reducida: 1 2025-10-07 20:06:07 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID776] Params: cantidad=1, peso=, lote_id=195 2025-10-07 20:06:07 - [Stock Process][Prod0_ID776] Procesando stock con cantidad: 1 2025-10-07 20:06:07 - [Stock ESPECIAL][Prod0_ID776] Procesando producto especial con códigos de barras 2025-10-07 20:06:07 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID776] Params: {"pid":"776","codigo":"BER-776"} 2025-10-07 20:06:07 - [Stock Especial][Prod0_ID776] Producto especial - solo código de barras genérico: 178 2025-10-07 20:06:07 - [Stock Especial][Prod0_ID776] Actualizado código escaneado ID: 178. Descontado: 1 2025-10-07 20:06:07 - [Stock Strategy ESPECIAL][Prod0_ID776] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-07 20:06:07 - [Stock Update ESPECIAL][Prod0_ID776] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 20:06:07 - [Stock Update ESPECIAL][Prod0_ID776] Stock anterior: 199, cantidad a restar: 1, stock nuevo: 198 2025-10-07 20:06:07 - [Stock Update ESPECIAL][Prod0_ID776] Actualizando productos.stock manualmente 2025-10-07 20:06:07 - [Stock Update ESPECIAL][Prod0_ID776] productos.stock actualizado correctamente: 199 -> 198 2025-10-07 20:06:07 - [Stock Update ESPECIAL][Prod0_ID776] inventario.cantidad actualizado correctamente: 198 2025-10-07 20:06:07 - [Stock Update ESPECIAL][Prod0_ID776] Código genérico capturado: ID 178 2025-10-07 20:06:07 - [Stock Update ESPECIAL][Prod0_ID776] codigos_barras actualizado correctamente: 198 2025-10-07 20:06:07 - [Stock Update ESPECIAL][Prod0_ID776] resumen_productos actualizado correctamente: 198 2025-10-07 20:06:07 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 776, Cantidad: 1, Venta ID: 720 2025-10-07 20:06:07 - [Movimiento Stock] Registrando movimiento para Producto ID: 776, Cantidad: 1 2025-10-07 20:06:07 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 776 2025-10-07 20:06:07 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 20:06:07 - [DTE Detalle][Prod0_ID776] Agregado a venta_detalles_para_api con formato original 2025-10-07 20:06:07 - --- Fin procesamiento para Prod0_ID776 --- 2025-10-07 20:06:07 - --- Iniciando procesamiento para Prod1_ID775 --- 2025-10-07 20:06:07 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID775] Params: {"pid":775} 2025-10-07 20:06:07 - [Stock Check] Producto ID: 775, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 20:06:07 - [DEBUG PRODUCTO][Prod1_ID775] Datos recibidos: {"id":775,"codigo":"17598756861805","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":176,"codigo":"17598756861805","tipo_codigo":"manual","cantidad":"98.00","fecha_vencimiento":null},{"id":177,"codigo":"17598756873946","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-07 20:06:07 - [LOTE AUTO-DETECTADO][Prod1_ID775] Código escaneado 17598756861805 pertenece al LOTE1 (ID: 176) 2025-10-07 20:06:07 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID775] Params: cantidad=1, peso=, lote_id=176 2025-10-07 20:06:07 - [Stock Process][Prod1_ID775] Procesando stock con cantidad: 1 2025-10-07 20:06:07 - [Stock manual][Prod1_ID775] Aplicando lógica basada en cantidad. 2025-10-07 20:06:07 - [DB EXECUTE][ID: FindCodeManualLoop_Prod1_ID775] Params: {"pid":"775","codigo":"17598756861805"} 2025-10-07 20:06:07 - [Stock Manual][Prod1_ID775] Producto manual - código de barras específico: 176, numero_lote: LOTE1 2025-10-07 20:06:07 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod1_ID775_Esc] Params: {"cant":"1","id":176} 2025-10-07 20:06:07 - [Stock manual][Prod1_ID775] Actualizado código escaneado ID: 176. Descontado: 1 2025-10-07 20:06:07 - [Stock Strategy NORMAL][Prod1_ID775] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-07 20:06:07 - [Stock Update NORMAL][Prod1_ID775] codigos_barras ya actualizado en sección anterior 2025-10-07 20:06:07 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 775, Cantidad: 1, Venta ID: 720 2025-10-07 20:06:07 - [Movimiento Stock] Registrando movimiento para Producto ID: 775, Cantidad: 1 2025-10-07 20:06:07 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 775 2025-10-07 20:06:07 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 20:06:07 - [Stock Strategy NORMAL][Prod1_ID775] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 20:06:07 - [DTE Detalle][Prod1_ID775] Agregado a venta_detalles_para_api con formato original 2025-10-07 20:06:07 - --- Fin procesamiento para Prod1_ID775 --- 2025-10-07 20:06:07 - Detalles de venta insertados y stock actualizado. 2025-10-07 20:06:07 - No se intentó la emisión DTE para Venta ID: 720 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 20:06:07 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 720 2025-10-07 20:06:07 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 20:06:07 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 20:06:07 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 20:06:07 - Transacción completada con éxito para Venta ID: 720 2025-10-07 20:06:07 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 20:06:07 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 20:08:33 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 20:08:33 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 20:08:33 - Datos recibidos: {"productos":[{"id":776,"codigo":"BER-776","cantidad":5,"precio":"4888.00","subtotal":24440,"es_busqueda_por_codigo":false,"lote_especifico":2},{"id":777,"codigo":"17598784908862","cantidad":5,"precio":2000,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":179,"codigo":"17598784908862","tipo_codigo":"masivo","cantidad":"1000.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":34440,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 20:08:33 - Content-Type: application/json 2025-10-07 20:08:33 - Resultado de json_decode: OK 2025-10-07 20:08:33 - ID sesión de caja recibido en JSON: 19 2025-10-07 20:08:33 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 20:08:33 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 20:08:33 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 20:08:33 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 20:08:33 - Modo API DTE está INACTIVO según configuración. 2025-10-07 20:08:33 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 20:08:33 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 20:08:33 - Venta insertada con ID: 721 2025-10-07 20:08:33 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 20:08:33 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 721) 2025-10-07 20:08:33 - Token de vista generado: ecb8fa6aaad6cd333e39839ac52bd13a 2025-10-07 20:08:33 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 20:08:33 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 20:08:33 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 20:08:33 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 20:08:33 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 20:08:33 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 20:08:33 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 20:08:33 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:08:33 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:08:33 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:08:33 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:08:33 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 20:08:33 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 20:08:33 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 20:08:33 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 20:08:33 - --- Iniciando procesamiento para Prod0_ID776 --- 2025-10-07 20:08:33 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID776] Params: {"pid":776} 2025-10-07 20:08:33 - [Stock Check] Producto ID: 776, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 20:08:33 - [DEBUG PRODUCTO][Prod0_ID776] Datos recibidos: {"id":776,"codigo":"BER-776","cantidad":5,"precio":"4888.00","subtotal":24440,"es_busqueda_por_codigo":false,"lote_especifico":2} 2025-10-07 20:08:33 - [LOTE ESPECÍFICO ESPECIAL][Prod0_ID776] Usando LOTE2 (ID: 195) con 99 unidades 2025-10-07 20:08:33 - [LOTE ESPECÍFICO ACTUALIZADO][Prod0_ID776] Lote ID: 195, Cantidad reducida: 5 2025-10-07 20:08:33 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID776] Params: cantidad=5, peso=, lote_id=195 2025-10-07 20:08:33 - [Stock Process][Prod0_ID776] Procesando stock con cantidad: 5 2025-10-07 20:08:33 - [Stock ESPECIAL][Prod0_ID776] Procesando producto especial con códigos de barras 2025-10-07 20:08:33 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID776] Params: {"pid":"776","codigo":"BER-776"} 2025-10-07 20:08:33 - [Stock Especial][Prod0_ID776] Producto especial - solo código de barras genérico: 178 2025-10-07 20:08:33 - [Stock Especial][Prod0_ID776] Actualizado código escaneado ID: 178. Descontado: 5 2025-10-07 20:08:33 - [Stock Strategy ESPECIAL][Prod0_ID776] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 5 2025-10-07 20:08:33 - [Stock Update ESPECIAL][Prod0_ID776] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-07 20:08:33 - [Stock Update ESPECIAL][Prod0_ID776] Stock anterior: 199, cantidad a restar: 5, stock nuevo: 194 2025-10-07 20:08:33 - [Stock Update ESPECIAL][Prod0_ID776] Actualizando productos.stock manualmente 2025-10-07 20:08:33 - [Stock Update ESPECIAL][Prod0_ID776] productos.stock actualizado correctamente: 199 -> 194 2025-10-07 20:08:33 - [Stock Update ESPECIAL][Prod0_ID776] inventario.cantidad actualizado correctamente: 194 2025-10-07 20:08:33 - [Stock Update ESPECIAL][Prod0_ID776] Código genérico capturado: ID 178 2025-10-07 20:08:33 - [Stock Update ESPECIAL][Prod0_ID776] codigos_barras actualizado correctamente: 194 2025-10-07 20:08:33 - [Stock Update ESPECIAL][Prod0_ID776] resumen_productos actualizado correctamente: 194 2025-10-07 20:08:33 - [MOVIMIENTO ESPECIAL] Llamando a registrarMovimientoStock para Producto ID: 776, Cantidad: 5, Venta ID: 721 2025-10-07 20:08:33 - [Movimiento Stock] Registrando movimiento para Producto ID: 776, Cantidad: 5 2025-10-07 20:08:33 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 776 2025-10-07 20:08:33 - [MOVIMIENTO ESPECIAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 20:08:33 - [DTE Detalle][Prod0_ID776] Agregado a venta_detalles_para_api con formato original 2025-10-07 20:08:33 - --- Fin procesamiento para Prod0_ID776 --- 2025-10-07 20:08:33 - --- Iniciando procesamiento para Prod1_ID777 --- 2025-10-07 20:08:33 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID777] Params: {"pid":777} 2025-10-07 20:08:33 - [Stock Check] Producto ID: 777, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 20:08:33 - [DEBUG PRODUCTO][Prod1_ID777] Datos recibidos: {"id":777,"codigo":"17598784908862","cantidad":5,"precio":2000,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":179,"codigo":"17598784908862","tipo_codigo":"masivo","cantidad":"1000.00","fecha_vencimiento":null}]} 2025-10-07 20:08:33 - [LOTE NORMAL ACTUALIZADO][Prod1_ID777] Código ID: 179, Cantidad reducida: 5 2025-10-07 20:08:33 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID777] Params: cantidad=5, peso=, lote_id=179 2025-10-07 20:08:33 - [Stock Process][Prod1_ID777] Procesando stock con cantidad: 5 2025-10-07 20:08:33 - [Stock Masivo][Prod1_ID777] Aplicando lógica de UPDATE. 2025-10-07 20:08:33 - [DB EXECUTE][ID: CheckMasivoLoop_Prod1_ID777] Params: {"pid":"777"} 2025-10-07 20:08:33 - [Stock Masivo][Prod1_ID777] Producto masivo - código de barras principal: 179, numero_lote: 2025-10-07 20:08:33 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod1_ID777] Params: {"cant":"5","id":179} 2025-10-07 20:08:33 - [Stock Masivo][Prod1_ID777] Stock actualizado para ID: 179. Descontado: 5. 2025-10-07 20:08:33 - [Stock Strategy NORMAL][Prod1_ID777] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-07 20:08:33 - [Stock Update NORMAL][Prod1_ID777] codigos_barras ya actualizado en sección anterior 2025-10-07 20:08:33 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 777, Cantidad: 5, Venta ID: 721 2025-10-07 20:08:33 - [Movimiento Stock] Registrando movimiento para Producto ID: 777, Cantidad: 5 2025-10-07 20:08:33 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 777 2025-10-07 20:08:33 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 20:08:33 - [Stock Strategy NORMAL][Prod1_ID777] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 20:08:33 - [DTE Detalle][Prod1_ID777] Agregado a venta_detalles_para_api con formato original 2025-10-07 20:08:33 - --- Fin procesamiento para Prod1_ID777 --- 2025-10-07 20:08:33 - Detalles de venta insertados y stock actualizado. 2025-10-07 20:08:33 - No se intentó la emisión DTE para Venta ID: 721 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 20:08:33 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 721 2025-10-07 20:08:33 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 20:08:33 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 20:08:33 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 20:08:33 - Transacción completada con éxito para Venta ID: 721 2025-10-07 20:08:33 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 20:08:33 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 21:23:17 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 21:23:17 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 21:23:17 - Datos recibidos: {"productos":[{"id":777,"codigo":"17598784908862","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":179,"codigo":"17598784908862","tipo_codigo":"masivo","cantidad":"990.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 21:23:17 - Content-Type: application/json 2025-10-07 21:23:17 - Resultado de json_decode: OK 2025-10-07 21:23:17 - ID sesión de caja recibido en JSON: 19 2025-10-07 21:23:17 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 21:23:17 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 21:23:17 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 21:23:17 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 21:23:17 - Modo API DTE está INACTIVO según configuración. 2025-10-07 21:23:17 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 21:23:17 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 21:23:17 - Venta insertada con ID: 722 2025-10-07 21:23:17 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 21:23:17 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 722) 2025-10-07 21:23:17 - Token de vista generado: 05f70ed1b325f59f880ed8514ba631bb 2025-10-07 21:23:17 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 21:23:17 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 21:23:17 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 21:23:17 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 21:23:17 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 21:23:17 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 21:23:17 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 21:23:17 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 21:23:17 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 21:23:17 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 21:23:17 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 21:23:17 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 21:23:17 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 21:23:17 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 21:23:17 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 21:23:17 - --- Iniciando procesamiento para Prod0_ID777 --- 2025-10-07 21:23:17 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID777] Params: {"pid":777} 2025-10-07 21:23:17 - [Stock Check] Producto ID: 777, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 21:23:17 - [DEBUG PRODUCTO][Prod0_ID777] Datos recibidos: {"id":777,"codigo":"17598784908862","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":179,"codigo":"17598784908862","tipo_codigo":"masivo","cantidad":"990.00","fecha_vencimiento":null}]} 2025-10-07 21:23:17 - [LOTE NORMAL ACTUALIZADO][Prod0_ID777] Código ID: 179, Cantidad reducida: 1 2025-10-07 21:23:17 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID777] Params: cantidad=1, peso=, lote_id=179 2025-10-07 21:23:17 - [Stock Process][Prod0_ID777] Procesando stock con cantidad: 1 2025-10-07 21:23:17 - [Stock Masivo][Prod0_ID777] Aplicando lógica de UPDATE. 2025-10-07 21:23:17 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID777] Params: {"pid":"777"} 2025-10-07 21:23:17 - [Stock Masivo][Prod0_ID777] Producto masivo - código de barras principal: 179, numero_lote: 2025-10-07 21:23:17 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID777] Params: {"cant":"1","id":179} 2025-10-07 21:23:17 - [Stock Masivo][Prod0_ID777] Stock actualizado para ID: 179. Descontado: 1. 2025-10-07 21:23:17 - [Stock Strategy NORMAL][Prod0_ID777] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-07 21:23:17 - [Stock Update NORMAL][Prod0_ID777] codigos_barras ya actualizado en sección anterior 2025-10-07 21:23:17 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 777, Cantidad: 1, Venta ID: 722 2025-10-07 21:23:17 - [Movimiento Stock] Registrando movimiento para Producto ID: 777, Cantidad: 1 2025-10-07 21:23:17 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 777 2025-10-07 21:23:17 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 21:23:17 - [Stock Strategy NORMAL][Prod0_ID777] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 21:23:17 - [DTE Detalle][Prod0_ID777] Agregado a venta_detalles_para_api con formato original 2025-10-07 21:23:17 - --- Fin procesamiento para Prod0_ID777 --- 2025-10-07 21:23:17 - Detalles de venta insertados y stock actualizado. 2025-10-07 21:23:17 - No se intentó la emisión DTE para Venta ID: 722 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 21:23:17 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 722 2025-10-07 21:23:17 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 21:23:17 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 21:23:17 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 21:23:17 - Transacción completada con éxito para Venta ID: 722 2025-10-07 21:23:17 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 21:23:17 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 21:25:28 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 21:25:28 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 21:25:28 - Datos recibidos: {"productos":[{"id":777,"codigo":"17598784908862","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":179,"codigo":"17598784908862","tipo_codigo":"masivo","cantidad":"988.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 21:25:28 - Content-Type: application/json 2025-10-07 21:25:28 - Resultado de json_decode: OK 2025-10-07 21:25:28 - ID sesión de caja recibido en JSON: 19 2025-10-07 21:25:28 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 21:25:28 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 21:25:28 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 21:25:28 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 21:25:28 - Modo API DTE está INACTIVO según configuración. 2025-10-07 21:25:28 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 21:25:28 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 21:25:28 - Venta insertada con ID: 723 2025-10-07 21:25:28 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 21:25:28 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 723) 2025-10-07 21:25:28 - Token de vista generado: 12695a4887abc5b10901c1df9fbb3920 2025-10-07 21:25:28 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 21:25:28 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 21:25:28 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 21:25:28 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 21:25:28 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 21:25:28 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 21:25:28 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 21:25:28 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 21:25:28 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 21:25:28 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 21:25:28 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 21:25:28 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 21:25:28 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 21:25:28 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 21:25:28 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 21:25:28 - --- Iniciando procesamiento para Prod0_ID777 --- 2025-10-07 21:25:28 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID777] Params: {"pid":777} 2025-10-07 21:25:28 - [Stock Check] Producto ID: 777, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 21:25:28 - [DEBUG PRODUCTO][Prod0_ID777] Datos recibidos: {"id":777,"codigo":"17598784908862","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":179,"codigo":"17598784908862","tipo_codigo":"masivo","cantidad":"988.00","fecha_vencimiento":null}]} 2025-10-07 21:25:28 - [LOTE NORMAL ACTUALIZADO][Prod0_ID777] Código ID: 179, Cantidad reducida: 1 2025-10-07 21:25:28 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID777] Params: cantidad=1, peso=, lote_id=179 2025-10-07 21:25:28 - [Stock Process][Prod0_ID777] Procesando stock con cantidad: 1 2025-10-07 21:25:28 - [Stock Masivo][Prod0_ID777] Aplicando lógica de UPDATE. 2025-10-07 21:25:28 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID777] Params: {"pid":"777"} 2025-10-07 21:25:28 - [Stock Masivo][Prod0_ID777] Producto masivo - código de barras principal: 179, numero_lote: 2025-10-07 21:25:28 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID777] Params: {"cant":"1","id":179} 2025-10-07 21:25:28 - [Stock Masivo][Prod0_ID777] Stock actualizado para ID: 179. Descontado: 1. 2025-10-07 21:25:28 - [Stock Strategy NORMAL][Prod0_ID777] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-07 21:25:28 - [Stock Update NORMAL][Prod0_ID777] codigos_barras ya actualizado en sección anterior 2025-10-07 21:25:28 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 777, Cantidad: 1, Venta ID: 723 2025-10-07 21:25:28 - [Movimiento Stock] Registrando movimiento para Producto ID: 777, Cantidad: 1 2025-10-07 21:25:28 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 777 2025-10-07 21:25:28 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 21:25:28 - [Stock Strategy NORMAL][Prod0_ID777] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 21:25:28 - [DTE Detalle][Prod0_ID777] Agregado a venta_detalles_para_api con formato original 2025-10-07 21:25:28 - --- Fin procesamiento para Prod0_ID777 --- 2025-10-07 21:25:28 - Detalles de venta insertados y stock actualizado. 2025-10-07 21:25:28 - No se intentó la emisión DTE para Venta ID: 723 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 21:25:28 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 723 2025-10-07 21:25:28 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 21:25:28 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 21:25:28 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 21:25:28 - Transacción completada con éxito para Venta ID: 723 2025-10-07 21:25:28 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 21:25:28 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 21:27:15 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 21:27:15 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 21:27:15 - Datos recibidos: {"productos":[{"id":777,"codigo":"17598784908862","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":179,"codigo":"17598784908862","tipo_codigo":"masivo","cantidad":"1000.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 21:27:15 - Content-Type: application/json 2025-10-07 21:27:15 - Resultado de json_decode: OK 2025-10-07 21:27:15 - ID sesión de caja recibido en JSON: 19 2025-10-07 21:27:15 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 21:27:15 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 21:27:15 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 21:27:15 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 21:27:15 - Modo API DTE está INACTIVO según configuración. 2025-10-07 21:27:15 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 21:27:15 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 21:27:15 - Venta insertada con ID: 724 2025-10-07 21:27:15 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 21:27:15 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 724) 2025-10-07 21:27:15 - Token de vista generado: 9d992c1b4adde8df800f110885d745c2 2025-10-07 21:27:15 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 21:27:15 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 21:27:15 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 21:27:15 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 21:27:15 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 21:27:15 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 21:27:15 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 21:27:15 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 21:27:15 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 21:27:15 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 21:27:15 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 21:27:15 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 21:27:15 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 21:27:15 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 21:27:15 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 21:27:15 - --- Iniciando procesamiento para Prod0_ID777 --- 2025-10-07 21:27:15 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID777] Params: {"pid":777} 2025-10-07 21:27:15 - [Stock Check] Producto ID: 777, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 21:27:15 - [DEBUG PRODUCTO][Prod0_ID777] Datos recibidos: {"id":777,"codigo":"17598784908862","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":179,"codigo":"17598784908862","tipo_codigo":"masivo","cantidad":"1000.00","fecha_vencimiento":null}]} 2025-10-07 21:27:15 - [LOTE MASIVO][Prod0_ID777] No actualizando codigos_barras aquí - se manejará por triggers 2025-10-07 21:27:15 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID777] Params: cantidad=1, peso=, lote_id=179 2025-10-07 21:27:15 - [Stock Process][Prod0_ID777] Procesando stock con cantidad: 1 2025-10-07 21:27:15 - [Stock Masivo][Prod0_ID777] Aplicando lógica de UPDATE. 2025-10-07 21:27:15 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID777] Params: {"pid":"777"} 2025-10-07 21:27:15 - [Stock Masivo][Prod0_ID777] Producto masivo - código de barras principal: 179, numero_lote: 2025-10-07 21:27:15 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID777] Params: {"cant":"1","id":179} 2025-10-07 21:27:15 - [Stock Masivo][Prod0_ID777] Stock actualizado para ID: 179. Descontado: 1. 2025-10-07 21:27:15 - [Stock Strategy NORMAL][Prod0_ID777] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-07 21:27:15 - [Stock Update NORMAL][Prod0_ID777] codigos_barras ya actualizado en sección anterior 2025-10-07 21:27:15 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 777, Cantidad: 1, Venta ID: 724 2025-10-07 21:27:15 - [Movimiento Stock] Registrando movimiento para Producto ID: 777, Cantidad: 1 2025-10-07 21:27:15 - [MOVIMIENTO MASIVO] Stock actual: 999.00, Cantidad vendida: 1 2025-10-07 21:27:15 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 777 2025-10-07 21:27:15 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 21:27:15 - [Stock Strategy NORMAL][Prod0_ID777] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 21:27:15 - [DTE Detalle][Prod0_ID777] Agregado a venta_detalles_para_api con formato original 2025-10-07 21:27:15 - --- Fin procesamiento para Prod0_ID777 --- 2025-10-07 21:27:15 - Detalles de venta insertados y stock actualizado. 2025-10-07 21:27:15 - No se intentó la emisión DTE para Venta ID: 724 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 21:27:15 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 724 2025-10-07 21:27:15 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 21:27:15 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 21:27:15 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 21:27:15 - Transacción completada con éxito para Venta ID: 724 2025-10-07 21:27:15 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 21:27:15 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-07 21:32:36 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-07 21:32:36 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-07 21:32:36 - Datos recibidos: {"productos":[{"id":777,"codigo":"17598784908862","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":179,"codigo":"17598784908862","tipo_codigo":"masivo","cantidad":"1000.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-07 21:32:36 - Content-Type: application/json 2025-10-07 21:32:36 - Resultado de json_decode: OK 2025-10-07 21:32:36 - ID sesión de caja recibido en JSON: 19 2025-10-07 21:32:36 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-07 21:32:36 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-07 21:32:36 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-07 21:32:36 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-07 21:32:36 - Modo API DTE está INACTIVO según configuración. 2025-10-07 21:32:36 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-07 21:32:36 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-07 21:32:36 - Venta insertada con ID: 725 2025-10-07 21:32:36 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-07 21:32:36 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 725) 2025-10-07 21:32:36 - Token de vista generado: 00a89440059a1f5cf83ecf362809a2af 2025-10-07 21:32:36 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-07 21:32:36 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-07 21:32:36 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-07 21:32:36 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-07 21:32:36 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-07 21:32:36 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-07 21:32:36 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-07 21:32:36 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 21:32:36 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 21:32:36 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 21:32:36 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 21:32:36 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-07 21:32:36 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-07 21:32:36 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-07 21:32:36 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-07 21:32:36 - --- Iniciando procesamiento para Prod0_ID777 --- 2025-10-07 21:32:36 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID777] Params: {"pid":777} 2025-10-07 21:32:36 - [Stock Check] Producto ID: 777, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-07 21:32:36 - [DEBUG PRODUCTO][Prod0_ID777] Datos recibidos: {"id":777,"codigo":"17598784908862","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":179,"codigo":"17598784908862","tipo_codigo":"masivo","cantidad":"1000.00","fecha_vencimiento":null}]} 2025-10-07 21:32:36 - [LOTE MASIVO][Prod0_ID777] No actualizando codigos_barras aquí - se manejará por triggers 2025-10-07 21:32:36 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID777] Params: cantidad=1, peso=, lote_id=179 2025-10-07 21:32:36 - [Stock Process][Prod0_ID777] Procesando stock con cantidad: 1 2025-10-07 21:32:36 - [Stock Masivo][Prod0_ID777] Aplicando lógica de UPDATE. 2025-10-07 21:32:36 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID777] Params: {"pid":"777"} 2025-10-07 21:32:36 - [Stock Masivo][Prod0_ID777] Producto masivo - código de barras principal: 179, numero_lote: 2025-10-07 21:32:36 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID777] Params: {"cant":"1","id":179} 2025-10-07 21:32:36 - [Stock Masivo][Prod0_ID777] Stock actualizado para ID: 179. Descontado: 1. 2025-10-07 21:32:36 - [Stock Strategy NORMAL][Prod0_ID777] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-07 21:32:36 - [Stock Update NORMAL][Prod0_ID777] codigos_barras ya actualizado en sección anterior 2025-10-07 21:32:36 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 777, Cantidad: 1, Venta ID: 725 2025-10-07 21:32:36 - [Movimiento Stock] Registrando movimiento para Producto ID: 777, Cantidad: 1 2025-10-07 21:32:36 - [MOVIMIENTO MASIVO] Stock actual: 999.00, Cantidad vendida: 1 2025-10-07 21:32:36 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 777 2025-10-07 21:32:36 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-07 21:32:36 - [Stock Strategy NORMAL][Prod0_ID777] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-07 21:32:36 - [DTE Detalle][Prod0_ID777] Agregado a venta_detalles_para_api con formato original 2025-10-07 21:32:36 - --- Fin procesamiento para Prod0_ID777 --- 2025-10-07 21:32:36 - Detalles de venta insertados y stock actualizado. 2025-10-07 21:32:36 - No se intentó la emisión DTE para Venta ID: 725 (Modo API inactivo o condiciones no cumplidas). 2025-10-07 21:32:36 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 725 2025-10-07 21:32:36 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-07 21:32:36 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-07 21:32:36 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-07 21:32:36 - Transacción completada con éxito para Venta ID: 725 2025-10-07 21:32:36 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-07 21:32:36 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-08 17:08:20 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-08 17:08:20 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-08 17:08:20 - Datos recibidos: {"productos":[{"id":779,"codigo":"17599389641262","cantidad":1,"precio":2500,"subtotal":2500,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":182,"codigo":"17599389641262","tipo_codigo":"masivo","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-08 17:08:20 - Content-Type: application/json 2025-10-08 17:08:20 - Resultado de json_decode: OK 2025-10-08 17:08:20 - ID sesión de caja recibido en JSON: 19 2025-10-08 17:08:20 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-08 17:08:20 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-08 17:08:20 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-08 17:08:20 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-08 17:08:20 - Modo API DTE está INACTIVO según configuración. 2025-10-08 17:08:20 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-08 17:08:20 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-08 17:08:20 - Venta insertada con ID: 726 2025-10-08 17:08:20 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-08 17:08:20 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 726) 2025-10-08 17:08:20 - Token de vista generado: 77bbb73e7303398d1072c146112e52a8 2025-10-08 17:08:20 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-08 17:08:20 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-08 17:08:20 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-08 17:08:20 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-08 17:08:20 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-08 17:08:20 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-08 17:08:20 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-08 17:08:20 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 17:08:20 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 17:08:20 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 17:08:20 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 17:08:20 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-08 17:08:20 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 17:08:20 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-08 17:08:20 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 17:08:20 - --- Iniciando procesamiento para Prod0_ID779 --- 2025-10-08 17:08:20 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID779] Params: {"pid":779} 2025-10-08 17:08:20 - [Stock Check] Producto ID: 779, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-08 17:08:20 - [DEBUG PRODUCTO][Prod0_ID779] Datos recibidos: {"id":779,"codigo":"17599389641262","cantidad":1,"precio":2500,"subtotal":2500,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":182,"codigo":"17599389641262","tipo_codigo":"masivo","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-08 17:08:20 - [LOTE MASIVO][Prod0_ID779] No actualizando codigos_barras aquí - se manejará por triggers 2025-10-08 17:08:20 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID779] Params: cantidad=1, peso=, lote_id=182 2025-10-08 17:08:20 - [Stock Process][Prod0_ID779] Procesando stock con cantidad: 1 2025-10-08 17:08:20 - [Stock Masivo][Prod0_ID779] Aplicando lógica de UPDATE. 2025-10-08 17:08:20 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID779] Params: {"pid":"779"} 2025-10-08 17:08:20 - [Stock Masivo][Prod0_ID779] Producto masivo - código de barras principal: 182, numero_lote: 2025-10-08 17:08:20 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID779] Params: {"cant":"1","id":182} 2025-10-08 17:08:20 - [Stock Masivo][Prod0_ID779] Stock actualizado para ID: 182. Descontado: 1. 2025-10-08 17:08:20 - [Stock Strategy NORMAL][Prod0_ID779] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-08 17:08:20 - [Stock Update NORMAL][Prod0_ID779] codigos_barras ya actualizado en sección anterior 2025-10-08 17:08:20 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 779, Cantidad: 1, Venta ID: 726 2025-10-08 17:08:20 - [Movimiento Stock] Registrando movimiento para Producto ID: 779, Cantidad: 1 2025-10-08 17:08:20 - [MOVIMIENTO MASIVO] Stock actual: 99.00, Cantidad vendida: 1 2025-10-08 17:08:20 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 779 2025-10-08 17:08:20 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-08 17:08:20 - [Stock Strategy NORMAL][Prod0_ID779] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-08 17:08:20 - [DTE Detalle][Prod0_ID779] Agregado a venta_detalles_para_api con formato original 2025-10-08 17:08:20 - --- Fin procesamiento para Prod0_ID779 --- 2025-10-08 17:08:20 - Detalles de venta insertados y stock actualizado. 2025-10-08 17:08:20 - No se intentó la emisión DTE para Venta ID: 726 (Modo API inactivo o condiciones no cumplidas). 2025-10-08 17:08:20 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 726 2025-10-08 17:08:20 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-08 17:08:20 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-08 17:08:20 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-08 17:08:20 - Transacción completada con éxito para Venta ID: 726 2025-10-08 17:08:20 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-08 17:08:20 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-08 17:22:49 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-08 17:22:49 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-08 17:22:49 - Datos recibidos: {"productos":[{"id":779,"codigo":"17599389641262","cantidad":1,"precio":2500,"subtotal":2500,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":182,"codigo":"17599389641262","tipo_codigo":"masivo","cantidad":"100.00","fecha_vencimiento":null}]},{"id":781,"codigo":"TES-781","cantidad":1,"precio":"2000.00","subtotal":2000,"es_busqueda_por_codigo":false},{"id":780,"codigo":"12345","cantidad":1,"precio":2550,"subtotal":2550,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":183,"codigo":"12345","tipo_codigo":"diferente","cantidad":"100.00","fecha_vencimiento":null},{"id":184,"codigo":"67890","tipo_codigo":"diferente","cantidad":"100.00","fecha_vencimiento":null}]},{"id":783,"codigo":"TES-783","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"peso_real":1}],"metodo_pago":"2","total":9050,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-10-08 17:22:49 - Content-Type: application/json 2025-10-08 17:22:49 - Resultado de json_decode: OK 2025-10-08 17:22:49 - ID sesión de caja recibido en JSON: 19 2025-10-08 17:22:49 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-08 17:22:49 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-08 17:22:49 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-08 17:22:49 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-08 17:22:49 - Modo API DTE está INACTIVO según configuración. 2025-10-08 17:22:49 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-08 17:22:49 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-10-08 17:22:49 - Venta insertada con ID: 727 2025-10-08 17:22:49 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-08 17:22:49 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 727) 2025-10-08 17:22:49 - Token de vista generado: baa2d2112d5c4ddc1f41080043684132 2025-10-08 17:22:49 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-08 17:22:49 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-08 17:22:49 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-08 17:22:49 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-08 17:22:49 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-08 17:22:49 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-08 17:22:49 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-08 17:22:49 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 17:22:49 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 17:22:49 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 17:22:49 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 17:22:49 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-08 17:22:49 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 17:22:49 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-08 17:22:49 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 17:22:49 - --- Iniciando procesamiento para Prod0_ID779 --- 2025-10-08 17:22:49 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID779] Params: {"pid":779} 2025-10-08 17:22:49 - [Stock Check] Producto ID: 779, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-08 17:22:49 - [DEBUG PRODUCTO][Prod0_ID779] Datos recibidos: {"id":779,"codigo":"17599389641262","cantidad":1,"precio":2500,"subtotal":2500,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":182,"codigo":"17599389641262","tipo_codigo":"masivo","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-08 17:22:49 - [LOTE MASIVO][Prod0_ID779] No actualizando codigos_barras aquí - se manejará por triggers 2025-10-08 17:22:49 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID779] Params: cantidad=1, peso=, lote_id=182 2025-10-08 17:22:49 - [Stock Process][Prod0_ID779] Procesando stock con cantidad: 1 2025-10-08 17:22:49 - [Stock Masivo][Prod0_ID779] Aplicando lógica de UPDATE. 2025-10-08 17:22:49 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID779] Params: {"pid":"779"} 2025-10-08 17:22:49 - [Stock Masivo][Prod0_ID779] Producto masivo - código de barras principal: 182, numero_lote: 2025-10-08 17:22:49 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID779] Params: {"cant":"1","id":182} 2025-10-08 17:22:49 - [Stock Masivo][Prod0_ID779] Stock actualizado para ID: 182. Descontado: 1. 2025-10-08 17:22:49 - [Stock Strategy NORMAL][Prod0_ID779] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-08 17:22:49 - [Stock Update NORMAL][Prod0_ID779] codigos_barras ya actualizado en sección anterior 2025-10-08 17:22:49 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 779, Cantidad: 1, Venta ID: 727 2025-10-08 17:22:49 - [Movimiento Stock] Registrando movimiento para Producto ID: 779, Cantidad: 1 2025-10-08 17:22:49 - [MOVIMIENTO MASIVO] Stock actual: 99.00, Cantidad vendida: 1 2025-10-08 17:22:49 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 779 2025-10-08 17:22:49 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-08 17:22:49 - [Stock Strategy NORMAL][Prod0_ID779] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-08 17:22:49 - [DTE Detalle][Prod0_ID779] Agregado a venta_detalles_para_api con formato original 2025-10-08 17:22:49 - --- Fin procesamiento para Prod0_ID779 --- 2025-10-08 17:22:49 - --- Iniciando procesamiento para Prod1_ID781 --- 2025-10-08 17:22:49 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID781] Params: {"pid":781} 2025-10-08 17:22:49 - [Stock Check] Producto ID: 781, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-08 17:22:49 - [DEBUG PRODUCTO][Prod1_ID781] Datos recibidos: {"id":781,"codigo":"TES-781","cantidad":1,"precio":"2000.00","subtotal":2000,"es_busqueda_por_codigo":false} 2025-10-08 17:22:49 - [LOTE ESPECIAL ACTUALIZADO][Prod1_ID781] Lote ID: 196, Cantidad reducida: 1 2025-10-08 17:22:49 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID781] Params: cantidad=1, peso=, lote_id=196 2025-10-08 17:22:49 - [Stock Process][Prod1_ID781] Procesando stock con cantidad: 1 2025-10-08 17:22:49 - [Stock ESPECIAL][Prod1_ID781] Procesando producto especial con códigos de barras 2025-10-08 17:22:49 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod1_ID781] Params: {"pid":"781","codigo":"TES-781"} 2025-10-08 17:22:49 - [Stock Especial][Prod1_ID781] Producto especial - solo código de barras genérico: 185 2025-10-08 17:22:49 - [Stock Especial][Prod1_ID781] Actualizado código escaneado ID: 185. Descontado: 1 2025-10-08 17:22:49 - [Stock Strategy ESPECIAL][Prod1_ID781] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-08 17:22:49 - [Stock Update ESPECIAL][Prod1_ID781] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-08 17:22:49 - [Stock Update ESPECIAL][Prod1_ID781] Stock anterior: 100, cantidad a restar: 1, stock nuevo: 99 2025-10-08 17:22:49 - [Stock Update MASIVO][Prod1_ID781] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-08 17:22:49 - [Stock Update MASIVO][Prod1_ID781] Código genérico capturado: ID 185 2025-10-08 17:22:49 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 781, Cantidad: 1, Venta ID: 727 2025-10-08 17:22:49 - [Movimiento Stock] Registrando movimiento para Producto ID: 781, Cantidad: 1 2025-10-08 17:22:49 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 781 2025-10-08 17:22:49 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-08 17:22:49 - [DTE Detalle][Prod1_ID781] Agregado a venta_detalles_para_api con formato original 2025-10-08 17:22:49 - --- Fin procesamiento para Prod1_ID781 --- 2025-10-08 17:22:49 - --- Iniciando procesamiento para Prod2_ID780 --- 2025-10-08 17:22:49 - [DB EXECUTE][ID: TipoProdLoop_Prod2_ID780] Params: {"pid":780} 2025-10-08 17:22:49 - [Stock Check] Producto ID: 780, Tipo Código: diferente, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-08 17:22:49 - [DEBUG PRODUCTO][Prod2_ID780] Datos recibidos: {"id":780,"codigo":"12345","cantidad":1,"precio":2550,"subtotal":2550,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":183,"codigo":"12345","tipo_codigo":"diferente","cantidad":"100.00","fecha_vencimiento":null},{"id":184,"codigo":"67890","tipo_codigo":"diferente","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-08 17:22:49 - [LOTE AUTO-DETECTADO][Prod2_ID780] Código escaneado 12345 pertenece al LOTE1 (ID: 183) 2025-10-08 17:22:49 - [DB EXECUTE][ID: DetalleInsertLoop_Prod2_ID780] Params: cantidad=1, peso=, lote_id=183 2025-10-08 17:22:49 - [Stock Process][Prod2_ID780] Procesando stock con cantidad: 1 2025-10-08 17:22:49 - [Stock Diferente - Cantidad][Prod2_ID780] Procesando. 2025-10-08 17:22:49 - [DB EXECUTE][ID: FindEscaneado_Prod2_ID780] Params: {"pid":"780","codigo":"12345"} 2025-10-08 17:22:49 - [Stock Diferente][Prod2_ID780] Producto diferente - código de barras específico: 183, numero_lote: LOTE1 2025-10-08 17:22:49 - [Stock Diferente - Cantidad][Prod2_ID780] Código '12345' (ID:183): Necesitadas=1, Disponibles Escaneado=100, A procesar con este=1 2025-10-08 17:22:49 - [DB EXECUTE][ID: UpdateEscaneado_Prod2_ID780] Params: {"cant":"1","id":183} 2025-10-08 17:22:49 - [Stock Diferente - Cantidad][Prod2_ID780] Éxito: Actualizada cantidad para ID 183. Descontado: 1 2025-10-08 17:22:49 - [Stock Diferente - Cantidad][Prod2_ID780] Cantidad restante a procesar: 0 2025-10-08 17:22:49 - [Stock Diferente - Cantidad][Prod2_ID780] Éxito final: Procesadas 1 unidades. 2025-10-08 17:22:49 - [Stock Strategy NORMAL][Prod2_ID780] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-08 17:22:49 - [Stock Update NORMAL][Prod2_ID780] codigos_barras ya actualizado en sección anterior 2025-10-08 17:22:49 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 780, Cantidad: 1, Venta ID: 727 2025-10-08 17:22:49 - [Movimiento Stock] Registrando movimiento para Producto ID: 780, Cantidad: 1 2025-10-08 17:22:49 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 780 2025-10-08 17:22:49 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-08 17:22:49 - [Stock Strategy NORMAL][Prod2_ID780] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-08 17:22:49 - [DTE Detalle][Prod2_ID780] Agregado a venta_detalles_para_api con formato original 2025-10-08 17:22:49 - --- Fin procesamiento para Prod2_ID780 --- 2025-10-08 17:22:49 - --- Iniciando procesamiento para Prod3_ID783 --- 2025-10-08 17:22:49 - [DB EXECUTE][ID: TipoProdLoop_Prod3_ID783] Params: {"pid":783} 2025-10-08 17:22:49 - [Stock Check] Producto ID: 783, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-08 17:22:49 - [Producto Por Peso][Prod3_ID783] Peso real: 1 Kg 2025-10-08 17:22:49 - [DEBUG PRODUCTO][Prod3_ID783] Datos recibidos: {"id":783,"codigo":"TES-783","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"peso_real":1} 2025-10-08 17:22:49 - [LOTE ESPECIAL ACTUALIZADO][Prod3_ID783] Lote ID: 198, Cantidad reducida: 1 2025-10-08 17:22:49 - [DB EXECUTE][ID: DetalleInsertLoop_Prod3_ID783] Params: cantidad=1, peso=1, lote_id=198 2025-10-08 17:22:49 - [Detalle Actualizado][Prod3_ID783] Nombre especial actualizado a: Producto (1 Kg) 2025-10-08 17:22:49 - [Stock Process][Prod3_ID783] Procesando stock con cantidad: 1 2025-10-08 17:22:49 - [Stock ESPECIAL][Prod3_ID783] Procesando producto especial con códigos de barras 2025-10-08 17:22:49 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod3_ID783] Params: {"pid":"783","codigo":"TES-783"} 2025-10-08 17:22:49 - [Stock Especial][Prod3_ID783] Producto especial - solo código de barras genérico: 187 2025-10-08 17:22:49 - [Stock Especial][Prod3_ID783] Actualizado código escaneado ID: 187. Descontado: 1 2025-10-08 17:22:49 - [Stock Strategy ESPECIAL][Prod3_ID783] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-08 17:22:49 - [Stock Update ESPECIAL][Prod3_ID783] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-08 17:22:49 - [Stock Update ESPECIAL][Prod3_ID783] Stock anterior: 100, cantidad a restar: 1, stock nuevo: 99 2025-10-08 17:22:49 - [Stock Update MASIVO][Prod3_ID783] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-08 17:22:49 - [Stock Update MASIVO][Prod3_ID783] Código genérico capturado: ID 187 2025-10-08 17:22:49 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 783, Cantidad: 1, Venta ID: 727 2025-10-08 17:22:49 - [Movimiento Stock] Registrando movimiento para Producto ID: 783, Cantidad: 1 2025-10-08 17:22:49 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 783 2025-10-08 17:22:49 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-08 17:22:49 - [DTE Detalle][Prod3_ID783] Agregado a venta_detalles_para_api con formato original 2025-10-08 17:22:49 - --- Fin procesamiento para Prod3_ID783 --- 2025-10-08 17:22:49 - Detalles de venta insertados y stock actualizado. 2025-10-08 17:22:49 - No se intentó la emisión DTE para Venta ID: 727 (Modo API inactivo o condiciones no cumplidas). 2025-10-08 17:22:49 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 727 2025-10-08 17:22:49 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-08 17:22:49 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-08 17:22:49 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-08 17:22:49 - Transacción completada con éxito para Venta ID: 727 2025-10-08 17:22:49 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-08 17:22:49 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-08 18:22:52 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-08 18:22:52 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-08 18:22:52 - Datos recibidos: {"productos":[{"id":1,"codigo":"TES-001","cantidad":1,"precio":"2000.00","subtotal":2000,"es_busqueda_por_codigo":false}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"20"} 2025-10-08 18:22:52 - Content-Type: application/json 2025-10-08 18:22:52 - Resultado de json_decode: OK 2025-10-08 18:22:52 - ID sesión de caja recibido en JSON: 20 2025-10-08 18:22:52 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-08 18:22:52 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-08 18:22:52 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-08 18:22:52 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-08 18:22:52 - Modo API DTE está INACTIVO según configuración. 2025-10-08 18:22:52 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-08 18:22:52 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=20) 2025-10-08 18:22:52 - Venta insertada con ID: 728 2025-10-08 18:22:52 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-08 18:22:52 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 728) 2025-10-08 18:22:52 - Token de vista generado: b4bef3dda6277e730bd9fb5818dc67ce 2025-10-08 18:22:52 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-08 18:22:52 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-08 18:22:52 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-08 18:22:52 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-08 18:22:52 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-08 18:22:52 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-08 18:22:52 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-08 18:22:52 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 18:22:52 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 18:22:52 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 18:22:52 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 18:22:52 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-08 18:22:52 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 18:22:52 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-08 18:22:52 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 18:22:52 - --- Iniciando procesamiento para Prod0_ID1 --- 2025-10-08 18:22:52 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID1] Params: {"pid":1} 2025-10-08 18:22:52 - [Stock Check] Producto ID: 1, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-08 18:22:52 - [DEBUG PRODUCTO][Prod0_ID1] Datos recibidos: {"id":1,"codigo":"TES-001","cantidad":1,"precio":"2000.00","subtotal":2000,"es_busqueda_por_codigo":false} 2025-10-08 18:22:52 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID1] Lote ID: 1, Cantidad reducida: 1 2025-10-08 18:22:52 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID1] Params: cantidad=1, peso=, lote_id=1 2025-10-08 18:22:52 - [Stock Process][Prod0_ID1] Procesando stock con cantidad: 1 2025-10-08 18:22:52 - [Stock ESPECIAL][Prod0_ID1] Procesando producto especial con códigos de barras 2025-10-08 18:22:52 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID1] Params: {"pid":"1","codigo":"TES-001"} 2025-10-08 18:22:52 - [Stock Especial][Prod0_ID1] Producto especial - solo código de barras genérico: 1 2025-10-08 18:22:52 - [Stock Especial][Prod0_ID1] Actualizado código escaneado ID: 1. Descontado: 1 2025-10-08 18:22:52 - [Stock Strategy ESPECIAL][Prod0_ID1] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-08 18:22:52 - [Stock Update ESPECIAL][Prod0_ID1] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-08 18:22:52 - [Stock Update ESPECIAL][Prod0_ID1] Stock anterior: 100, cantidad a restar: 1, stock nuevo: 99 2025-10-08 18:22:52 - [Stock Update MASIVO][Prod0_ID1] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-08 18:22:52 - [Stock Update MASIVO][Prod0_ID1] Código genérico capturado: ID 1 2025-10-08 18:22:52 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 1, Cantidad: 1, Venta ID: 728 2025-10-08 18:22:52 - [Movimiento Stock] Registrando movimiento para Producto ID: 1, Cantidad: 1 2025-10-08 18:22:52 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 1 2025-10-08 18:22:52 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-08 18:22:52 - [DTE Detalle][Prod0_ID1] Agregado a venta_detalles_para_api con formato original 2025-10-08 18:22:52 - --- Fin procesamiento para Prod0_ID1 --- 2025-10-08 18:22:52 - Detalles de venta insertados y stock actualizado. 2025-10-08 18:22:52 - No se intentó la emisión DTE para Venta ID: 728 (Modo API inactivo o condiciones no cumplidas). 2025-10-08 18:22:52 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 728 2025-10-08 18:22:52 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-08 18:22:52 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-08 18:22:52 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-08 18:22:52 - Transacción completada con éxito para Venta ID: 728 2025-10-08 18:22:52 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-08 18:22:52 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-08 18:40:53 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-08 18:40:53 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-08 18:40:53 - Datos recibidos: {"productos":[{"id":2,"codigo":"TES-002","cantidad":1,"precio":"2000.00","subtotal":2000,"es_busqueda_por_codigo":false}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"20"} 2025-10-08 18:40:53 - Content-Type: application/json 2025-10-08 18:40:53 - Resultado de json_decode: OK 2025-10-08 18:40:53 - ID sesión de caja recibido en JSON: 20 2025-10-08 18:40:53 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-08 18:40:53 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-08 18:40:53 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-08 18:40:53 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-08 18:40:53 - Modo API DTE está INACTIVO según configuración. 2025-10-08 18:40:53 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-08 18:40:53 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=20) 2025-10-08 18:40:53 - Venta insertada con ID: 729 2025-10-08 18:40:53 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-08 18:40:53 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 729) 2025-10-08 18:40:53 - Token de vista generado: a0076e2150543c332c90a826c3e099a1 2025-10-08 18:40:53 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-08 18:40:53 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-08 18:40:53 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-08 18:40:53 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-08 18:40:53 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-08 18:40:53 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-08 18:40:53 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-08 18:40:53 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 18:40:53 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 18:40:53 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 18:40:53 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 18:40:53 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-08 18:40:53 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 18:40:53 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-08 18:40:53 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 18:40:53 - --- Iniciando procesamiento para Prod0_ID2 --- 2025-10-08 18:40:53 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID2] Params: {"pid":2} 2025-10-08 18:40:53 - [Stock Check] Producto ID: 2, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-08 18:40:53 - [DEBUG PRODUCTO][Prod0_ID2] Datos recibidos: {"id":2,"codigo":"TES-002","cantidad":1,"precio":"2000.00","subtotal":2000,"es_busqueda_por_codigo":false} 2025-10-08 18:40:53 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID2] Lote ID: 2, Cantidad reducida: 1 2025-10-08 18:40:53 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID2] Params: cantidad=1, peso=, lote_id=2 2025-10-08 18:40:53 - [Stock Process][Prod0_ID2] Procesando stock con cantidad: 1 2025-10-08 18:40:53 - [Stock ESPECIAL][Prod0_ID2] Procesando producto especial con códigos de barras 2025-10-08 18:40:53 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID2] Params: {"pid":"2","codigo":"TES-002"} 2025-10-08 18:40:53 - [Stock Especial][Prod0_ID2] Producto especial - solo código de barras genérico: 2 2025-10-08 18:40:53 - [Stock Especial][Prod0_ID2] Actualizado código escaneado ID: 2. Descontado: 1 2025-10-08 18:40:53 - [Stock Strategy ESPECIAL][Prod0_ID2] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-08 18:40:53 - [Stock Update ESPECIAL][Prod0_ID2] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-08 18:40:53 - [Stock Update ESPECIAL][Prod0_ID2] Stock anterior: 100, cantidad a restar: 1, stock nuevo: 99 2025-10-08 18:40:53 - [Stock Update MASIVO][Prod0_ID2] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-08 18:40:53 - [Stock Update MASIVO][Prod0_ID2] Código genérico capturado: ID 2 2025-10-08 18:40:53 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 2, Cantidad: 1, Venta ID: 729 2025-10-08 18:40:53 - [Movimiento Stock] Registrando movimiento para Producto ID: 2, Cantidad: 1 2025-10-08 18:40:53 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 2 2025-10-08 18:40:53 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-08 18:40:53 - [DTE Detalle][Prod0_ID2] Agregado a venta_detalles_para_api con formato original 2025-10-08 18:40:53 - --- Fin procesamiento para Prod0_ID2 --- 2025-10-08 18:40:53 - Detalles de venta insertados y stock actualizado. 2025-10-08 18:40:53 - No se intentó la emisión DTE para Venta ID: 729 (Modo API inactivo o condiciones no cumplidas). 2025-10-08 18:40:53 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 729 2025-10-08 18:40:53 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-08 18:40:53 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-08 18:40:53 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-08 18:40:53 - Transacción completada con éxito para Venta ID: 729 2025-10-08 18:40:53 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-08 18:40:53 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-08 18:42:58 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-08 18:42:58 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-08 18:42:58 - Datos recibidos: {"productos":[{"id":2,"codigo":"TES-002","cantidad":1,"precio":"2000.00","subtotal":2000,"es_busqueda_por_codigo":false}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"20"} 2025-10-08 18:42:58 - Content-Type: application/json 2025-10-08 18:42:58 - Resultado de json_decode: OK 2025-10-08 18:42:58 - ID sesión de caja recibido en JSON: 20 2025-10-08 18:42:58 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-08 18:42:58 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-08 18:42:58 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-08 18:42:58 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-08 18:42:58 - Modo API DTE está INACTIVO según configuración. 2025-10-08 18:42:58 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-08 18:42:58 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=20) 2025-10-08 18:42:58 - Venta insertada con ID: 1 2025-10-08 18:42:58 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-08 18:42:58 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 1) 2025-10-08 18:42:58 - Token de vista generado: a4901a98c98ee2a3b7cb5d081330d4c2 2025-10-08 18:42:58 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-08 18:42:58 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-08 18:42:58 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-08 18:42:58 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-08 18:42:58 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-08 18:42:58 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-08 18:42:58 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-08 18:42:58 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 18:42:58 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 18:42:58 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 18:42:58 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 18:42:58 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-08 18:42:58 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-08 18:42:58 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-08 18:42:58 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-08 18:42:58 - --- Iniciando procesamiento para Prod0_ID2 --- 2025-10-08 18:42:58 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID2] Params: {"pid":2} 2025-10-08 18:42:58 - [Stock Check] Producto ID: 2, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-08 18:42:58 - [DEBUG PRODUCTO][Prod0_ID2] Datos recibidos: {"id":2,"codigo":"TES-002","cantidad":1,"precio":"2000.00","subtotal":2000,"es_busqueda_por_codigo":false} 2025-10-08 18:42:58 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID2] Lote ID: 2, Cantidad reducida: 1 2025-10-08 18:42:58 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID2] Params: cantidad=1, peso=, lote_id=2 2025-10-08 18:42:58 - [Stock Process][Prod0_ID2] Procesando stock con cantidad: 1 2025-10-08 18:42:58 - [Stock ESPECIAL][Prod0_ID2] Procesando producto especial con códigos de barras 2025-10-08 18:42:58 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID2] Params: {"pid":"2","codigo":"TES-002"} 2025-10-08 18:42:58 - [Stock Especial][Prod0_ID2] Producto especial - solo código de barras genérico: 2 2025-10-08 18:42:58 - [Stock Especial][Prod0_ID2] Actualizado código escaneado ID: 2. Descontado: 1 2025-10-08 18:42:58 - [Stock Strategy ESPECIAL][Prod0_ID2] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-08 18:42:58 - [Stock Update ESPECIAL][Prod0_ID2] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-08 18:42:58 - [Stock Update ESPECIAL][Prod0_ID2] Stock anterior: 99, cantidad a restar: 1, stock nuevo: 98 2025-10-08 18:42:58 - [Stock Update MASIVO][Prod0_ID2] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-08 18:42:58 - [Stock Update MASIVO][Prod0_ID2] Código genérico capturado: ID 2 2025-10-08 18:42:58 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 2, Cantidad: 1, Venta ID: 1 2025-10-08 18:42:58 - [Movimiento Stock] Registrando movimiento para Producto ID: 2, Cantidad: 1 2025-10-08 18:42:58 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 2 2025-10-08 18:42:58 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-08 18:42:58 - [DTE Detalle][Prod0_ID2] Agregado a venta_detalles_para_api con formato original 2025-10-08 18:42:58 - --- Fin procesamiento para Prod0_ID2 --- 2025-10-08 18:42:58 - Detalles de venta insertados y stock actualizado. 2025-10-08 18:42:58 - No se intentó la emisión DTE para Venta ID: 1 (Modo API inactivo o condiciones no cumplidas). 2025-10-08 18:42:58 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 1 2025-10-08 18:42:58 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-08 18:42:58 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-08 18:42:58 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-08 18:42:58 - Transacción completada con éxito para Venta ID: 1 2025-10-08 18:42:58 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-08 18:42:58 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-13 00:31:44 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-13 00:31:44 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-13 00:31:44 - Datos recibidos: {"productos":[{"id":1,"codigo":"TRO-001","cantidad":5,"precio":"2000.00","subtotal":10000,"es_busqueda_por_codigo":false}],"metodo_pago":"2","total":10000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"5"} 2025-10-13 00:31:44 - Content-Type: application/json 2025-10-13 00:31:44 - Resultado de json_decode: OK 2025-10-13 00:31:44 - ID sesión de caja recibido en JSON: 5 2025-10-13 00:31:44 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-13 00:31:44 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-13 00:31:44 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-13 00:31:44 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-13 00:31:44 - Modo API DTE está INACTIVO según configuración. 2025-10-13 00:31:44 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-13 00:31:44 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=5) 2025-10-13 00:31:44 - Venta insertada con ID: 1 2025-10-13 00:31:44 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-13 00:31:44 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 1) 2025-10-13 00:31:44 - Token de vista generado: 19b12f94731ec3eba7d1ce76512cfef2 2025-10-13 00:31:44 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-13 00:31:44 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-13 00:31:44 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-13 00:31:44 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-13 00:31:44 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-13 00:31:44 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-13 00:31:44 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-13 00:31:44 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-13 00:31:44 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-13 00:31:44 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-13 00:31:44 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-13 00:31:44 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-13 00:31:44 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-13 00:31:44 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-13 00:31:44 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-13 00:31:44 - --- Iniciando procesamiento para Prod0_ID1 --- 2025-10-13 00:31:44 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID1] Params: {"pid":1} 2025-10-13 00:31:44 - [Stock Check] Producto ID: 1, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-13 00:31:44 - [DEBUG PRODUCTO][Prod0_ID1] Datos recibidos: {"id":1,"codigo":"TRO-001","cantidad":5,"precio":"2000.00","subtotal":10000,"es_busqueda_por_codigo":false} 2025-10-13 00:31:44 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID1] Lote ID: 1, Cantidad reducida: 5 2025-10-13 00:31:44 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID1] Params: cantidad=5, peso=, lote_id=1 2025-10-13 00:31:44 - [Stock Process][Prod0_ID1] Procesando stock con cantidad: 5 2025-10-13 00:31:44 - [Stock ESPECIAL][Prod0_ID1] Procesando producto especial con códigos de barras 2025-10-13 00:31:44 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID1] Params: {"pid":"1","codigo":"TRO-001"} 2025-10-13 00:31:44 - [Stock Especial][Prod0_ID1] Producto especial - solo código de barras genérico: 1 2025-10-13 00:31:44 - [Stock Especial][Prod0_ID1] Actualizado código escaneado ID: 1. Descontado: 5 2025-10-13 00:31:44 - [Stock Strategy ESPECIAL][Prod0_ID1] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 5 2025-10-13 00:31:44 - [Stock Update ESPECIAL][Prod0_ID1] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-13 00:31:44 - [Stock Update ESPECIAL][Prod0_ID1] Stock anterior: 100, cantidad a restar: 5, stock nuevo: 95 2025-10-13 00:31:44 - [Stock Update MASIVO][Prod0_ID1] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-13 00:31:44 - [Stock Update MASIVO][Prod0_ID1] Código genérico capturado: ID 1 2025-10-13 00:31:44 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 1, Cantidad: 5, Venta ID: 1 2025-10-13 00:31:44 - [Movimiento Stock] Registrando movimiento para Producto ID: 1, Cantidad: 5 2025-10-13 00:31:44 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 1 2025-10-13 00:31:44 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-13 00:31:44 - [DTE Detalle][Prod0_ID1] Agregado a venta_detalles_para_api con formato original 2025-10-13 00:31:44 - --- Fin procesamiento para Prod0_ID1 --- 2025-10-13 00:31:44 - Detalles de venta insertados y stock actualizado. 2025-10-13 00:31:44 - No se intentó la emisión DTE para Venta ID: 1 (Modo API inactivo o condiciones no cumplidas). 2025-10-13 00:31:44 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 1 2025-10-13 00:31:44 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-13 00:31:44 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-13 00:31:44 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-13 00:31:44 - Transacción completada con éxito para Venta ID: 1 2025-10-13 00:31:44 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-13 00:31:44 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-13 07:56:23 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-13 07:56:23 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-13 07:56:23 - Datos recibidos: {"productos":[{"id":3,"codigo":"17603528386627","cantidad":2,"precio":2000,"subtotal":4000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":4,"codigo":"17603528386627","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":"2025-10-17"},{"id":5,"codigo":"17603528396885","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":"2025-10-30"}]}],"metodo_pago":"2","total":4000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"5"} 2025-10-13 07:56:23 - Content-Type: application/json 2025-10-13 07:56:23 - Resultado de json_decode: OK 2025-10-13 07:56:23 - ID sesión de caja recibido en JSON: 5 2025-10-13 07:56:23 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-13 07:56:23 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-13 07:56:23 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-13 07:56:23 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-13 07:56:23 - Modo API DTE está INACTIVO según configuración. 2025-10-13 07:56:23 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-13 07:56:23 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=5) 2025-10-13 07:56:23 - Venta insertada con ID: 2 2025-10-13 07:56:23 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-13 07:56:23 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 2) 2025-10-13 07:56:23 - Token de vista generado: a2a9ac004361d204c20f767d299ecb2f 2025-10-13 07:56:23 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-13 07:56:23 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-13 07:56:23 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-13 07:56:23 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-13 07:56:23 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-13 07:56:23 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-13 07:56:23 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-13 07:56:23 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-13 07:56:23 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-13 07:56:23 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-13 07:56:23 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-13 07:56:23 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-13 07:56:23 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-13 07:56:23 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-13 07:56:23 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-13 07:56:23 - --- Iniciando procesamiento para Prod0_ID3 --- 2025-10-13 07:56:23 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID3] Params: {"pid":3} 2025-10-13 07:56:23 - [Stock Check] Producto ID: 3, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-13 07:56:23 - [DEBUG PRODUCTO][Prod0_ID3] Datos recibidos: {"id":3,"codigo":"17603528386627","cantidad":2,"precio":2000,"subtotal":4000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":4,"codigo":"17603528386627","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":"2025-10-17"},{"id":5,"codigo":"17603528396885","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":"2025-10-30"}]} 2025-10-13 07:56:23 - [LOTE AUTO-DETECTADO][Prod0_ID3] Código escaneado 17603528386627 pertenece al LOTE1 (ID: 4) 2025-10-13 07:56:23 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID3] Params: cantidad=2, peso=, lote_id=4 2025-10-13 07:56:23 - [Stock Process][Prod0_ID3] Procesando stock con cantidad: 2 2025-10-13 07:56:23 - [Stock manual][Prod0_ID3] Aplicando lógica basada en cantidad. 2025-10-13 07:56:23 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID3] Params: {"pid":"3","codigo":"17603528386627"} 2025-10-13 07:56:23 - [Stock Manual][Prod0_ID3] Producto manual - código de barras específico: 4, numero_lote: LOTE1 2025-10-13 07:56:23 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID3_Esc] Params: {"cant":"2","id":4} 2025-10-13 07:56:23 - [Stock manual][Prod0_ID3] Actualizado código escaneado ID: 4. Descontado: 2 2025-10-13 07:56:23 - [Stock Strategy NORMAL][Prod0_ID3] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 2 2025-10-13 07:56:23 - [Stock Update NORMAL][Prod0_ID3] codigos_barras ya actualizado en sección anterior 2025-10-13 07:56:23 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 3, Cantidad: 2, Venta ID: 2 2025-10-13 07:56:23 - [Movimiento Stock] Registrando movimiento para Producto ID: 3, Cantidad: 2 2025-10-13 07:56:23 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 3 2025-10-13 07:56:23 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-13 07:56:23 - [Stock Strategy NORMAL][Prod0_ID3] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-13 07:56:23 - [DTE Detalle][Prod0_ID3] Agregado a venta_detalles_para_api con formato original 2025-10-13 07:56:23 - --- Fin procesamiento para Prod0_ID3 --- 2025-10-13 07:56:23 - Detalles de venta insertados y stock actualizado. 2025-10-13 07:56:23 - No se intentó la emisión DTE para Venta ID: 2 (Modo API inactivo o condiciones no cumplidas). 2025-10-13 07:56:23 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 2 2025-10-13 07:56:23 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-13 07:56:23 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-13 07:56:23 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-13 07:56:23 - Transacción completada con éxito para Venta ID: 2 2025-10-13 07:56:23 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-13 07:56:23 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-13 08:07:35 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-13 08:07:35 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-13 08:07:35 - Datos recibidos: {"productos":[{"id":5,"codigo":"17603536276739","cantidad":5,"precio":2000,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":8,"codigo":"17603536276739","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":9,"codigo":"17603536288763","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":10000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"6"} 2025-10-13 08:07:35 - Content-Type: application/json 2025-10-13 08:07:35 - Resultado de json_decode: OK 2025-10-13 08:07:35 - ID sesión de caja recibido en JSON: 6 2025-10-13 08:07:35 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-13 08:07:35 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-13 08:07:35 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-13 08:07:35 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-13 08:07:35 - Modo API DTE está INACTIVO según configuración. 2025-10-13 08:07:35 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-13 08:07:35 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=6) 2025-10-13 08:07:35 - Venta insertada con ID: 3 2025-10-13 08:07:35 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-13 08:07:35 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 3) 2025-10-13 08:07:35 - Token de vista generado: a4f9a94e5f9b5906938cdfdf4ded4b7f 2025-10-13 08:07:35 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-13 08:07:35 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-13 08:07:35 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-13 08:07:35 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-13 08:07:35 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-13 08:07:35 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-13 08:07:35 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-13 08:07:35 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-13 08:07:35 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-13 08:07:35 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-13 08:07:35 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-13 08:07:35 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-13 08:07:35 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-13 08:07:35 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-13 08:07:35 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-13 08:07:35 - --- Iniciando procesamiento para Prod0_ID5 --- 2025-10-13 08:07:35 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID5] Params: {"pid":5} 2025-10-13 08:07:35 - [Stock Check] Producto ID: 5, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-13 08:07:35 - [DEBUG PRODUCTO][Prod0_ID5] Datos recibidos: {"id":5,"codigo":"17603536276739","cantidad":5,"precio":2000,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":8,"codigo":"17603536276739","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":9,"codigo":"17603536288763","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-13 08:07:35 - [LOTE AUTO-DETECTADO][Prod0_ID5] Código escaneado 17603536276739 pertenece al LOTE1 (ID: 8) 2025-10-13 08:07:35 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID5] Params: cantidad=5, peso=, lote_id=8 2025-10-13 08:07:35 - [Stock Process][Prod0_ID5] Procesando stock con cantidad: 5 2025-10-13 08:07:35 - [Stock manual][Prod0_ID5] Aplicando lógica basada en cantidad. 2025-10-13 08:07:35 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID5] Params: {"pid":"5","codigo":"17603536276739"} 2025-10-13 08:07:35 - [Stock Manual][Prod0_ID5] Producto manual - código de barras específico: 8, numero_lote: LOTE1 2025-10-13 08:07:35 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID5_Esc] Params: {"cant":"5","id":8} 2025-10-13 08:07:35 - [Stock manual][Prod0_ID5] Actualizado código escaneado ID: 8. Descontado: 5 2025-10-13 08:07:35 - [Stock Strategy NORMAL][Prod0_ID5] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-13 08:07:35 - [Stock Update NORMAL][Prod0_ID5] codigos_barras ya actualizado en sección anterior 2025-10-13 08:07:35 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 5, Cantidad: 5, Venta ID: 3 2025-10-13 08:07:35 - [Movimiento Stock] Registrando movimiento para Producto ID: 5, Cantidad: 5 2025-10-13 08:07:35 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 5 2025-10-13 08:07:35 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-13 08:07:35 - [Stock Strategy NORMAL][Prod0_ID5] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-13 08:07:35 - [DTE Detalle][Prod0_ID5] Agregado a venta_detalles_para_api con formato original 2025-10-13 08:07:35 - --- Fin procesamiento para Prod0_ID5 --- 2025-10-13 08:07:35 - Detalles de venta insertados y stock actualizado. 2025-10-13 08:07:35 - No se intentó la emisión DTE para Venta ID: 3 (Modo API inactivo o condiciones no cumplidas). 2025-10-13 08:07:35 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 3 2025-10-13 08:07:35 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-13 08:07:35 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-13 08:07:35 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-13 08:07:35 - Transacción completada con éxito para Venta ID: 3 2025-10-13 08:07:35 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-13 08:07:35 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-13 08:50:37 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-13 08:50:37 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-13 08:50:37 - Datos recibidos: {"productos":[{"id":5,"codigo":"17603536276739","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":8,"codigo":"17603536276739","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":"2025-10-16"},{"id":9,"codigo":"17603536288763","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":"2025-10-22"}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"6"} 2025-10-13 08:50:37 - Content-Type: application/json 2025-10-13 08:50:37 - Resultado de json_decode: OK 2025-10-13 08:50:37 - ID sesión de caja recibido en JSON: 6 2025-10-13 08:50:37 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-13 08:50:37 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-13 08:50:37 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-13 08:50:37 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-13 08:50:37 - Modo API DTE está INACTIVO según configuración. 2025-10-13 08:50:37 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-13 08:50:37 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=6) 2025-10-13 08:50:37 - Venta insertada con ID: 4 2025-10-13 08:50:37 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-13 08:50:37 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 4) 2025-10-13 08:50:37 - Token de vista generado: dfa70399627155f4d2e7162099cccdc0 2025-10-13 08:50:37 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-13 08:50:37 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-13 08:50:37 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-13 08:50:37 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-13 08:50:37 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-13 08:50:37 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-13 08:50:37 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-13 08:50:37 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-13 08:50:37 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-13 08:50:37 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-13 08:50:37 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-13 08:50:37 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-13 08:50:37 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-13 08:50:37 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-13 08:50:37 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-13 08:50:37 - --- Iniciando procesamiento para Prod0_ID5 --- 2025-10-13 08:50:37 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID5] Params: {"pid":5} 2025-10-13 08:50:37 - [Stock Check] Producto ID: 5, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-13 08:50:37 - [DEBUG PRODUCTO][Prod0_ID5] Datos recibidos: {"id":5,"codigo":"17603536276739","cantidad":1,"precio":2000,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":8,"codigo":"17603536276739","tipo_codigo":"manual","cantidad":"95.00","fecha_vencimiento":"2025-10-16"},{"id":9,"codigo":"17603536288763","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":"2025-10-22"}]} 2025-10-13 08:50:37 - [LOTE AUTO-DETECTADO][Prod0_ID5] Código escaneado 17603536276739 pertenece al LOTE1 (ID: 8) 2025-10-13 08:50:37 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID5] Params: cantidad=1, peso=, lote_id=8 2025-10-13 08:50:37 - [Stock Process][Prod0_ID5] Procesando stock con cantidad: 1 2025-10-13 08:50:37 - [Stock manual][Prod0_ID5] Aplicando lógica basada en cantidad. 2025-10-13 08:50:37 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID5] Params: {"pid":"5","codigo":"17603536276739"} 2025-10-13 08:50:37 - [Stock Manual][Prod0_ID5] Producto manual - código de barras específico: 8, numero_lote: LOTE1 2025-10-13 08:50:37 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID5_Esc] Params: {"cant":"1","id":8} 2025-10-13 08:50:37 - [Stock manual][Prod0_ID5] Actualizado código escaneado ID: 8. Descontado: 1 2025-10-13 08:50:37 - [Stock Strategy NORMAL][Prod0_ID5] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-13 08:50:37 - [Stock Update NORMAL][Prod0_ID5] codigos_barras ya actualizado en sección anterior 2025-10-13 08:50:37 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 5, Cantidad: 1, Venta ID: 4 2025-10-13 08:50:37 - [Movimiento Stock] Registrando movimiento para Producto ID: 5, Cantidad: 1 2025-10-13 08:50:37 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 5 2025-10-13 08:50:37 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-13 08:50:37 - [Stock Strategy NORMAL][Prod0_ID5] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-13 08:50:37 - [DTE Detalle][Prod0_ID5] Agregado a venta_detalles_para_api con formato original 2025-10-13 08:50:37 - --- Fin procesamiento para Prod0_ID5 --- 2025-10-13 08:50:37 - Detalles de venta insertados y stock actualizado. 2025-10-13 08:50:37 - No se intentó la emisión DTE para Venta ID: 4 (Modo API inactivo o condiciones no cumplidas). 2025-10-13 08:50:37 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 4 2025-10-13 08:50:37 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-13 08:50:37 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-13 08:50:37 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-13 08:50:37 - Transacción completada con éxito para Venta ID: 4 2025-10-13 08:50:37 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-13 08:50:37 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-15 18:07:50 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-15 18:07:50 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-15 18:07:50 - Datos recibidos: {"productos":[{"id":17,"codigo":"QUE-017","cantidad":1,"precio":"8000.00","subtotal":12000,"es_busqueda_por_codigo":false,"peso_real":1.5}],"metodo_pago":"2","total":6723,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-15 18:07:50 - Content-Type: application/json 2025-10-15 18:07:50 - Resultado de json_decode: OK 2025-10-15 18:07:50 - ID sesión de caja recibido en JSON: 9 2025-10-15 18:07:50 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-15 18:07:50 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-15 18:07:50 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-15 18:07:50 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-15 18:07:50 - Modo API DTE está INACTIVO según configuración. 2025-10-15 18:07:50 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-15 18:07:50 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-15 18:07:50 - Venta insertada con ID: 5 2025-10-15 18:07:50 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-15 18:07:50 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 5) 2025-10-15 18:07:50 - Token de vista generado: e2fe5d44c235c72e8631eea573ade4a7 2025-10-15 18:07:50 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-15 18:07:50 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-15 18:07:50 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-15 18:07:50 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-15 18:07:50 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-15 18:07:50 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-15 18:07:50 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-15 18:07:50 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:07:50 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:07:50 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:07:50 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:07:50 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-15 18:07:50 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:07:50 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-15 18:07:50 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:07:50 - --- Iniciando procesamiento para Prod0_ID17 --- 2025-10-15 18:07:50 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID17] Params: {"pid":17} 2025-10-15 18:07:50 - [Stock Check] Producto ID: 17, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-15 18:07:50 - [Producto Por Peso][Prod0_ID17] Peso real: 1.5 Kg 2025-10-15 18:07:50 - [DEBUG PRODUCTO][Prod0_ID17] Datos recibidos: {"id":17,"codigo":"QUE-017","cantidad":1,"precio":"8000.00","subtotal":12000,"es_busqueda_por_codigo":false,"peso_real":1.5} 2025-10-15 18:07:50 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID17] Lote ID: 29, Cantidad reducida: 1.5 2025-10-15 18:07:50 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID17] Params: cantidad=1.5, peso=1.5, lote_id=29 2025-10-15 18:07:50 - [Detalle Actualizado][Prod0_ID17] Nombre especial actualizado a: Producto (1.5 Kg) 2025-10-15 18:07:50 - [Stock Process][Prod0_ID17] Procesando stock con cantidad: 1.5 2025-10-15 18:07:50 - [Stock ESPECIAL][Prod0_ID17] Procesando producto especial con códigos de barras 2025-10-15 18:07:50 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID17] Params: {"pid":"17","codigo":"QUE-017"} 2025-10-15 18:07:50 - [Stock Especial][Prod0_ID17] Producto especial - solo código de barras genérico: 30 2025-10-15 18:07:50 - [Stock Especial][Prod0_ID17] Actualizado código escaneado ID: 30. Descontado: 1.5 2025-10-15 18:07:50 - [Stock Strategy ESPECIAL][Prod0_ID17] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 1.5 2025-10-15 18:07:50 - [Stock Update ESPECIAL][Prod0_ID17] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-15 18:07:50 - [Stock Update ESPECIAL][Prod0_ID17] Stock anterior: 8, cantidad a restar: 1.5, stock nuevo: 6.5 2025-10-15 18:07:50 - [Stock Update MASIVO][Prod0_ID17] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-15 18:07:50 - [Stock Update MASIVO][Prod0_ID17] Código genérico capturado: ID 30 2025-10-15 18:07:50 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 17, Cantidad: 1.5, Venta ID: 5 2025-10-15 18:07:50 - [Movimiento Stock] Registrando movimiento para Producto ID: 17, Cantidad: 1.5 2025-10-15 18:07:50 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 17 2025-10-15 18:07:50 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-15 18:07:50 - [DTE Detalle][Prod0_ID17] Agregado a venta_detalles_para_api con formato original 2025-10-15 18:07:50 - --- Fin procesamiento para Prod0_ID17 --- 2025-10-15 18:07:50 - Detalles de venta insertados y stock actualizado. 2025-10-15 18:07:50 - No se intentó la emisión DTE para Venta ID: 5 (Modo API inactivo o condiciones no cumplidas). 2025-10-15 18:07:50 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 5 2025-10-15 18:07:50 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-15 18:07:50 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-15 18:07:50 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-15 18:07:50 - Transacción completada con éxito para Venta ID: 5 2025-10-15 18:07:50 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-15 18:07:50 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-15 18:15:51 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-15 18:15:51 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-15 18:15:51 - Datos recibidos: {"productos":[{"id":17,"codigo":"QUE-017","cantidad":1.5,"precio":"8000.00","subtotal":12000,"es_busqueda_por_codigo":false,"peso_real":1.5}],"metodo_pago":"2","total":10084,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-15 18:15:51 - Content-Type: application/json 2025-10-15 18:15:51 - Resultado de json_decode: OK 2025-10-15 18:15:51 - ID sesión de caja recibido en JSON: 9 2025-10-15 18:15:51 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-15 18:15:51 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-15 18:15:51 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-15 18:15:51 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-15 18:15:51 - Modo API DTE está INACTIVO según configuración. 2025-10-15 18:15:51 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-15 18:15:51 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-15 18:15:51 - Venta insertada con ID: 6 2025-10-15 18:15:51 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-15 18:15:51 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 6) 2025-10-15 18:15:51 - Token de vista generado: 8d0befa3f74ad4edf853cd064b28a680 2025-10-15 18:15:51 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-15 18:15:51 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-15 18:15:51 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-15 18:15:51 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-15 18:15:51 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-15 18:15:51 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-15 18:15:51 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-15 18:15:51 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:15:51 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:15:51 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:15:51 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:15:51 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-15 18:15:51 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:15:51 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-15 18:15:51 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:15:51 - --- Iniciando procesamiento para Prod0_ID17 --- 2025-10-15 18:15:51 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID17] Params: {"pid":17} 2025-10-15 18:15:51 - [Stock Check] Producto ID: 17, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-15 18:15:51 - [Producto Por Peso][Prod0_ID17] Peso real: 1.5 Kg 2025-10-15 18:15:51 - [DEBUG PRODUCTO][Prod0_ID17] Datos recibidos: {"id":17,"codigo":"QUE-017","cantidad":1.5,"precio":"8000.00","subtotal":12000,"es_busqueda_por_codigo":false,"peso_real":1.5} 2025-10-15 18:15:51 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID17] Lote ID: 29, Cantidad reducida: 1.5 2025-10-15 18:15:51 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID17] Params: cantidad=1.5, peso=1.5, lote_id=29 2025-10-15 18:15:51 - [Detalle Actualizado][Prod0_ID17] Nombre especial actualizado a: Producto (1.5 Kg) 2025-10-15 18:15:51 - [Stock Process][Prod0_ID17] Procesando stock con cantidad: 1.5 2025-10-15 18:15:51 - [Stock ESPECIAL][Prod0_ID17] Procesando producto especial con códigos de barras 2025-10-15 18:15:51 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID17] Params: {"pid":"17","codigo":"QUE-017"} 2025-10-15 18:15:51 - [Stock Especial][Prod0_ID17] Producto especial - solo código de barras genérico: 30 2025-10-15 18:15:51 - [Stock Especial][Prod0_ID17] Actualizado código escaneado ID: 30. Descontado: 1.5 2025-10-15 18:15:51 - [Stock Strategy ESPECIAL][Prod0_ID17] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 1.5 2025-10-15 18:15:51 - [Stock Update ESPECIAL][Prod0_ID17] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-15 18:15:51 - [Stock Update ESPECIAL][Prod0_ID17] Stock anterior: 6.5, cantidad a restar: 1.5, stock nuevo: 5 2025-10-15 18:15:51 - [Stock Update MASIVO][Prod0_ID17] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-15 18:15:51 - [Stock Update MASIVO][Prod0_ID17] Código genérico capturado: ID 30 2025-10-15 18:15:51 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 17, Cantidad: 1.5, Venta ID: 6 2025-10-15 18:15:51 - [Movimiento Stock] Registrando movimiento para Producto ID: 17, Cantidad: 1.5 2025-10-15 18:15:51 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 17 2025-10-15 18:15:51 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-15 18:15:51 - [DTE Detalle][Prod0_ID17] Agregado a venta_detalles_para_api con formato original 2025-10-15 18:15:51 - --- Fin procesamiento para Prod0_ID17 --- 2025-10-15 18:15:51 - Detalles de venta insertados y stock actualizado. 2025-10-15 18:15:51 - No se intentó la emisión DTE para Venta ID: 6 (Modo API inactivo o condiciones no cumplidas). 2025-10-15 18:15:51 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 6 2025-10-15 18:15:51 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-15 18:15:51 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-15 18:15:51 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-15 18:15:51 - Transacción completada con éxito para Venta ID: 6 2025-10-15 18:15:51 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-15 18:15:51 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-15 18:17:19 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-15 18:17:19 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-15 18:17:19 - Datos recibidos: {"productos":[{"id":15,"codigo":"17605610813600","cantidad":4,"precio":2500,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":25,"codigo":"17605610813600","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":26,"codigo":"17605610821216","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":27,"codigo":"17605611437059","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":28,"codigo":"17605612133767","tipo_codigo":"manual","cantidad":"1.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":8403,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-15 18:17:19 - Content-Type: application/json 2025-10-15 18:17:19 - Resultado de json_decode: OK 2025-10-15 18:17:19 - ID sesión de caja recibido en JSON: 9 2025-10-15 18:17:19 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-15 18:17:19 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-15 18:17:19 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-15 18:17:19 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-15 18:17:19 - Modo API DTE está INACTIVO según configuración. 2025-10-15 18:17:19 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-15 18:17:19 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-15 18:17:19 - Venta insertada con ID: 7 2025-10-15 18:17:19 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-15 18:17:19 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 7) 2025-10-15 18:17:19 - Token de vista generado: fbcd3c2f794eb6bb0557b29caa748d54 2025-10-15 18:17:19 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-15 18:17:19 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-15 18:17:19 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-15 18:17:19 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-15 18:17:19 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-15 18:17:19 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-15 18:17:19 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-15 18:17:19 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:17:19 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:17:19 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:17:19 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:17:19 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-15 18:17:19 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:17:19 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-15 18:17:19 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:17:19 - --- Iniciando procesamiento para Prod0_ID15 --- 2025-10-15 18:17:19 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID15] Params: {"pid":15} 2025-10-15 18:17:19 - [Stock Check] Producto ID: 15, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-15 18:17:19 - [DEBUG PRODUCTO][Prod0_ID15] Datos recibidos: {"id":15,"codigo":"17605610813600","cantidad":4,"precio":2500,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":25,"codigo":"17605610813600","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":26,"codigo":"17605610821216","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":27,"codigo":"17605611437059","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":28,"codigo":"17605612133767","tipo_codigo":"manual","cantidad":"1.00","fecha_vencimiento":null}]} 2025-10-15 18:17:19 - [LOTE AUTO-DETECTADO][Prod0_ID15] Código escaneado 17605610813600 pertenece al LOTE1 (ID: 25) 2025-10-15 18:17:19 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID15] Params: cantidad=4, peso=, lote_id=25 2025-10-15 18:17:19 - [Stock Process][Prod0_ID15] Procesando stock con cantidad: 4 2025-10-15 18:17:19 - [Stock manual][Prod0_ID15] Aplicando lógica basada en cantidad. 2025-10-15 18:17:19 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID15] Params: {"pid":"15","codigo":"17605610813600"} 2025-10-15 18:17:19 - [Stock Manual][Prod0_ID15] Producto manual - código de barras específico: 25, numero_lote: LOTE1 2025-10-15 18:17:19 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID15_Esc] Params: {"cant":"4","id":25} 2025-10-15 18:17:19 - [Stock manual][Prod0_ID15] Actualizado código escaneado ID: 25. Descontado: 4 2025-10-15 18:17:19 - [Stock Strategy NORMAL][Prod0_ID15] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 4 2025-10-15 18:17:19 - [Stock Update NORMAL][Prod0_ID15] codigos_barras ya actualizado en sección anterior 2025-10-15 18:17:19 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 15, Cantidad: 4, Venta ID: 7 2025-10-15 18:17:19 - [Movimiento Stock] Registrando movimiento para Producto ID: 15, Cantidad: 4 2025-10-15 18:17:19 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 15 2025-10-15 18:17:19 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-15 18:17:19 - [Stock Strategy NORMAL][Prod0_ID15] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-15 18:17:19 - [DTE Detalle][Prod0_ID15] Agregado a venta_detalles_para_api con formato original 2025-10-15 18:17:19 - --- Fin procesamiento para Prod0_ID15 --- 2025-10-15 18:17:19 - Detalles de venta insertados y stock actualizado. 2025-10-15 18:17:19 - No se intentó la emisión DTE para Venta ID: 7 (Modo API inactivo o condiciones no cumplidas). 2025-10-15 18:17:19 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 7 2025-10-15 18:17:19 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-15 18:17:19 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-15 18:17:19 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-15 18:17:19 - Transacción completada con éxito para Venta ID: 7 2025-10-15 18:17:19 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-15 18:17:19 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-15 18:20:58 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-15 18:20:58 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-15 18:20:58 - Datos recibidos: {"productos":[{"id":15,"codigo":"17605610821216","cantidad":2,"precio":2500,"subtotal":5000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":25,"codigo":"17605610813600","tipo_codigo":"manual","cantidad":"99.00","fecha_vencimiento":null},{"id":26,"codigo":"17605610821216","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":27,"codigo":"17605611437059","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":28,"codigo":"17605612133767","tipo_codigo":"manual","cantidad":"1.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":4202,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-15 18:20:58 - Content-Type: application/json 2025-10-15 18:20:58 - Resultado de json_decode: OK 2025-10-15 18:20:58 - ID sesión de caja recibido en JSON: 9 2025-10-15 18:20:58 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-15 18:20:58 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-15 18:20:58 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-15 18:20:58 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-15 18:20:58 - Modo API DTE está INACTIVO según configuración. 2025-10-15 18:20:58 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-15 18:20:58 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-15 18:20:58 - Venta insertada con ID: 8 2025-10-15 18:20:58 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-15 18:20:58 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 8) 2025-10-15 18:20:58 - Token de vista generado: adabce003fab0fd149c65d2a55986c0b 2025-10-15 18:20:58 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-15 18:20:58 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-15 18:20:58 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-15 18:20:58 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-15 18:20:58 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-15 18:20:58 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-15 18:20:58 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-15 18:20:58 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:20:58 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:20:58 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:20:58 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:20:58 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-15 18:20:58 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:20:58 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-15 18:20:58 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:20:58 - --- Iniciando procesamiento para Prod0_ID15 --- 2025-10-15 18:20:58 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID15] Params: {"pid":15} 2025-10-15 18:20:58 - [Stock Check] Producto ID: 15, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-15 18:20:58 - [DEBUG PRODUCTO][Prod0_ID15] Datos recibidos: {"id":15,"codigo":"17605610821216","cantidad":2,"precio":2500,"subtotal":5000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","lote_especifico":2,"codigos_disponibles":[{"id":25,"codigo":"17605610813600","tipo_codigo":"manual","cantidad":"99.00","fecha_vencimiento":null},{"id":26,"codigo":"17605610821216","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":27,"codigo":"17605611437059","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":28,"codigo":"17605612133767","tipo_codigo":"manual","cantidad":"1.00","fecha_vencimiento":null}]} 2025-10-15 18:20:58 - [LOTE ESPECÍFICO NORMAL][Prod0_ID15] Usando LOTE2 (codigo_barras_id: 26) con 100.00 unidades 2025-10-15 18:20:58 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID15] Params: cantidad=2, peso=, lote_id=26 2025-10-15 18:20:58 - [Stock Process][Prod0_ID15] Procesando stock con cantidad: 2 2025-10-15 18:20:58 - [Stock manual][Prod0_ID15] Aplicando lógica basada en cantidad. 2025-10-15 18:20:58 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID15] Params: {"pid":"15","codigo":"17605610821216"} 2025-10-15 18:20:58 - [Stock Manual][Prod0_ID15] Producto manual - código de barras específico: 26, numero_lote: LOTE2 2025-10-15 18:20:58 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID15_Esc] Params: {"cant":"2","id":26} 2025-10-15 18:20:58 - [Stock manual][Prod0_ID15] Actualizado código escaneado ID: 26. Descontado: 2 2025-10-15 18:20:58 - [Stock Strategy NORMAL][Prod0_ID15] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 2 2025-10-15 18:20:58 - [Stock Update NORMAL][Prod0_ID15] codigos_barras ya actualizado en sección anterior 2025-10-15 18:20:58 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 15, Cantidad: 2, Venta ID: 8 2025-10-15 18:20:58 - [Movimiento Stock] Registrando movimiento para Producto ID: 15, Cantidad: 2 2025-10-15 18:20:58 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 15 2025-10-15 18:20:58 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-15 18:20:58 - [Stock Strategy NORMAL][Prod0_ID15] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-15 18:20:58 - [DTE Detalle][Prod0_ID15] Agregado a venta_detalles_para_api con formato original 2025-10-15 18:20:58 - --- Fin procesamiento para Prod0_ID15 --- 2025-10-15 18:20:58 - Detalles de venta insertados y stock actualizado. 2025-10-15 18:20:58 - No se intentó la emisión DTE para Venta ID: 8 (Modo API inactivo o condiciones no cumplidas). 2025-10-15 18:20:58 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 8 2025-10-15 18:20:58 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-15 18:20:58 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-15 18:20:58 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-15 18:20:58 - Transacción completada con éxito para Venta ID: 8 2025-10-15 18:20:58 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-15 18:20:58 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-15 18:33:45 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-15 18:33:45 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-15 18:33:45 - Datos recibidos: {"productos":[{"id":15,"codigo":"17605610821216","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":true,"tipo_codigo":"manual","codigo_barras_id":26,"lote_especifico":2},{"id":15,"codigo":"17605612133767","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":true,"tipo_codigo":"manual","codigo_barras_id":28,"lote_especifico":4}],"metodo_pago":"2","total":4202,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-15 18:33:45 - Content-Type: application/json 2025-10-15 18:33:45 - Resultado de json_decode: OK 2025-10-15 18:33:45 - ID sesión de caja recibido en JSON: 9 2025-10-15 18:33:45 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-15 18:33:45 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-15 18:33:45 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-15 18:33:45 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-15 18:33:45 - Modo API DTE está INACTIVO según configuración. 2025-10-15 18:33:45 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-15 18:33:45 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-15 18:33:45 - Venta insertada con ID: 9 2025-10-15 18:33:45 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-15 18:33:45 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 9) 2025-10-15 18:33:45 - Token de vista generado: 9b2ef1a125d21dfc4cc54496ebd899ca 2025-10-15 18:33:45 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-15 18:33:45 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-15 18:33:45 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-15 18:33:45 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-15 18:33:45 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-15 18:33:45 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-15 18:33:45 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-15 18:33:45 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:33:45 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:33:45 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:33:45 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:33:45 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-15 18:33:45 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:33:45 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-15 18:33:45 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:33:45 - --- Iniciando procesamiento para Prod0_ID15 --- 2025-10-15 18:33:45 - [Frontend][Prod0_ID15] Usando codigo_barras_id del frontend: 26 2025-10-15 18:33:45 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID15] Params: {"pid":15} 2025-10-15 18:33:45 - [Stock Check] Producto ID: 15, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-15 18:33:45 - [DEBUG PRODUCTO][Prod0_ID15] Datos recibidos: {"id":15,"codigo":"17605610821216","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":true,"tipo_codigo":"manual","codigo_barras_id":26,"lote_especifico":2} 2025-10-15 18:33:45 - [LOTE ESPECÍFICO NORMAL][Prod0_ID15] Usando LOTE2 (codigo_barras_id: 26) con 100.00 unidades 2025-10-15 18:33:45 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID15] Params: cantidad=1, peso=, lote_id=26 2025-10-15 18:33:45 - [Stock Process][Prod0_ID15] Procesando stock con cantidad: 1 2025-10-15 18:33:45 - [Stock manual][Prod0_ID15] Aplicando lógica basada en cantidad. 2025-10-15 18:33:45 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID15] Params: {"pid":"15","codigo":"17605610821216"} 2025-10-15 18:33:45 - [Stock Manual][Prod0_ID15] Producto manual - código de barras específico: 26, numero_lote: LOTE2 2025-10-15 18:33:45 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID15_Esc] Params: {"cant":"1","id":26} 2025-10-15 18:33:45 - [Stock manual][Prod0_ID15] Actualizado código escaneado ID: 26. Descontado: 1 2025-10-15 18:33:45 - [Stock Strategy NORMAL][Prod0_ID15] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-15 18:33:45 - [Stock Update NORMAL][Prod0_ID15] codigos_barras ya actualizado en sección anterior 2025-10-15 18:33:45 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 15, Cantidad: 1, Venta ID: 9 2025-10-15 18:33:45 - [Movimiento Stock] Registrando movimiento para Producto ID: 15, Cantidad: 1 2025-10-15 18:33:45 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 15 2025-10-15 18:33:45 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-15 18:33:45 - [Stock Strategy NORMAL][Prod0_ID15] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-15 18:33:45 - [DTE Detalle][Prod0_ID15] Agregado a venta_detalles_para_api con formato original 2025-10-15 18:33:45 - --- Fin procesamiento para Prod0_ID15 --- 2025-10-15 18:33:45 - --- Iniciando procesamiento para Prod1_ID15 --- 2025-10-15 18:33:45 - [Frontend][Prod1_ID15] Usando codigo_barras_id del frontend: 28 2025-10-15 18:33:45 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID15] Params: {"pid":15} 2025-10-15 18:33:45 - [Stock Check] Producto ID: 15, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-15 18:33:45 - [DEBUG PRODUCTO][Prod1_ID15] Datos recibidos: {"id":15,"codigo":"17605612133767","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":true,"tipo_codigo":"manual","codigo_barras_id":28,"lote_especifico":4} 2025-10-15 18:33:45 - [LOTE ESPECÍFICO NORMAL][Prod1_ID15] Usando LOTE4 (codigo_barras_id: 28) con 1.00 unidades 2025-10-15 18:33:45 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID15] Params: cantidad=1, peso=, lote_id=28 2025-10-15 18:33:45 - [Stock Process][Prod1_ID15] Procesando stock con cantidad: 1 2025-10-15 18:33:45 - [Stock manual][Prod1_ID15] Aplicando lógica basada en cantidad. 2025-10-15 18:33:45 - [DB EXECUTE][ID: FindCodeManualLoop_Prod1_ID15] Params: {"pid":"15","codigo":"17605612133767"} 2025-10-15 18:33:45 - [Stock Manual][Prod1_ID15] Producto manual - código de barras específico: 28, numero_lote: LOTE4 2025-10-15 18:33:45 - [DB EXECUTE][ID: DeleteCodeManualLoop_Prod1_ID15_Esc] Params: {"id":28} 2025-10-15 18:33:45 - [Stock manual][Prod1_ID15] Eliminado código escaneado ID: 28 (Cantidad: 1.00) 2025-10-15 18:33:45 - [Stock Strategy NORMAL][Prod1_ID15] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-15 18:33:45 - [Stock Update NORMAL][Prod1_ID15] codigos_barras ya actualizado en sección anterior 2025-10-15 18:33:45 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 15, Cantidad: 1, Venta ID: 9 2025-10-15 18:33:45 - [Movimiento Stock] Registrando movimiento para Producto ID: 15, Cantidad: 1 2025-10-15 18:33:45 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 15 2025-10-15 18:33:45 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-15 18:33:45 - [Stock Strategy NORMAL][Prod1_ID15] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-15 18:33:45 - [DTE Detalle][Prod1_ID15] Agregado a venta_detalles_para_api con formato original 2025-10-15 18:33:45 - --- Fin procesamiento para Prod1_ID15 --- 2025-10-15 18:33:45 - Detalles de venta insertados y stock actualizado. 2025-10-15 18:33:45 - No se intentó la emisión DTE para Venta ID: 9 (Modo API inactivo o condiciones no cumplidas). 2025-10-15 18:33:45 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 9 2025-10-15 18:33:45 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-15 18:33:45 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-15 18:33:45 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-15 18:33:45 - Transacción completada con éxito para Venta ID: 9 2025-10-15 18:33:45 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-15 18:33:45 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-15 18:57:25 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-15 18:57:25 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-15 18:57:25 - Datos recibidos: {"productos":[{"id":15,"codigo":"17605610821216","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":true,"tipo_codigo":"manual","codigo_barras_id":26,"lote_especifico":2},{"id":15,"codigo":"17605653671991","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":true,"tipo_codigo":"manual","codigo_barras_id":31,"lote_especifico":4}],"metodo_pago":"2","total":4202,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-15 18:57:25 - Content-Type: application/json 2025-10-15 18:57:25 - Resultado de json_decode: OK 2025-10-15 18:57:25 - ID sesión de caja recibido en JSON: 9 2025-10-15 18:57:25 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-15 18:57:25 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-15 18:57:25 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-15 18:57:25 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-15 18:57:25 - Modo API DTE está INACTIVO según configuración. 2025-10-15 18:57:25 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-15 18:57:25 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-15 18:57:25 - Venta insertada con ID: 10 2025-10-15 18:57:25 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-15 18:57:25 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 10) 2025-10-15 18:57:25 - Token de vista generado: 5d6275e3f6d8947c6e21e94f861186e0 2025-10-15 18:57:25 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-15 18:57:25 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-15 18:57:25 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-15 18:57:25 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-15 18:57:25 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-15 18:57:25 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-15 18:57:25 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-15 18:57:25 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:57:25 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:57:25 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:57:25 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:57:25 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-15 18:57:25 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-15 18:57:25 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-15 18:57:25 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-15 18:57:25 - --- Iniciando procesamiento para Prod0_ID15 --- 2025-10-15 18:57:25 - [Frontend][Prod0_ID15] Usando codigo_barras_id del frontend: 26 2025-10-15 18:57:25 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID15] Params: {"pid":15} 2025-10-15 18:57:25 - [Stock Check] Producto ID: 15, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-15 18:57:25 - [DEBUG PRODUCTO][Prod0_ID15] Datos recibidos: {"id":15,"codigo":"17605610821216","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":true,"tipo_codigo":"manual","codigo_barras_id":26,"lote_especifico":2} 2025-10-15 18:57:25 - [LOTE ESPECÍFICO NORMAL][Prod0_ID15] Usando LOTE2 (codigo_barras_id: 26) con 99.00 unidades 2025-10-15 18:57:25 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID15] Params: cantidad=1, peso=, lote_id=26 2025-10-15 18:57:25 - [Stock Process][Prod0_ID15] Procesando stock con cantidad: 1 2025-10-15 18:57:25 - [Stock manual][Prod0_ID15] Aplicando lógica basada en cantidad. 2025-10-15 18:57:25 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID15] Params: {"pid":"15","codigo":"17605610821216"} 2025-10-15 18:57:25 - [Stock Manual][Prod0_ID15] Producto manual - código de barras específico: 26, numero_lote: LOTE2 2025-10-15 18:57:25 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID15_Esc] Params: {"cant":"1","id":26} 2025-10-15 18:57:25 - [Stock manual][Prod0_ID15] Actualizado código escaneado ID: 26. Descontado: 1 2025-10-15 18:57:25 - [Stock Strategy NORMAL][Prod0_ID15] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-15 18:57:25 - [Stock Update NORMAL][Prod0_ID15] codigos_barras ya actualizado en sección anterior 2025-10-15 18:57:25 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 15, Cantidad: 1, Venta ID: 10 2025-10-15 18:57:25 - [Movimiento Stock] Registrando movimiento para Producto ID: 15, Cantidad: 1 2025-10-15 18:57:25 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 15 2025-10-15 18:57:25 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-15 18:57:25 - [Stock Strategy NORMAL][Prod0_ID15] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-15 18:57:25 - [DTE Detalle][Prod0_ID15] Agregado a venta_detalles_para_api con formato original 2025-10-15 18:57:25 - --- Fin procesamiento para Prod0_ID15 --- 2025-10-15 18:57:25 - --- Iniciando procesamiento para Prod1_ID15 --- 2025-10-15 18:57:25 - [Frontend][Prod1_ID15] Usando codigo_barras_id del frontend: 31 2025-10-15 18:57:25 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID15] Params: {"pid":15} 2025-10-15 18:57:25 - [Stock Check] Producto ID: 15, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-15 18:57:25 - [DEBUG PRODUCTO][Prod1_ID15] Datos recibidos: {"id":15,"codigo":"17605653671991","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":true,"tipo_codigo":"manual","codigo_barras_id":31,"lote_especifico":4} 2025-10-15 18:57:25 - [LOTE ESPECÍFICO NORMAL][Prod1_ID15] Usando LOTE4 (codigo_barras_id: 31) con 10.00 unidades 2025-10-15 18:57:25 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID15] Params: cantidad=1, peso=, lote_id=31 2025-10-15 18:57:25 - [Stock Process][Prod1_ID15] Procesando stock con cantidad: 1 2025-10-15 18:57:25 - [Stock manual][Prod1_ID15] Aplicando lógica basada en cantidad. 2025-10-15 18:57:25 - [DB EXECUTE][ID: FindCodeManualLoop_Prod1_ID15] Params: {"pid":"15","codigo":"17605653671991"} 2025-10-15 18:57:25 - [Stock Manual][Prod1_ID15] Producto manual - código de barras específico: 31, numero_lote: LOTE4 2025-10-15 18:57:25 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod1_ID15_Esc] Params: {"cant":"1","id":31} 2025-10-15 18:57:25 - [Stock manual][Prod1_ID15] Actualizado código escaneado ID: 31. Descontado: 1 2025-10-15 18:57:25 - [Stock Strategy NORMAL][Prod1_ID15] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-15 18:57:25 - [Stock Update NORMAL][Prod1_ID15] codigos_barras ya actualizado en sección anterior 2025-10-15 18:57:25 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 15, Cantidad: 1, Venta ID: 10 2025-10-15 18:57:25 - [Movimiento Stock] Registrando movimiento para Producto ID: 15, Cantidad: 1 2025-10-15 18:57:25 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 15 2025-10-15 18:57:25 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-15 18:57:25 - [Stock Strategy NORMAL][Prod1_ID15] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-15 18:57:25 - [DTE Detalle][Prod1_ID15] Agregado a venta_detalles_para_api con formato original 2025-10-15 18:57:25 - --- Fin procesamiento para Prod1_ID15 --- 2025-10-15 18:57:25 - Detalles de venta insertados y stock actualizado. 2025-10-15 18:57:25 - No se intentó la emisión DTE para Venta ID: 10 (Modo API inactivo o condiciones no cumplidas). 2025-10-15 18:57:25 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 10 2025-10-15 18:57:25 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-15 18:57:25 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-15 18:57:25 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-15 18:57:25 - Transacción completada con éxito para Venta ID: 10 2025-10-15 18:57:25 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-15 18:57:25 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-16 14:50:02 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-16 14:50:02 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-16 14:50:02 - Datos recibidos: {"productos":[{"id":17,"codigo":"QUE-017","cantidad":0.55,"precio":"8000.00","subtotal":4400,"es_busqueda_por_codigo":false,"peso_real":0.55}],"metodo_pago":"2","total":3697,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-16 14:50:02 - Content-Type: application/json 2025-10-16 14:50:02 - Resultado de json_decode: OK 2025-10-16 14:50:02 - ID sesión de caja recibido en JSON: 9 2025-10-16 14:50:02 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-16 14:50:02 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-16 14:50:02 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-16 14:50:02 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-16 14:50:02 - Modo API DTE está INACTIVO según configuración. 2025-10-16 14:50:02 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-16 14:50:02 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-16 14:50:02 - Venta insertada con ID: 11 2025-10-16 14:50:02 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-16 14:50:02 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 11) 2025-10-16 14:50:02 - Token de vista generado: ce9a8e511c081818e902bfd4a6e979c0 2025-10-16 14:50:02 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id) 2025-10-16 14:50:02 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-16 14:50:02 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-16 14:50:02 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-16 14:50:02 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 14:50:02 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-16 14:50:02 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-16 14:50:02 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 14:50:02 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 14:50:02 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 14:50:02 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 14:50:02 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-16 14:50:02 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 14:50:02 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-16 14:50:02 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 14:50:02 - --- Iniciando procesamiento para Prod0_ID17 --- 2025-10-16 14:50:02 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID17] Params: {"pid":17} 2025-10-16 14:50:02 - [Stock Check] Producto ID: 17, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-16 14:50:02 - [Producto Por Peso][Prod0_ID17] Peso real: 0.55 Kg 2025-10-16 14:50:02 - [DEBUG PRODUCTO][Prod0_ID17] Datos recibidos: {"id":17,"codigo":"QUE-017","cantidad":0.55,"precio":"8000.00","subtotal":4400,"es_busqueda_por_codigo":false,"peso_real":0.55} 2025-10-16 14:50:02 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID17] Lote ID: 29, Cantidad reducida: 0.55 2025-10-16 14:50:02 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID17] Params: cantidad=0.55, peso=0.55, lote_id=29 2025-10-16 14:50:02 - [Detalle Actualizado][Prod0_ID17] Nombre especial actualizado a: Producto (0.55 Kg) 2025-10-16 14:50:02 - [Stock Process][Prod0_ID17] Procesando stock con cantidad: 0.55 2025-10-16 14:50:02 - [Stock ESPECIAL][Prod0_ID17] Procesando producto especial con códigos de barras 2025-10-16 14:50:02 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID17] Params: {"pid":"17","codigo":"QUE-017"} 2025-10-16 14:50:02 - [Stock Especial][Prod0_ID17] Producto especial - solo código de barras genérico: 30 2025-10-16 14:50:02 - [Stock Especial][Prod0_ID17] Actualizado código escaneado ID: 30. Descontado: 0.55 2025-10-16 14:50:02 - [Stock Strategy ESPECIAL][Prod0_ID17] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 0.55 2025-10-16 14:50:02 - [Stock Update ESPECIAL][Prod0_ID17] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-16 14:50:02 - [Stock Update ESPECIAL][Prod0_ID17] Stock anterior: 5, cantidad a restar: 0.55, stock nuevo: 4.45 2025-10-16 14:50:02 - [Stock Update MASIVO][Prod0_ID17] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-16 14:50:02 - [Stock Update MASIVO][Prod0_ID17] Código genérico capturado: ID 30 2025-10-16 14:50:02 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 17, Cantidad: 0.55, Venta ID: 11 2025-10-16 14:50:02 - [Movimiento Stock] Registrando movimiento para Producto ID: 17, Cantidad: 0.55 2025-10-16 14:50:02 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 17 2025-10-16 14:50:02 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 14:50:02 - [DTE Detalle][Prod0_ID17] Agregado a venta_detalles_para_api con formato original 2025-10-16 14:50:02 - --- Fin procesamiento para Prod0_ID17 --- 2025-10-16 14:50:02 - Detalles de venta insertados y stock actualizado. 2025-10-16 14:50:02 - No se intentó la emisión DTE para Venta ID: 11 (Modo API inactivo o condiciones no cumplidas). 2025-10-16 14:50:02 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 11 2025-10-16 14:50:02 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-16 14:50:02 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-16 14:50:02 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-16 14:50:02 - Transacción completada con éxito para Venta ID: 11 2025-10-16 14:50:02 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-16 14:50:02 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-16 16:02:42 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-16 16:02:42 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-16 16:02:42 - Datos recibidos: {"productos":[{"id":15,"codigo":"17605610813600","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":25,"codigo":"17605610813600","tipo_codigo":"manual","cantidad":"99.00","fecha_vencimiento":null},{"id":26,"codigo":"17605610821216","tipo_codigo":"manual","cantidad":"98.00","fecha_vencimiento":null},{"id":27,"codigo":"17605611437059","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":31,"codigo":"17605653671991","tipo_codigo":"manual","cantidad":"10.00","fecha_vencimiento":null}]},{"id":16,"codigo":"PAN-016","cantidad":1,"precio":"2500.00","subtotal":2500,"es_busqueda_por_codigo":false},{"id":17,"codigo":"QUE-017","cantidad":0.624,"precio":"8000.00","subtotal":4992,"es_busqueda_por_codigo":false,"peso_real":0.624}],"metodo_pago":"1","total":8397,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-16 16:02:42 - Content-Type: application/json 2025-10-16 16:02:42 - Resultado de json_decode: OK 2025-10-16 16:02:42 - ID sesión de caja recibido en JSON: 9 2025-10-16 16:02:42 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-16 16:02:42 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-16 16:02:42 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-16 16:02:42 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-16 16:02:42 - Modo API DTE está INACTIVO según configuración. 2025-10-16 16:02:42 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-16 16:02:42 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-16 16:02:43 - Venta insertada con ID: 12 2025-10-16 16:02:43 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-16 16:02:43 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 12) 2025-10-16 16:02:43 - Token de vista generado: 1767038f0a006b3ff112e6f9dde7b72b 2025-10-16 16:02:43 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-16 16:02:43 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-16 16:02:43 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-16 16:02:43 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-16 16:02:43 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 16:02:43 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 16:02:43 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-16 16:02:43 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-16 16:02:43 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 16:02:43 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 16:02:43 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 16:02:43 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 16:02:43 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-16 16:02:43 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 16:02:43 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-16 16:02:43 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 16:02:43 - --- Iniciando procesamiento para Prod0_ID15 --- 2025-10-16 16:02:43 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID15] Params: {"pid":15} 2025-10-16 16:02:43 - [Stock Check] Producto ID: 15, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-16 16:02:43 - [DEBUG PRODUCTO][Prod0_ID15] Datos recibidos: {"id":15,"codigo":"17605610813600","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":25,"codigo":"17605610813600","tipo_codigo":"manual","cantidad":"99.00","fecha_vencimiento":null},{"id":26,"codigo":"17605610821216","tipo_codigo":"manual","cantidad":"98.00","fecha_vencimiento":null},{"id":27,"codigo":"17605611437059","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":31,"codigo":"17605653671991","tipo_codigo":"manual","cantidad":"10.00","fecha_vencimiento":null}]} 2025-10-16 16:02:43 - [LOTE AUTO-DETECTADO][Prod0_ID15] Código escaneado 17605610813600 pertenece al LOTE1 (ID: 25) 2025-10-16 16:02:43 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID15] Params: cantidad=1, peso=, lote_id=25 2025-10-16 16:02:43 - [Stock Process][Prod0_ID15] Procesando stock con cantidad: 1 2025-10-16 16:02:43 - [Stock manual][Prod0_ID15] Aplicando lógica basada en cantidad. 2025-10-16 16:02:43 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID15] Params: {"pid":"15","codigo":"17605610813600"} 2025-10-16 16:02:43 - [Stock Manual][Prod0_ID15] Producto manual - código de barras específico: 25, numero_lote: LOTE1 2025-10-16 16:02:43 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID15_Esc] Params: {"cant":"1","id":25} 2025-10-16 16:02:43 - [Stock manual][Prod0_ID15] Actualizado código escaneado ID: 25. Descontado: 1 2025-10-16 16:02:43 - [Stock Strategy NORMAL][Prod0_ID15] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-16 16:02:43 - [Stock Update NORMAL][Prod0_ID15] codigos_barras ya actualizado en sección anterior 2025-10-16 16:02:43 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 15, Cantidad: 1, Venta ID: 12 2025-10-16 16:02:43 - [Movimiento Stock] Registrando movimiento para Producto ID: 15, Cantidad: 1 2025-10-16 16:02:43 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 15 2025-10-16 16:02:43 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 16:02:43 - [Stock Strategy NORMAL][Prod0_ID15] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-16 16:02:43 - [DTE Detalle][Prod0_ID15] Agregado a venta_detalles_para_api con formato original 2025-10-16 16:02:43 - --- Fin procesamiento para Prod0_ID15 --- 2025-10-16 16:02:43 - --- Iniciando procesamiento para Prod1_ID16 --- 2025-10-16 16:02:43 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID16] Params: {"pid":16} 2025-10-16 16:02:43 - [Stock Check] Producto ID: 16, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-16 16:02:43 - [DEBUG PRODUCTO][Prod1_ID16] Datos recibidos: {"id":16,"codigo":"PAN-016","cantidad":1,"precio":"2500.00","subtotal":2500,"es_busqueda_por_codigo":false} 2025-10-16 16:02:43 - [LOTE ESPECIAL ACTUALIZADO][Prod1_ID16] Lote ID: 27, Cantidad reducida: 1 2025-10-16 16:02:43 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID16] Params: cantidad=1, peso=, lote_id=27 2025-10-16 16:02:43 - [Stock Process][Prod1_ID16] Procesando stock con cantidad: 1 2025-10-16 16:02:43 - [Stock ESPECIAL][Prod1_ID16] Procesando producto especial con códigos de barras 2025-10-16 16:02:43 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod1_ID16] Params: {"pid":"16","codigo":"PAN-016"} 2025-10-16 16:02:43 - [Stock Especial][Prod1_ID16] Producto especial - solo código de barras genérico: 29 2025-10-16 16:02:43 - [Stock Especial][Prod1_ID16] Actualizado código escaneado ID: 29. Descontado: 1 2025-10-16 16:02:43 - [Stock Strategy ESPECIAL][Prod1_ID16] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-16 16:02:43 - [Stock Update ESPECIAL][Prod1_ID16] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-16 16:02:43 - [Stock Update ESPECIAL][Prod1_ID16] Stock anterior: 20, cantidad a restar: 1, stock nuevo: 19 2025-10-16 16:02:43 - [Stock Update MASIVO][Prod1_ID16] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-16 16:02:43 - [Stock Update MASIVO][Prod1_ID16] Código genérico capturado: ID 29 2025-10-16 16:02:43 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 16, Cantidad: 1, Venta ID: 12 2025-10-16 16:02:43 - [Movimiento Stock] Registrando movimiento para Producto ID: 16, Cantidad: 1 2025-10-16 16:02:43 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 16 2025-10-16 16:02:43 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 16:02:43 - [DTE Detalle][Prod1_ID16] Agregado a venta_detalles_para_api con formato original 2025-10-16 16:02:43 - --- Fin procesamiento para Prod1_ID16 --- 2025-10-16 16:02:43 - --- Iniciando procesamiento para Prod2_ID17 --- 2025-10-16 16:02:43 - [DB EXECUTE][ID: TipoProdLoop_Prod2_ID17] Params: {"pid":17} 2025-10-16 16:02:43 - [Stock Check] Producto ID: 17, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-16 16:02:43 - [Producto Por Peso][Prod2_ID17] Peso real: 0.624 Kg 2025-10-16 16:02:43 - [DEBUG PRODUCTO][Prod2_ID17] Datos recibidos: {"id":17,"codigo":"QUE-017","cantidad":0.624,"precio":"8000.00","subtotal":4992,"es_busqueda_por_codigo":false,"peso_real":0.624} 2025-10-16 16:02:43 - [LOTE ESPECIAL ACTUALIZADO][Prod2_ID17] Lote ID: 29, Cantidad reducida: 0.624 2025-10-16 16:02:43 - [DB EXECUTE][ID: DetalleInsertLoop_Prod2_ID17] Params: cantidad=0.624, peso=0.624, lote_id=29 2025-10-16 16:02:43 - [Detalle Actualizado][Prod2_ID17] Nombre especial actualizado a: Producto (0.624 Kg) 2025-10-16 16:02:43 - [Stock Process][Prod2_ID17] Procesando stock con cantidad: 0.624 2025-10-16 16:02:43 - [Stock ESPECIAL][Prod2_ID17] Procesando producto especial con códigos de barras 2025-10-16 16:02:43 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod2_ID17] Params: {"pid":"17","codigo":"QUE-017"} 2025-10-16 16:02:43 - [Stock Especial][Prod2_ID17] Producto especial - solo código de barras genérico: 30 2025-10-16 16:02:43 - [Stock Especial][Prod2_ID17] Actualizado código escaneado ID: 30. Descontado: 0.624 2025-10-16 16:02:43 - [Stock Strategy ESPECIAL][Prod2_ID17] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 0.624 2025-10-16 16:02:43 - [Stock Update ESPECIAL][Prod2_ID17] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-16 16:02:43 - [Stock Update ESPECIAL][Prod2_ID17] Stock anterior: 4.45, cantidad a restar: 0.624, stock nuevo: 3.826 2025-10-16 16:02:43 - [Stock Update MASIVO][Prod2_ID17] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-16 16:02:43 - [Stock Update MASIVO][Prod2_ID17] Código genérico capturado: ID 30 2025-10-16 16:02:43 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 17, Cantidad: 0.624, Venta ID: 12 2025-10-16 16:02:43 - [Movimiento Stock] Registrando movimiento para Producto ID: 17, Cantidad: 0.624 2025-10-16 16:02:43 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 17 2025-10-16 16:02:43 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 16:02:43 - [DTE Detalle][Prod2_ID17] Agregado a venta_detalles_para_api con formato original 2025-10-16 16:02:43 - --- Fin procesamiento para Prod2_ID17 --- 2025-10-16 16:02:43 - Detalles de venta insertados y stock actualizado. 2025-10-16 16:02:43 - No se intentó la emisión DTE para Venta ID: 12 (Modo API inactivo o condiciones no cumplidas). 2025-10-16 16:02:43 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 12 2025-10-16 16:02:43 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-16 16:02:43 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-16 16:02:43 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-16 16:02:43 - Transacción completada con éxito para Venta ID: 12 2025-10-16 16:02:43 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-16 16:02:43 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-16 16:11:24 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-16 16:11:24 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-16 16:11:24 - Datos recibidos: {"productos":[{"id":17,"codigo":"QUE-017","cantidad":0.624,"precio":"8000.00","subtotal":4992,"es_busqueda_por_codigo":false,"peso_real":0.624},{"id":15,"codigo":"17605610813600","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":25,"codigo":"17605610813600","tipo_codigo":"manual","cantidad":"98.00","fecha_vencimiento":null},{"id":26,"codigo":"17605610821216","tipo_codigo":"manual","cantidad":"98.00","fecha_vencimiento":null},{"id":27,"codigo":"17605611437059","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":31,"codigo":"17605653671991","tipo_codigo":"manual","cantidad":"10.00","fecha_vencimiento":null}]},{"id":16,"codigo":"PAN-016","cantidad":1,"precio":"2500.00","subtotal":2500,"es_busqueda_por_codigo":false}],"metodo_pago":"1","total":8397,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-16 16:11:24 - Content-Type: application/json 2025-10-16 16:11:24 - Resultado de json_decode: OK 2025-10-16 16:11:24 - ID sesión de caja recibido en JSON: 9 2025-10-16 16:11:24 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-16 16:11:24 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-16 16:11:24 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-16 16:11:24 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-16 16:11:24 - Modo API DTE está INACTIVO según configuración. 2025-10-16 16:11:24 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-16 16:11:24 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-16 16:11:24 - Venta insertada con ID: 13 2025-10-16 16:11:24 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-16 16:11:24 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 13) 2025-10-16 16:11:24 - Token de vista generado: 0e6e75e07191403953c16a36bd57c583 2025-10-16 16:11:24 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-16 16:11:24 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-16 16:11:24 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-16 16:11:24 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-16 16:11:24 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 16:11:24 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 16:11:24 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-16 16:11:24 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-16 16:11:24 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 16:11:24 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 16:11:24 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 16:11:24 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 16:11:24 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-16 16:11:24 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 16:11:24 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-16 16:11:24 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 16:11:24 - --- Iniciando procesamiento para Prod0_ID17 --- 2025-10-16 16:11:24 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID17] Params: {"pid":17} 2025-10-16 16:11:24 - [Stock Check] Producto ID: 17, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-16 16:11:24 - [Producto Por Peso][Prod0_ID17] Peso real: 0.624 Kg 2025-10-16 16:11:24 - [DEBUG PRODUCTO][Prod0_ID17] Datos recibidos: {"id":17,"codigo":"QUE-017","cantidad":0.624,"precio":"8000.00","subtotal":4992,"es_busqueda_por_codigo":false,"peso_real":0.624} 2025-10-16 16:11:24 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID17] Lote ID: 29, Cantidad reducida: 0.624 2025-10-16 16:11:24 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID17] Params: cantidad=0.624, peso=0.624, lote_id=29 2025-10-16 16:11:24 - [Detalle Actualizado][Prod0_ID17] Nombre especial actualizado a: Producto (0.624 Kg) 2025-10-16 16:11:24 - [Stock Process][Prod0_ID17] Procesando stock con cantidad: 0.624 2025-10-16 16:11:24 - [Stock ESPECIAL][Prod0_ID17] Procesando producto especial con códigos de barras 2025-10-16 16:11:24 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID17] Params: {"pid":"17","codigo":"QUE-017"} 2025-10-16 16:11:24 - [Stock Especial][Prod0_ID17] Producto especial - solo código de barras genérico: 30 2025-10-16 16:11:24 - [Stock Especial][Prod0_ID17] Actualizado código escaneado ID: 30. Descontado: 0.624 2025-10-16 16:11:24 - [Stock Strategy ESPECIAL][Prod0_ID17] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 0.624 2025-10-16 16:11:24 - [Stock Update ESPECIAL][Prod0_ID17] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-16 16:11:24 - [Stock Update ESPECIAL][Prod0_ID17] Stock anterior: 3.83, cantidad a restar: 0.624, stock nuevo: 3.206 2025-10-16 16:11:24 - [Stock Update MASIVO][Prod0_ID17] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-16 16:11:24 - [Stock Update MASIVO][Prod0_ID17] Código genérico capturado: ID 30 2025-10-16 16:11:24 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 17, Cantidad: 0.624, Venta ID: 13 2025-10-16 16:11:24 - [Movimiento Stock] Registrando movimiento para Producto ID: 17, Cantidad: 0.624 2025-10-16 16:11:24 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 17 2025-10-16 16:11:24 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 16:11:24 - [DTE Detalle][Prod0_ID17] Agregado a venta_detalles_para_api con formato original 2025-10-16 16:11:24 - --- Fin procesamiento para Prod0_ID17 --- 2025-10-16 16:11:24 - --- Iniciando procesamiento para Prod1_ID15 --- 2025-10-16 16:11:24 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID15] Params: {"pid":15} 2025-10-16 16:11:24 - [Stock Check] Producto ID: 15, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-16 16:11:24 - [DEBUG PRODUCTO][Prod1_ID15] Datos recibidos: {"id":15,"codigo":"17605610813600","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":25,"codigo":"17605610813600","tipo_codigo":"manual","cantidad":"98.00","fecha_vencimiento":null},{"id":26,"codigo":"17605610821216","tipo_codigo":"manual","cantidad":"98.00","fecha_vencimiento":null},{"id":27,"codigo":"17605611437059","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":31,"codigo":"17605653671991","tipo_codigo":"manual","cantidad":"10.00","fecha_vencimiento":null}]} 2025-10-16 16:11:24 - [LOTE AUTO-DETECTADO][Prod1_ID15] Código escaneado 17605610813600 pertenece al LOTE1 (ID: 25) 2025-10-16 16:11:24 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID15] Params: cantidad=1, peso=, lote_id=25 2025-10-16 16:11:24 - [Stock Process][Prod1_ID15] Procesando stock con cantidad: 1 2025-10-16 16:11:24 - [Stock manual][Prod1_ID15] Aplicando lógica basada en cantidad. 2025-10-16 16:11:24 - [DB EXECUTE][ID: FindCodeManualLoop_Prod1_ID15] Params: {"pid":"15","codigo":"17605610813600"} 2025-10-16 16:11:24 - [Stock Manual][Prod1_ID15] Producto manual - código de barras específico: 25, numero_lote: LOTE1 2025-10-16 16:11:24 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod1_ID15_Esc] Params: {"cant":"1","id":25} 2025-10-16 16:11:24 - [Stock manual][Prod1_ID15] Actualizado código escaneado ID: 25. Descontado: 1 2025-10-16 16:11:24 - [Stock Strategy NORMAL][Prod1_ID15] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-16 16:11:24 - [Stock Update NORMAL][Prod1_ID15] codigos_barras ya actualizado en sección anterior 2025-10-16 16:11:24 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 15, Cantidad: 1, Venta ID: 13 2025-10-16 16:11:24 - [Movimiento Stock] Registrando movimiento para Producto ID: 15, Cantidad: 1 2025-10-16 16:11:24 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 15 2025-10-16 16:11:24 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 16:11:24 - [Stock Strategy NORMAL][Prod1_ID15] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-16 16:11:24 - [DTE Detalle][Prod1_ID15] Agregado a venta_detalles_para_api con formato original 2025-10-16 16:11:24 - --- Fin procesamiento para Prod1_ID15 --- 2025-10-16 16:11:24 - --- Iniciando procesamiento para Prod2_ID16 --- 2025-10-16 16:11:24 - [DB EXECUTE][ID: TipoProdLoop_Prod2_ID16] Params: {"pid":16} 2025-10-16 16:11:24 - [Stock Check] Producto ID: 16, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-16 16:11:24 - [DEBUG PRODUCTO][Prod2_ID16] Datos recibidos: {"id":16,"codigo":"PAN-016","cantidad":1,"precio":"2500.00","subtotal":2500,"es_busqueda_por_codigo":false} 2025-10-16 16:11:24 - [LOTE ESPECIAL ACTUALIZADO][Prod2_ID16] Lote ID: 27, Cantidad reducida: 1 2025-10-16 16:11:24 - [DB EXECUTE][ID: DetalleInsertLoop_Prod2_ID16] Params: cantidad=1, peso=, lote_id=27 2025-10-16 16:11:24 - [Stock Process][Prod2_ID16] Procesando stock con cantidad: 1 2025-10-16 16:11:24 - [Stock ESPECIAL][Prod2_ID16] Procesando producto especial con códigos de barras 2025-10-16 16:11:24 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod2_ID16] Params: {"pid":"16","codigo":"PAN-016"} 2025-10-16 16:11:24 - [Stock Especial][Prod2_ID16] Producto especial - solo código de barras genérico: 29 2025-10-16 16:11:24 - [Stock Especial][Prod2_ID16] Actualizado código escaneado ID: 29. Descontado: 1 2025-10-16 16:11:24 - [Stock Strategy ESPECIAL][Prod2_ID16] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-16 16:11:24 - [Stock Update ESPECIAL][Prod2_ID16] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-16 16:11:24 - [Stock Update ESPECIAL][Prod2_ID16] Stock anterior: 19, cantidad a restar: 1, stock nuevo: 18 2025-10-16 16:11:24 - [Stock Update MASIVO][Prod2_ID16] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-16 16:11:24 - [Stock Update MASIVO][Prod2_ID16] Código genérico capturado: ID 29 2025-10-16 16:11:24 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 16, Cantidad: 1, Venta ID: 13 2025-10-16 16:11:24 - [Movimiento Stock] Registrando movimiento para Producto ID: 16, Cantidad: 1 2025-10-16 16:11:24 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 16 2025-10-16 16:11:24 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 16:11:24 - [DTE Detalle][Prod2_ID16] Agregado a venta_detalles_para_api con formato original 2025-10-16 16:11:24 - --- Fin procesamiento para Prod2_ID16 --- 2025-10-16 16:11:24 - Detalles de venta insertados y stock actualizado. 2025-10-16 16:11:24 - No se intentó la emisión DTE para Venta ID: 13 (Modo API inactivo o condiciones no cumplidas). 2025-10-16 16:11:24 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 13 2025-10-16 16:11:24 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-16 16:11:24 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-16 16:11:24 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-16 16:11:24 - Transacción completada con éxito para Venta ID: 13 2025-10-16 16:11:24 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-16 16:11:24 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-16 16:33:50 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-16 16:33:50 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-16 16:33:50 - Datos recibidos: {"productos":[{"id":17,"codigo":"QUE-017","cantidad":0.624,"precio":"8000.00","subtotal":4992,"es_busqueda_por_codigo":false,"peso_real":0.624},{"id":15,"codigo":"17605610813600","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":25,"codigo":"17605610813600","tipo_codigo":"manual","cantidad":"97.00","fecha_vencimiento":null},{"id":26,"codigo":"17605610821216","tipo_codigo":"manual","cantidad":"98.00","fecha_vencimiento":null},{"id":27,"codigo":"17605611437059","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":31,"codigo":"17605653671991","tipo_codigo":"manual","cantidad":"10.00","fecha_vencimiento":null}]},{"id":16,"codigo":"PAN-016","cantidad":1,"precio":"2500.00","subtotal":2500,"es_busqueda_por_codigo":false}],"metodo_pago":"2","total":8397,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-16 16:33:50 - Content-Type: application/json 2025-10-16 16:33:50 - Resultado de json_decode: OK 2025-10-16 16:33:50 - ID sesión de caja recibido en JSON: 9 2025-10-16 16:33:50 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-16 16:33:50 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-16 16:33:50 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-16 16:33:50 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-16 16:33:50 - Modo API DTE está INACTIVO según configuración. 2025-10-16 16:33:50 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-16 16:33:50 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-16 16:33:50 - Venta insertada con ID: 14 2025-10-16 16:33:50 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-16 16:33:50 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 14) 2025-10-16 16:33:50 - Token de vista generado: 2eecfb886fd4d932bad1e02b752b6e3e 2025-10-16 16:33:50 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-16 16:33:50 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-16 16:33:51 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-16 16:33:51 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-16 16:33:51 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 16:33:51 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 16:33:51 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-16 16:33:51 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-16 16:33:51 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 16:33:51 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 16:33:51 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 16:33:51 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 16:33:51 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-16 16:33:51 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 16:33:51 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-16 16:33:51 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 16:33:51 - --- Iniciando procesamiento para Prod0_ID17 --- 2025-10-16 16:33:51 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID17] Params: {"pid":17} 2025-10-16 16:33:51 - [Stock Check] Producto ID: 17, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-16 16:33:51 - [Producto Por Peso][Prod0_ID17] Peso real: 0.624 Kg 2025-10-16 16:33:51 - [DEBUG PRODUCTO][Prod0_ID17] Datos recibidos: {"id":17,"codigo":"QUE-017","cantidad":0.624,"precio":"8000.00","subtotal":4992,"es_busqueda_por_codigo":false,"peso_real":0.624} 2025-10-16 16:33:51 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID17] Lote ID: 29, Cantidad reducida: 0.624 2025-10-16 16:33:51 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID17] Params: cantidad=0.624, peso=0.624, lote_id=29 2025-10-16 16:33:51 - [Detalle Actualizado][Prod0_ID17] Nombre especial actualizado a: Producto (0.624 Kg) 2025-10-16 16:33:51 - [Stock Process][Prod0_ID17] Procesando stock con cantidad: 0.624 2025-10-16 16:33:51 - [Stock ESPECIAL][Prod0_ID17] Procesando producto especial con códigos de barras 2025-10-16 16:33:51 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID17] Params: {"pid":"17","codigo":"QUE-017"} 2025-10-16 16:33:51 - [Stock Especial][Prod0_ID17] Producto especial - solo código de barras genérico: 30 2025-10-16 16:33:51 - [Stock Especial][Prod0_ID17] Actualizado código escaneado ID: 30. Descontado: 0.624 2025-10-16 16:33:51 - [Stock Strategy ESPECIAL][Prod0_ID17] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 0.624 2025-10-16 16:33:51 - [Stock Update ESPECIAL][Prod0_ID17] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-16 16:33:51 - [Stock Update ESPECIAL][Prod0_ID17] Stock anterior: 3.21, cantidad a restar: 0.624, stock nuevo: 2.586 2025-10-16 16:33:51 - [Stock Update MASIVO][Prod0_ID17] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-16 16:33:51 - [Stock Update MASIVO][Prod0_ID17] Código genérico capturado: ID 30 2025-10-16 16:33:51 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 17, Cantidad: 0.624, Venta ID: 14 2025-10-16 16:33:51 - [Movimiento Stock] Registrando movimiento para Producto ID: 17, Cantidad: 0.624 2025-10-16 16:33:51 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 17 2025-10-16 16:33:51 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 16:33:51 - [DTE Detalle][Prod0_ID17] Agregado a venta_detalles_para_api con formato original 2025-10-16 16:33:51 - --- Fin procesamiento para Prod0_ID17 --- 2025-10-16 16:33:51 - --- Iniciando procesamiento para Prod1_ID15 --- 2025-10-16 16:33:51 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID15] Params: {"pid":15} 2025-10-16 16:33:51 - [Stock Check] Producto ID: 15, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-16 16:33:51 - [DEBUG PRODUCTO][Prod1_ID15] Datos recibidos: {"id":15,"codigo":"17605610813600","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":25,"codigo":"17605610813600","tipo_codigo":"manual","cantidad":"97.00","fecha_vencimiento":null},{"id":26,"codigo":"17605610821216","tipo_codigo":"manual","cantidad":"98.00","fecha_vencimiento":null},{"id":27,"codigo":"17605611437059","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null},{"id":31,"codigo":"17605653671991","tipo_codigo":"manual","cantidad":"10.00","fecha_vencimiento":null}]} 2025-10-16 16:33:51 - [LOTE AUTO-DETECTADO][Prod1_ID15] Código escaneado 17605610813600 pertenece al LOTE1 (ID: 25) 2025-10-16 16:33:51 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID15] Params: cantidad=1, peso=, lote_id=25 2025-10-16 16:33:51 - [Stock Process][Prod1_ID15] Procesando stock con cantidad: 1 2025-10-16 16:33:51 - [Stock manual][Prod1_ID15] Aplicando lógica basada en cantidad. 2025-10-16 16:33:51 - [DB EXECUTE][ID: FindCodeManualLoop_Prod1_ID15] Params: {"pid":"15","codigo":"17605610813600"} 2025-10-16 16:33:51 - [Stock Manual][Prod1_ID15] Producto manual - código de barras específico: 25, numero_lote: LOTE1 2025-10-16 16:33:51 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod1_ID15_Esc] Params: {"cant":"1","id":25} 2025-10-16 16:33:51 - [Stock manual][Prod1_ID15] Actualizado código escaneado ID: 25. Descontado: 1 2025-10-16 16:33:51 - [Stock Strategy NORMAL][Prod1_ID15] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-16 16:33:51 - [Stock Update NORMAL][Prod1_ID15] codigos_barras ya actualizado en sección anterior 2025-10-16 16:33:51 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 15, Cantidad: 1, Venta ID: 14 2025-10-16 16:33:51 - [Movimiento Stock] Registrando movimiento para Producto ID: 15, Cantidad: 1 2025-10-16 16:33:51 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 15 2025-10-16 16:33:51 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 16:33:51 - [Stock Strategy NORMAL][Prod1_ID15] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-16 16:33:51 - [DTE Detalle][Prod1_ID15] Agregado a venta_detalles_para_api con formato original 2025-10-16 16:33:51 - --- Fin procesamiento para Prod1_ID15 --- 2025-10-16 16:33:51 - --- Iniciando procesamiento para Prod2_ID16 --- 2025-10-16 16:33:51 - [DB EXECUTE][ID: TipoProdLoop_Prod2_ID16] Params: {"pid":16} 2025-10-16 16:33:51 - [Stock Check] Producto ID: 16, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-16 16:33:51 - [DEBUG PRODUCTO][Prod2_ID16] Datos recibidos: {"id":16,"codigo":"PAN-016","cantidad":1,"precio":"2500.00","subtotal":2500,"es_busqueda_por_codigo":false} 2025-10-16 16:33:51 - [LOTE ESPECIAL ACTUALIZADO][Prod2_ID16] Lote ID: 27, Cantidad reducida: 1 2025-10-16 16:33:51 - [DB EXECUTE][ID: DetalleInsertLoop_Prod2_ID16] Params: cantidad=1, peso=, lote_id=27 2025-10-16 16:33:51 - [Stock Process][Prod2_ID16] Procesando stock con cantidad: 1 2025-10-16 16:33:51 - [Stock ESPECIAL][Prod2_ID16] Procesando producto especial con códigos de barras 2025-10-16 16:33:51 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod2_ID16] Params: {"pid":"16","codigo":"PAN-016"} 2025-10-16 16:33:51 - [Stock Especial][Prod2_ID16] Producto especial - solo código de barras genérico: 29 2025-10-16 16:33:51 - [Stock Especial][Prod2_ID16] Actualizado código escaneado ID: 29. Descontado: 1 2025-10-16 16:33:51 - [Stock Strategy ESPECIAL][Prod2_ID16] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 1 2025-10-16 16:33:51 - [Stock Update ESPECIAL][Prod2_ID16] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-16 16:33:51 - [Stock Update ESPECIAL][Prod2_ID16] Stock anterior: 18, cantidad a restar: 1, stock nuevo: 17 2025-10-16 16:33:51 - [Stock Update MASIVO][Prod2_ID16] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-16 16:33:51 - [Stock Update MASIVO][Prod2_ID16] Código genérico capturado: ID 29 2025-10-16 16:33:51 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 16, Cantidad: 1, Venta ID: 14 2025-10-16 16:33:51 - [Movimiento Stock] Registrando movimiento para Producto ID: 16, Cantidad: 1 2025-10-16 16:33:51 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 16 2025-10-16 16:33:51 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 16:33:51 - [DTE Detalle][Prod2_ID16] Agregado a venta_detalles_para_api con formato original 2025-10-16 16:33:51 - --- Fin procesamiento para Prod2_ID16 --- 2025-10-16 16:33:51 - Detalles de venta insertados y stock actualizado. 2025-10-16 16:33:51 - No se intentó la emisión DTE para Venta ID: 14 (Modo API inactivo o condiciones no cumplidas). 2025-10-16 16:33:51 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 14 2025-10-16 16:33:51 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-16 16:33:51 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-16 16:33:51 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-16 16:33:51 - Transacción completada con éxito para Venta ID: 14 2025-10-16 16:33:51 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-16 16:33:51 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-16 16:56:57 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-16 16:56:57 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-16 16:56:57 - Datos recibidos: {"productos":[{"id":17,"codigo":"QUE-017","cantidad":0.624,"precio":"8000.00","subtotal":4992,"es_busqueda_por_codigo":false,"peso_real":0.624}],"metodo_pago":"2","total":4195,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-16 16:56:57 - Content-Type: application/json 2025-10-16 16:56:57 - Resultado de json_decode: OK 2025-10-16 16:56:57 - ID sesión de caja recibido en JSON: 9 2025-10-16 16:56:57 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-16 16:56:57 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-16 16:56:57 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-16 16:56:57 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-16 16:56:57 - Modo API DTE está INACTIVO según configuración. 2025-10-16 16:56:57 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-16 16:56:57 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-16 16:56:57 - Venta insertada con ID: 15 2025-10-16 16:56:57 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-16 16:56:57 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 15) 2025-10-16 16:56:57 - Token de vista generado: d8315bff62971435e1fd30a8fd1d7d73 2025-10-16 16:56:57 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-16 16:56:57 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-16 16:56:57 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-16 16:56:57 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-16 16:56:57 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 16:56:57 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 16:56:57 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-16 16:56:57 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-16 16:56:57 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 16:56:57 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 16:56:57 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 16:56:57 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 16:56:57 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-16 16:56:57 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 16:56:57 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-16 16:56:57 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 16:56:57 - --- Iniciando procesamiento para Prod0_ID17 --- 2025-10-16 16:56:57 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID17] Params: {"pid":17} 2025-10-16 16:56:57 - [Stock Check] Producto ID: 17, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-16 16:56:57 - [Producto Por Peso][Prod0_ID17] Peso real: 0.624 Kg 2025-10-16 16:56:57 - [DEBUG PRODUCTO][Prod0_ID17] Datos recibidos: {"id":17,"codigo":"QUE-017","cantidad":0.624,"precio":"8000.00","subtotal":4992,"es_busqueda_por_codigo":false,"peso_real":0.624} 2025-10-16 16:56:57 - [WARNING LOTE][Prod0_ID17] No se encontró lote disponible para producto 17 2025-10-16 16:56:57 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID17] Params: cantidad=0.624, peso=0.624, lote_id= 2025-10-16 16:56:57 - [Detalle Actualizado][Prod0_ID17] Nombre especial actualizado a: Producto (0.624 Kg) 2025-10-16 16:56:57 - [Stock Process][Prod0_ID17] Procesando stock con cantidad: 0.624 2025-10-16 16:56:57 - [Stock ESPECIAL][Prod0_ID17] Procesando producto especial con códigos de barras 2025-10-16 16:56:57 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID17] Params: {"pid":"17","codigo":"QUE-017"} 2025-10-16 16:56:57 - [Stock Especial][Prod0_ID17] Producto especial - solo código de barras genérico: 30 2025-10-16 16:56:57 - [Stock Especial][Prod0_ID17] Actualizado código escaneado ID: 30. Descontado: 0.624 2025-10-16 16:56:57 - [Stock Strategy ESPECIAL][Prod0_ID17] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 0.624 2025-10-16 16:56:57 - [Stock Update ESPECIAL][Prod0_ID17] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-16 16:56:57 - [Stock Update ESPECIAL][Prod0_ID17] Stock anterior: 2.59, cantidad a restar: 0.624, stock nuevo: 1.966 2025-10-16 16:56:57 - [Stock Update MASIVO][Prod0_ID17] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-16 16:56:57 - [Stock Update MASIVO][Prod0_ID17] Código genérico capturado: ID 30 2025-10-16 16:56:57 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 17, Cantidad: 0.624, Venta ID: 15 2025-10-16 16:56:57 - [Movimiento Stock] Registrando movimiento para Producto ID: 17, Cantidad: 0.624 2025-10-16 16:56:57 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 17 2025-10-16 16:56:57 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 16:56:57 - [DTE Detalle][Prod0_ID17] Agregado a venta_detalles_para_api con formato original 2025-10-16 16:56:57 - --- Fin procesamiento para Prod0_ID17 --- 2025-10-16 16:56:57 - Detalles de venta insertados y stock actualizado. 2025-10-16 16:56:57 - No se intentó la emisión DTE para Venta ID: 15 (Modo API inactivo o condiciones no cumplidas). 2025-10-16 16:56:57 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 15 2025-10-16 16:56:57 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-16 16:56:57 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-16 16:56:57 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-16 16:56:57 - Transacción completada con éxito para Venta ID: 15 2025-10-16 16:56:57 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-16 16:56:57 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-16 17:39:14 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-16 17:39:14 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-16 17:39:14 - Datos recibidos: {"productos":[{"id":17,"codigo":"QUE-017","cantidad":0.62,"precio":"8000.00","subtotal":4960,"es_busqueda_por_codigo":false,"peso_real":0.62}],"metodo_pago":"2","total":4168,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-16 17:39:14 - Content-Type: application/json 2025-10-16 17:39:14 - Resultado de json_decode: OK 2025-10-16 17:39:14 - ID sesión de caja recibido en JSON: 9 2025-10-16 17:39:14 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-16 17:39:14 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-16 17:39:14 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-16 17:39:14 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-16 17:39:14 - Modo API DTE está INACTIVO según configuración. 2025-10-16 17:39:14 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-16 17:39:14 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-16 17:39:14 - Venta insertada con ID: 16 2025-10-16 17:39:14 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-16 17:39:14 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 16) 2025-10-16 17:39:14 - Token de vista generado: 8913f8ea687a86d52199b21661da8ce8 2025-10-16 17:39:14 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-16 17:39:14 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-16 17:39:14 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-16 17:39:14 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-16 17:39:14 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 17:39:14 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 17:39:14 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-16 17:39:14 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-16 17:39:14 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 17:39:14 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 17:39:14 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 17:39:14 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 17:39:14 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-16 17:39:14 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 17:39:14 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-16 17:39:14 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 17:39:14 - --- Iniciando procesamiento para Prod0_ID17 --- 2025-10-16 17:39:14 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID17] Params: {"pid":17} 2025-10-16 17:39:14 - [Stock Check] Producto ID: 17, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-16 17:39:14 - [Producto Por Peso][Prod0_ID17] Peso real: 0.62 Kg 2025-10-16 17:39:14 - [DEBUG PRODUCTO][Prod0_ID17] Datos recibidos: {"id":17,"codigo":"QUE-017","cantidad":0.62,"precio":"8000.00","subtotal":4960,"es_busqueda_por_codigo":false,"peso_real":0.62} 2025-10-16 17:39:14 - [WARNING LOTE][Prod0_ID17] No se encontró lote disponible para producto 17 2025-10-16 17:39:14 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID17] Params: cantidad=0.62, peso=0.62, lote_id= 2025-10-16 17:39:14 - [Detalle Actualizado][Prod0_ID17] Nombre especial actualizado a: Producto (0.62 Kg) 2025-10-16 17:39:14 - [Stock Process][Prod0_ID17] Procesando stock con cantidad: 0.62 2025-10-16 17:39:14 - [Stock ESPECIAL][Prod0_ID17] Procesando producto especial con códigos de barras 2025-10-16 17:39:14 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID17] Params: {"pid":"17","codigo":"QUE-017"} 2025-10-16 17:39:14 - [Stock Especial][Prod0_ID17] Producto especial - solo código de barras genérico: 30 2025-10-16 17:39:14 - [Stock Especial][Prod0_ID17] Actualizado código escaneado ID: 30. Descontado: 0.62 2025-10-16 17:39:14 - [Stock Strategy ESPECIAL][Prod0_ID17] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 0.62 2025-10-16 17:39:14 - [Stock Update ESPECIAL][Prod0_ID17] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-16 17:39:14 - [Stock Update ESPECIAL][Prod0_ID17] Stock anterior: 1.97, cantidad a restar: 0.62, stock nuevo: 1.35 2025-10-16 17:39:14 - [Stock Update MASIVO][Prod0_ID17] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-16 17:39:14 - [Stock Update MASIVO][Prod0_ID17] Código genérico capturado: ID 30 2025-10-16 17:39:14 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 17, Cantidad: 0.62, Venta ID: 16 2025-10-16 17:39:14 - [Movimiento Stock] Registrando movimiento para Producto ID: 17, Cantidad: 0.62 2025-10-16 17:39:14 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 17 2025-10-16 17:39:14 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 17:39:14 - [DTE Detalle][Prod0_ID17] Agregado a venta_detalles_para_api con formato original 2025-10-16 17:39:14 - --- Fin procesamiento para Prod0_ID17 --- 2025-10-16 17:39:14 - Detalles de venta insertados y stock actualizado. 2025-10-16 17:39:14 - No se intentó la emisión DTE para Venta ID: 16 (Modo API inactivo o condiciones no cumplidas). 2025-10-16 17:39:14 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 16 2025-10-16 17:39:14 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-16 17:39:14 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-16 17:39:14 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-16 17:39:14 - Transacción completada con éxito para Venta ID: 16 2025-10-16 17:39:14 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-16 17:39:14 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-16 17:39:51 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-16 17:39:51 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-16 17:39:51 - Datos recibidos: {"productos":[{"id":17,"codigo":"QUE-017","cantidad":0.624,"precio":"8000.00","subtotal":4992,"es_busqueda_por_codigo":false,"peso_real":0.624}],"metodo_pago":"2","total":4195,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-16 17:39:51 - Content-Type: application/json 2025-10-16 17:39:51 - Resultado de json_decode: OK 2025-10-16 17:39:51 - ID sesión de caja recibido en JSON: 9 2025-10-16 17:39:51 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-16 17:39:51 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-16 17:39:51 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-16 17:39:51 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-16 17:39:51 - Modo API DTE está INACTIVO según configuración. 2025-10-16 17:39:51 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-16 17:39:51 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-16 17:39:51 - Venta insertada con ID: 17 2025-10-16 17:39:51 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-16 17:39:51 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 17) 2025-10-16 17:39:51 - Token de vista generado: b36428982094df3df4d41239c22e9c0a 2025-10-16 17:39:51 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-16 17:39:51 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-16 17:39:51 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-16 17:39:51 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-16 17:39:51 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 17:39:51 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 17:39:51 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-16 17:39:51 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-16 17:39:51 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 17:39:51 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 17:39:51 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 17:39:51 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 17:39:51 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-16 17:39:51 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 17:39:51 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-16 17:39:51 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 17:39:51 - --- Iniciando procesamiento para Prod0_ID17 --- 2025-10-16 17:39:51 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID17] Params: {"pid":17} 2025-10-16 17:39:51 - [Stock Check] Producto ID: 17, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-16 17:39:51 - [Producto Por Peso][Prod0_ID17] Peso real: 0.624 Kg 2025-10-16 17:39:51 - [DEBUG PRODUCTO][Prod0_ID17] Datos recibidos: {"id":17,"codigo":"QUE-017","cantidad":0.624,"precio":"8000.00","subtotal":4992,"es_busqueda_por_codigo":false,"peso_real":0.624} 2025-10-16 17:39:51 - [WARNING LOTE][Prod0_ID17] No se encontró lote disponible para producto 17 2025-10-16 17:39:51 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID17] Params: cantidad=0.624, peso=0.624, lote_id= 2025-10-16 17:39:51 - [Detalle Actualizado][Prod0_ID17] Nombre especial actualizado a: Producto (0.624 Kg) 2025-10-16 17:39:51 - [Stock Process][Prod0_ID17] Procesando stock con cantidad: 0.624 2025-10-16 17:39:51 - [Stock ESPECIAL][Prod0_ID17] Procesando producto especial con códigos de barras 2025-10-16 17:39:51 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID17] Params: {"pid":"17","codigo":"QUE-017"} 2025-10-16 17:39:51 - [Stock Especial][Prod0_ID17] Producto especial - solo código de barras genérico: 30 2025-10-16 17:39:51 - [Stock Especial][Prod0_ID17] Actualizado código escaneado ID: 30. Descontado: 0.624 2025-10-16 17:39:51 - [Stock Strategy ESPECIAL][Prod0_ID17] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 0.624 2025-10-16 17:39:51 - [Stock Update ESPECIAL][Prod0_ID17] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-16 17:39:51 - [Stock Update ESPECIAL][Prod0_ID17] Stock anterior: 1.35, cantidad a restar: 0.624, stock nuevo: 0.726 2025-10-16 17:39:51 - [Stock Update MASIVO][Prod0_ID17] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-16 17:39:51 - [Stock Update MASIVO][Prod0_ID17] Código genérico capturado: ID 30 2025-10-16 17:39:51 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 17, Cantidad: 0.624, Venta ID: 17 2025-10-16 17:39:51 - [Movimiento Stock] Registrando movimiento para Producto ID: 17, Cantidad: 0.624 2025-10-16 17:39:51 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 17 2025-10-16 17:39:51 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 17:39:51 - [DTE Detalle][Prod0_ID17] Agregado a venta_detalles_para_api con formato original 2025-10-16 17:39:51 - --- Fin procesamiento para Prod0_ID17 --- 2025-10-16 17:39:51 - Detalles de venta insertados y stock actualizado. 2025-10-16 17:39:51 - No se intentó la emisión DTE para Venta ID: 17 (Modo API inactivo o condiciones no cumplidas). 2025-10-16 17:39:51 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 17 2025-10-16 17:39:51 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-16 17:39:51 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-16 17:39:51 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-16 17:39:51 - Transacción completada con éxito para Venta ID: 17 2025-10-16 17:39:51 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-16 17:39:51 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-16 17:56:22 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-16 17:56:22 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-16 17:56:22 - Datos recibidos: {"productos":[{"id":17,"codigo":"QUE-017","cantidad":0.624,"precio":"8000.00","subtotal":4992,"es_busqueda_por_codigo":false,"peso_real":0.624}],"metodo_pago":"2","total":4195,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"9"} 2025-10-16 17:56:22 - Content-Type: application/json 2025-10-16 17:56:22 - Resultado de json_decode: OK 2025-10-16 17:56:22 - ID sesión de caja recibido en JSON: 9 2025-10-16 17:56:22 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-16 17:56:22 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-16 17:56:22 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-16 17:56:22 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-16 17:56:22 - Modo API DTE está INACTIVO según configuración. 2025-10-16 17:56:22 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-16 17:56:22 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=9) 2025-10-16 17:56:22 - Venta insertada con ID: 18 2025-10-16 17:56:22 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-16 17:56:22 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 18) 2025-10-16 17:56:22 - Token de vista generado: 8e057b80c5dc3707eaefebc754840f52 2025-10-16 17:56:22 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-16 17:56:22 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-16 17:56:22 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-16 17:56:22 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-16 17:56:22 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 17:56:22 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-16 17:56:22 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-16 17:56:22 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-16 17:56:22 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 17:56:22 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 17:56:22 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 17:56:22 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 17:56:22 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-16 17:56:22 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-16 17:56:22 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-16 17:56:22 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-16 17:56:22 - --- Iniciando procesamiento para Prod0_ID17 --- 2025-10-16 17:56:22 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID17] Params: {"pid":17} 2025-10-16 17:56:22 - [Stock Check] Producto ID: 17, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-16 17:56:22 - [Producto Por Peso][Prod0_ID17] Peso real: 0.624 Kg 2025-10-16 17:56:22 - [DEBUG PRODUCTO][Prod0_ID17] Datos recibidos: {"id":17,"codigo":"QUE-017","cantidad":0.624,"precio":"8000.00","subtotal":4992,"es_busqueda_por_codigo":false,"peso_real":0.624} 2025-10-16 17:56:22 - [WARNING LOTE][Prod0_ID17] No se encontró lote disponible para producto 17 2025-10-16 17:56:22 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID17] Params: cantidad=0.624, peso=0.624, lote_id= 2025-10-16 17:56:22 - [Detalle Actualizado][Prod0_ID17] Nombre especial actualizado a: Producto (0.624 Kg) 2025-10-16 17:56:22 - [Stock Process][Prod0_ID17] Procesando stock con cantidad: 0.624 2025-10-16 17:56:22 - [Stock ESPECIAL][Prod0_ID17] Procesando producto especial con códigos de barras 2025-10-16 17:56:22 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID17] Params: {"pid":"17","codigo":"QUE-017"} 2025-10-16 17:56:22 - [Stock Especial][Prod0_ID17] Producto especial - solo código de barras genérico: 30 2025-10-16 17:56:22 - [Stock Especial][Prod0_ID17] Actualizado código escaneado ID: 30. Descontado: 0.624 2025-10-16 17:56:22 - [Stock Strategy ESPECIAL][Prod0_ID17] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 0.624 2025-10-16 17:56:22 - [Stock Update ESPECIAL][Prod0_ID17] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-16 17:56:22 - [Stock Update ESPECIAL][Prod0_ID17] Stock anterior: 0.73, cantidad a restar: 0.624, stock nuevo: 0.106 2025-10-16 17:56:22 - [Stock Update MASIVO][Prod0_ID17] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-16 17:56:22 - [Stock Update MASIVO][Prod0_ID17] Código genérico capturado: ID 30 2025-10-16 17:56:22 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 17, Cantidad: 0.624, Venta ID: 18 2025-10-16 17:56:22 - [Movimiento Stock] Registrando movimiento para Producto ID: 17, Cantidad: 0.624 2025-10-16 17:56:22 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 17 2025-10-16 17:56:22 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-16 17:56:22 - [DTE Detalle][Prod0_ID17] Agregado a venta_detalles_para_api con formato original 2025-10-16 17:56:22 - --- Fin procesamiento para Prod0_ID17 --- 2025-10-16 17:56:22 - Detalles de venta insertados y stock actualizado. 2025-10-16 17:56:22 - No se intentó la emisión DTE para Venta ID: 18 (Modo API inactivo o condiciones no cumplidas). 2025-10-16 17:56:22 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 18 2025-10-16 17:56:22 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-16 17:56:22 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-16 17:56:22 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-16 17:56:22 - Transacción completada con éxito para Venta ID: 18 2025-10-16 17:56:22 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-16 17:56:22 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-17 08:29:59 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-17 08:29:59 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-17 08:29:59 - Datos recibidos: {"productos":[{"id":18,"codigo":"17606528723077","cantidad":4,"precio":2500,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":32,"codigo":"17606528723077","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":"2025-10-31"},{"id":33,"codigo":"17606528721072","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":"2025-11-28"}]}],"metodo_pago":"2","total":8403,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-17 08:29:59 - Content-Type: application/json 2025-10-17 08:29:59 - Resultado de json_decode: OK 2025-10-17 08:29:59 - ID sesión de caja recibido en JSON: 10 2025-10-17 08:29:59 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-17 08:29:59 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-17 08:29:59 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-17 08:29:59 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-17 08:29:59 - Modo API DTE está INACTIVO según configuración. 2025-10-17 08:29:59 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-17 08:29:59 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-17 08:29:59 - Venta insertada con ID: 19 2025-10-17 08:29:59 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-17 08:29:59 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 19) 2025-10-17 08:29:59 - Token de vista generado: 05c032986e812ef93f571f5d5b60c3f5 2025-10-17 08:29:59 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-17 08:29:59 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-17 08:29:59 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-17 08:29:59 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-17 08:29:59 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-17 08:29:59 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-17 08:29:59 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-17 08:29:59 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-17 08:29:59 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-17 08:29:59 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-17 08:29:59 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-17 08:29:59 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-17 08:29:59 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-17 08:29:59 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-17 08:29:59 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-17 08:29:59 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-17 08:29:59 - --- Iniciando procesamiento para Prod0_ID18 --- 2025-10-17 08:29:59 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID18] Params: {"pid":18} 2025-10-17 08:29:59 - [Stock Check] Producto ID: 18, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-17 08:29:59 - [DEBUG PRODUCTO][Prod0_ID18] Datos recibidos: {"id":18,"codigo":"17606528723077","cantidad":4,"precio":2500,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":32,"codigo":"17606528723077","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":"2025-10-31"},{"id":33,"codigo":"17606528721072","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":"2025-11-28"}]} 2025-10-17 08:29:59 - [LOTE AUTO-DETECTADO][Prod0_ID18] Código escaneado 17606528723077 pertenece al LOTE1 (ID: 32) 2025-10-17 08:29:59 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID18] Params: cantidad=4, peso=, lote_id=32 2025-10-17 08:29:59 - [Stock Process][Prod0_ID18] Procesando stock con cantidad: 4 2025-10-17 08:29:59 - [Stock manual][Prod0_ID18] Aplicando lógica basada en cantidad. 2025-10-17 08:29:59 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID18] Params: {"pid":"18","codigo":"17606528723077"} 2025-10-17 08:29:59 - [Stock Manual][Prod0_ID18] Producto manual - código de barras específico: 32, numero_lote: LOTE1 2025-10-17 08:29:59 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID18_Esc] Params: {"cant":"4","id":32} 2025-10-17 08:29:59 - [Stock manual][Prod0_ID18] Actualizado código escaneado ID: 32. Descontado: 4 2025-10-17 08:29:59 - [Stock Strategy NORMAL][Prod0_ID18] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 4 2025-10-17 08:29:59 - [Stock Update NORMAL][Prod0_ID18] codigos_barras ya actualizado en sección anterior 2025-10-17 08:29:59 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 18, Cantidad: 4, Venta ID: 19 2025-10-17 08:29:59 - [Movimiento Stock] Registrando movimiento para Producto ID: 18, Cantidad: 4 2025-10-17 08:29:59 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 18 2025-10-17 08:29:59 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-17 08:29:59 - [Stock Strategy NORMAL][Prod0_ID18] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-17 08:29:59 - [DTE Detalle][Prod0_ID18] Agregado a venta_detalles_para_api con formato original 2025-10-17 08:29:59 - --- Fin procesamiento para Prod0_ID18 --- 2025-10-17 08:29:59 - Detalles de venta insertados y stock actualizado. 2025-10-17 08:29:59 - No se intentó la emisión DTE para Venta ID: 19 (Modo API inactivo o condiciones no cumplidas). 2025-10-17 08:29:59 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 19 2025-10-17 08:29:59 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-17 08:29:59 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-17 08:29:59 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-17 08:29:59 - Transacción completada con éxito para Venta ID: 19 2025-10-17 08:29:59 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-17 08:29:59 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-18 14:11:20 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-18 14:11:20 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-18 14:11:20 - Datos recibidos: {"productos":[{"id":21,"codigo":"12345","cantidad":1,"precio":3500,"subtotal":2941,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":36,"codigo":"12345","tipo_codigo":"diferente","cantidad":"100.00","fecha_vencimiento":"2025-12-26"},{"id":37,"codigo":"67890","tipo_codigo":"diferente","cantidad":"50.00","fecha_vencimiento":"2026-01-30"}]}],"metodo_pago":"1","total":2941,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-18 14:11:20 - Content-Type: application/json 2025-10-18 14:11:20 - Resultado de json_decode: OK 2025-10-18 14:11:20 - ID sesión de caja recibido en JSON: 10 2025-10-18 14:11:20 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-18 14:11:20 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-18 14:11:20 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-18 14:11:20 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-18 14:11:21 - Modo API DTE está INACTIVO según configuración. 2025-10-18 14:11:21 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-18 14:11:21 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-18 14:11:21 - Venta insertada con ID: 20 2025-10-18 14:11:21 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-18 14:11:21 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 20) 2025-10-18 14:11:21 - Token de vista generado: c55198df1441b9187ee4aa7c0b1fb5a6 2025-10-18 14:11:21 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-18 14:11:21 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-18 14:11:21 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-18 14:11:21 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-18 14:11:21 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-18 14:11:21 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-18 14:11:21 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-18 14:11:21 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-18 14:11:21 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-18 14:11:21 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-18 14:11:21 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-18 14:11:21 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-18 14:11:21 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-18 14:11:21 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-18 14:11:21 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-18 14:11:21 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-18 14:11:21 - --- Iniciando procesamiento para Prod0_ID21 --- 2025-10-18 14:11:21 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID21] Params: {"pid":21} 2025-10-18 14:11:21 - [Stock Check] Producto ID: 21, Tipo Código: diferente, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-18 14:11:21 - [DEBUG PRODUCTO][Prod0_ID21] Datos recibidos: {"id":21,"codigo":"12345","cantidad":1,"precio":3500,"subtotal":2941,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":36,"codigo":"12345","tipo_codigo":"diferente","cantidad":"100.00","fecha_vencimiento":"2025-12-26"},{"id":37,"codigo":"67890","tipo_codigo":"diferente","cantidad":"50.00","fecha_vencimiento":"2026-01-30"}]} 2025-10-18 14:11:21 - [LOTE AUTO-DETECTADO][Prod0_ID21] Código escaneado 12345 pertenece al LOTE1 (ID: 36) 2025-10-18 14:11:21 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID21] Params: cantidad=1, peso=, lote_id=36 2025-10-18 14:11:21 - [Stock Process][Prod0_ID21] Procesando stock con cantidad: 1 2025-10-18 14:11:21 - [Stock Diferente - Cantidad][Prod0_ID21] Procesando. 2025-10-18 14:11:21 - [DB EXECUTE][ID: FindEscaneado_Prod0_ID21] Params: {"pid":"21","codigo":"12345"} 2025-10-18 14:11:21 - [Stock Diferente][Prod0_ID21] Producto diferente - código de barras específico: 36, numero_lote: LOTE1 2025-10-18 14:11:21 - [Stock Diferente - Cantidad][Prod0_ID21] Código '12345' (ID:36): Necesitadas=1, Disponibles Escaneado=100, A procesar con este=1 2025-10-18 14:11:21 - [DB EXECUTE][ID: UpdateEscaneado_Prod0_ID21] Params: {"cant":"1","id":36} 2025-10-18 14:11:21 - [Stock Diferente - Cantidad][Prod0_ID21] Éxito: Actualizada cantidad para ID 36. Descontado: 1 2025-10-18 14:11:21 - [Stock Diferente - Cantidad][Prod0_ID21] Cantidad restante a procesar: 0 2025-10-18 14:11:21 - [Stock Diferente - Cantidad][Prod0_ID21] Éxito final: Procesadas 1 unidades. 2025-10-18 14:11:21 - [Stock Strategy NORMAL][Prod0_ID21] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-18 14:11:21 - [Stock Update NORMAL][Prod0_ID21] codigos_barras ya actualizado en sección anterior 2025-10-18 14:11:21 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 21, Cantidad: 1, Venta ID: 20 2025-10-18 14:11:21 - [Movimiento Stock] Registrando movimiento para Producto ID: 21, Cantidad: 1 2025-10-18 14:11:21 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 21 2025-10-18 14:11:21 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-18 14:11:21 - [Stock Strategy NORMAL][Prod0_ID21] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-18 14:11:21 - [DTE Detalle][Prod0_ID21] Agregado a venta_detalles_para_api con formato original 2025-10-18 14:11:21 - --- Fin procesamiento para Prod0_ID21 --- 2025-10-18 14:11:21 - Detalles de venta insertados y stock actualizado. 2025-10-18 14:11:21 - No se intentó la emisión DTE para Venta ID: 20 (Modo API inactivo o condiciones no cumplidas). 2025-10-18 14:11:21 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 20 2025-10-18 14:11:21 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-18 14:11:21 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-18 14:11:21 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-18 14:11:21 - Transacción completada con éxito para Venta ID: 20 2025-10-18 14:11:21 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-18 14:11:21 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-18 14:17:04 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-18 14:17:04 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-18 14:17:04 - Datos recibidos: {"productos":[{"id":18,"codigo":"17606528723077","cantidad":4,"precio":2500,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":32,"codigo":"17606528723077","tipo_codigo":"manual","cantidad":"96.00","fecha_vencimiento":"2025-10-31"},{"id":33,"codigo":"17606528721072","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":"2025-11-28"}]}],"metodo_pago":"2","total":8403,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-18 14:17:04 - Content-Type: application/json 2025-10-18 14:17:04 - Resultado de json_decode: OK 2025-10-18 14:17:04 - ID sesión de caja recibido en JSON: 10 2025-10-18 14:17:04 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-18 14:17:04 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-18 14:17:04 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-18 14:17:04 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-18 14:17:04 - Modo API DTE está INACTIVO según configuración. 2025-10-18 14:17:04 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-18 14:17:04 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-18 14:17:04 - Venta insertada con ID: 21 2025-10-18 14:17:04 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-18 14:17:04 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 21) 2025-10-18 14:17:04 - Token de vista generado: 14fa6f9be57c013010305a143c64a0b3 2025-10-18 14:17:04 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-18 14:17:04 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-18 14:17:04 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-18 14:17:04 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-18 14:17:04 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-18 14:17:04 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-18 14:17:04 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-18 14:17:04 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-18 14:17:04 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-18 14:17:04 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-18 14:17:04 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-18 14:17:04 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-18 14:17:04 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-18 14:17:04 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-18 14:17:04 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-18 14:17:04 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-18 14:17:04 - --- Iniciando procesamiento para Prod0_ID18 --- 2025-10-18 14:17:04 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID18] Params: {"pid":18} 2025-10-18 14:17:04 - [Stock Check] Producto ID: 18, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-18 14:17:04 - [DEBUG PRODUCTO][Prod0_ID18] Datos recibidos: {"id":18,"codigo":"17606528723077","cantidad":4,"precio":2500,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":32,"codigo":"17606528723077","tipo_codigo":"manual","cantidad":"96.00","fecha_vencimiento":"2025-10-31"},{"id":33,"codigo":"17606528721072","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":"2025-11-28"}]} 2025-10-18 14:17:04 - [LOTE AUTO-DETECTADO][Prod0_ID18] Código escaneado 17606528723077 pertenece al LOTE1 (ID: 32) 2025-10-18 14:17:04 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID18] Params: cantidad=4, peso=, lote_id=32 2025-10-18 14:17:04 - [Stock Process][Prod0_ID18] Procesando stock con cantidad: 4 2025-10-18 14:17:04 - [Stock manual][Prod0_ID18] Aplicando lógica basada en cantidad. 2025-10-18 14:17:04 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID18] Params: {"pid":"18","codigo":"17606528723077"} 2025-10-18 14:17:04 - [Stock Manual][Prod0_ID18] Producto manual - código de barras específico: 32, numero_lote: LOTE1 2025-10-18 14:17:04 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID18_Esc] Params: {"cant":"4","id":32} 2025-10-18 14:17:04 - [Stock manual][Prod0_ID18] Actualizado código escaneado ID: 32. Descontado: 4 2025-10-18 14:17:04 - [Stock Strategy NORMAL][Prod0_ID18] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 4 2025-10-18 14:17:04 - [Stock Update NORMAL][Prod0_ID18] codigos_barras ya actualizado en sección anterior 2025-10-18 14:17:04 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 18, Cantidad: 4, Venta ID: 21 2025-10-18 14:17:04 - [Movimiento Stock] Registrando movimiento para Producto ID: 18, Cantidad: 4 2025-10-18 14:17:04 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 18 2025-10-18 14:17:04 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-18 14:17:04 - [Stock Strategy NORMAL][Prod0_ID18] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-18 14:17:04 - [DTE Detalle][Prod0_ID18] Agregado a venta_detalles_para_api con formato original 2025-10-18 14:17:04 - --- Fin procesamiento para Prod0_ID18 --- 2025-10-18 14:17:04 - Detalles de venta insertados y stock actualizado. 2025-10-18 14:17:04 - No se intentó la emisión DTE para Venta ID: 21 (Modo API inactivo o condiciones no cumplidas). 2025-10-18 14:17:04 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 21 2025-10-18 14:17:04 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-18 14:17:04 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-18 14:17:04 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-18 14:17:04 - Transacción completada con éxito para Venta ID: 21 2025-10-18 14:17:04 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-18 14:17:04 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-18 14:17:28 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-18 14:17:28 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-18 14:17:28 - Datos recibidos: {"productos":[{"id":21,"codigo":"12345","cantidad":1,"precio":3500,"subtotal":2941,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":36,"codigo":"12345","tipo_codigo":"diferente","cantidad":"99.00","fecha_vencimiento":"2025-12-26"},{"id":37,"codigo":"67890","tipo_codigo":"diferente","cantidad":"50.00","fecha_vencimiento":"2026-01-30"}]}],"metodo_pago":"2","total":2941,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-18 14:17:28 - Content-Type: application/json 2025-10-18 14:17:28 - Resultado de json_decode: OK 2025-10-18 14:17:28 - ID sesión de caja recibido en JSON: 10 2025-10-18 14:17:28 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-18 14:17:28 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-18 14:17:28 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-18 14:17:28 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-18 14:17:28 - Modo API DTE está INACTIVO según configuración. 2025-10-18 14:17:28 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-18 14:17:28 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-18 14:17:28 - Venta insertada con ID: 22 2025-10-18 14:17:28 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-18 14:17:28 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 22) 2025-10-18 14:17:28 - Token de vista generado: d00caa9cc76a1fa41fd8c70af70a1a05 2025-10-18 14:17:28 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-18 14:17:28 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-18 14:17:28 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-18 14:17:28 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-18 14:17:28 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-18 14:17:28 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-18 14:17:28 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-18 14:17:28 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-18 14:17:28 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-18 14:17:28 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-18 14:17:28 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-18 14:17:28 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-18 14:17:28 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-18 14:17:28 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-18 14:17:28 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-18 14:17:28 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-18 14:17:28 - --- Iniciando procesamiento para Prod0_ID21 --- 2025-10-18 14:17:28 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID21] Params: {"pid":21} 2025-10-18 14:17:28 - [Stock Check] Producto ID: 21, Tipo Código: diferente, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-18 14:17:28 - [DEBUG PRODUCTO][Prod0_ID21] Datos recibidos: {"id":21,"codigo":"12345","cantidad":1,"precio":3500,"subtotal":2941,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":36,"codigo":"12345","tipo_codigo":"diferente","cantidad":"99.00","fecha_vencimiento":"2025-12-26"},{"id":37,"codigo":"67890","tipo_codigo":"diferente","cantidad":"50.00","fecha_vencimiento":"2026-01-30"}]} 2025-10-18 14:17:28 - [LOTE AUTO-DETECTADO][Prod0_ID21] Código escaneado 12345 pertenece al LOTE1 (ID: 36) 2025-10-18 14:17:28 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID21] Params: cantidad=1, peso=, lote_id=36 2025-10-18 14:17:28 - [Stock Process][Prod0_ID21] Procesando stock con cantidad: 1 2025-10-18 14:17:28 - [Stock Diferente - Cantidad][Prod0_ID21] Procesando. 2025-10-18 14:17:28 - [DB EXECUTE][ID: FindEscaneado_Prod0_ID21] Params: {"pid":"21","codigo":"12345"} 2025-10-18 14:17:28 - [Stock Diferente][Prod0_ID21] Producto diferente - código de barras específico: 36, numero_lote: LOTE1 2025-10-18 14:17:28 - [Stock Diferente - Cantidad][Prod0_ID21] Código '12345' (ID:36): Necesitadas=1, Disponibles Escaneado=99, A procesar con este=1 2025-10-18 14:17:28 - [DB EXECUTE][ID: UpdateEscaneado_Prod0_ID21] Params: {"cant":"1","id":36} 2025-10-18 14:17:28 - [Stock Diferente - Cantidad][Prod0_ID21] Éxito: Actualizada cantidad para ID 36. Descontado: 1 2025-10-18 14:17:28 - [Stock Diferente - Cantidad][Prod0_ID21] Cantidad restante a procesar: 0 2025-10-18 14:17:28 - [Stock Diferente - Cantidad][Prod0_ID21] Éxito final: Procesadas 1 unidades. 2025-10-18 14:17:28 - [Stock Strategy NORMAL][Prod0_ID21] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-18 14:17:28 - [Stock Update NORMAL][Prod0_ID21] codigos_barras ya actualizado en sección anterior 2025-10-18 14:17:28 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 21, Cantidad: 1, Venta ID: 22 2025-10-18 14:17:28 - [Movimiento Stock] Registrando movimiento para Producto ID: 21, Cantidad: 1 2025-10-18 14:17:28 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 21 2025-10-18 14:17:28 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-18 14:17:28 - [Stock Strategy NORMAL][Prod0_ID21] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-18 14:17:28 - [DTE Detalle][Prod0_ID21] Agregado a venta_detalles_para_api con formato original 2025-10-18 14:17:28 - --- Fin procesamiento para Prod0_ID21 --- 2025-10-18 14:17:28 - Detalles de venta insertados y stock actualizado. 2025-10-18 14:17:28 - No se intentó la emisión DTE para Venta ID: 22 (Modo API inactivo o condiciones no cumplidas). 2025-10-18 14:17:28 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 22 2025-10-18 14:17:28 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-18 14:17:28 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-18 14:17:28 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-18 14:17:28 - Transacción completada con éxito para Venta ID: 22 2025-10-18 14:17:28 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-18 14:17:28 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-19 17:23:53 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-19 17:23:53 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-19 17:23:53 - Datos recibidos: {"productos":[{"id":21,"codigo":"12345","cantidad":1,"precio":3500,"subtotal":2941,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":36,"codigo":"12345","tipo_codigo":"diferente","cantidad":"98.00","fecha_vencimiento":"2025-12-26"},{"id":37,"codigo":"67890","tipo_codigo":"diferente","cantidad":"50.00","fecha_vencimiento":"2026-01-30"}]}],"metodo_pago":"2","total":2941,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-19 17:23:53 - Content-Type: application/json 2025-10-19 17:23:53 - Resultado de json_decode: OK 2025-10-19 17:23:53 - ID sesión de caja recibido en JSON: 10 2025-10-19 17:23:53 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-19 17:23:53 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-19 17:23:53 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-19 17:23:53 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-19 17:23:53 - Modo API DTE está INACTIVO según configuración. 2025-10-19 17:23:53 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-19 17:23:53 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-19 17:23:53 - Venta insertada con ID: 23 2025-10-19 17:23:53 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-19 17:23:53 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 23) 2025-10-19 17:23:53 - Token de vista generado: 1b451eea1096cd7433f8cfd20ce6034b 2025-10-19 17:23:53 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-19 17:23:53 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-19 17:23:53 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-19 17:23:53 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-19 17:23:53 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-19 17:23:53 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-19 17:23:53 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-19 17:23:53 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-19 17:23:53 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-19 17:23:53 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-19 17:23:53 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-19 17:23:53 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-19 17:23:53 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-19 17:23:53 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-19 17:23:53 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-19 17:23:53 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-19 17:23:53 - --- Iniciando procesamiento para Prod0_ID21 --- 2025-10-19 17:23:53 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID21] Params: {"pid":21} 2025-10-19 17:23:53 - [Stock Check] Producto ID: 21, Tipo Código: diferente, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-19 17:23:53 - [DEBUG PRODUCTO][Prod0_ID21] Datos recibidos: {"id":21,"codigo":"12345","cantidad":1,"precio":3500,"subtotal":2941,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":36,"codigo":"12345","tipo_codigo":"diferente","cantidad":"98.00","fecha_vencimiento":"2025-12-26"},{"id":37,"codigo":"67890","tipo_codigo":"diferente","cantidad":"50.00","fecha_vencimiento":"2026-01-30"}]} 2025-10-19 17:23:53 - [LOTE AUTO-DETECTADO][Prod0_ID21] Código escaneado 12345 pertenece al LOTE1 (ID: 36) 2025-10-19 17:23:53 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID21] Params: cantidad=1, peso=, lote_id=36 2025-10-19 17:23:53 - [Stock Process][Prod0_ID21] Procesando stock con cantidad: 1 2025-10-19 17:23:53 - [Stock Diferente - Cantidad][Prod0_ID21] Procesando. 2025-10-19 17:23:53 - [DB EXECUTE][ID: FindEscaneado_Prod0_ID21] Params: {"pid":"21","codigo":"12345"} 2025-10-19 17:23:53 - [Stock Diferente][Prod0_ID21] Producto diferente - código de barras específico: 36, numero_lote: LOTE1 2025-10-19 17:23:53 - [Stock Diferente - Cantidad][Prod0_ID21] Código '12345' (ID:36): Necesitadas=1, Disponibles Escaneado=98, A procesar con este=1 2025-10-19 17:23:53 - [DB EXECUTE][ID: UpdateEscaneado_Prod0_ID21] Params: {"cant":"1","id":36} 2025-10-19 17:23:53 - [Stock Diferente - Cantidad][Prod0_ID21] Éxito: Actualizada cantidad para ID 36. Descontado: 1 2025-10-19 17:23:53 - [Stock Diferente - Cantidad][Prod0_ID21] Cantidad restante a procesar: 0 2025-10-19 17:23:53 - [Stock Diferente - Cantidad][Prod0_ID21] Éxito final: Procesadas 1 unidades. 2025-10-19 17:23:53 - [Stock Strategy NORMAL][Prod0_ID21] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-19 17:23:53 - [Stock Update NORMAL][Prod0_ID21] codigos_barras ya actualizado en sección anterior 2025-10-19 17:23:53 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 21, Cantidad: 1, Venta ID: 23 2025-10-19 17:23:53 - [Movimiento Stock] Registrando movimiento para Producto ID: 21, Cantidad: 1 2025-10-19 17:23:53 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 21 2025-10-19 17:23:53 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-19 17:23:53 - [Stock Strategy NORMAL][Prod0_ID21] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-19 17:23:53 - [DTE Detalle][Prod0_ID21] Agregado a venta_detalles_para_api con formato original 2025-10-19 17:23:53 - --- Fin procesamiento para Prod0_ID21 --- 2025-10-19 17:23:53 - Detalles de venta insertados y stock actualizado. 2025-10-19 17:23:53 - No se intentó la emisión DTE para Venta ID: 23 (Modo API inactivo o condiciones no cumplidas). 2025-10-19 17:23:53 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 23 2025-10-19 17:23:53 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-19 17:23:53 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-19 17:23:53 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-19 17:23:53 - Transacción completada con éxito para Venta ID: 23 2025-10-19 17:23:53 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-19 17:23:53 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-19 17:48:39 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-19 17:48:39 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-19 17:48:39 - Datos recibidos: {"productos":[{"id":20,"codigo":"17606530606522","cantidad":2,"precio":1200,"subtotal":2400,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":35,"codigo":"17606530606522","tipo_codigo":"masivo","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"3","total":2017,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-19 17:48:39 - Content-Type: application/json 2025-10-19 17:48:39 - Resultado de json_decode: OK 2025-10-19 17:48:39 - ID sesión de caja recibido en JSON: 10 2025-10-19 17:48:39 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-19 17:48:39 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-19 17:48:39 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-19 17:48:39 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-19 17:48:39 - Modo API DTE está INACTIVO según configuración. 2025-10-19 17:48:39 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-19 17:48:39 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-19 17:48:39 - Venta insertada con ID: 24 2025-10-19 17:48:39 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-19 17:48:39 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 24) 2025-10-19 17:48:39 - Token de vista generado: d543f0ae888c1fde2e4f99b114fdb500 2025-10-19 17:48:39 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-19 17:48:39 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-19 17:48:39 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-19 17:48:39 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-19 17:48:39 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-19 17:48:39 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-19 17:48:39 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-19 17:48:39 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-19 17:48:39 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-19 17:48:39 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-19 17:48:39 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-19 17:48:39 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-19 17:48:39 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-19 17:48:39 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-19 17:48:39 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-19 17:48:39 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-19 17:48:39 - --- Iniciando procesamiento para Prod0_ID20 --- 2025-10-19 17:48:39 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID20] Params: {"pid":20} 2025-10-19 17:48:39 - [Stock Check] Producto ID: 20, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-19 17:48:39 - [DEBUG PRODUCTO][Prod0_ID20] Datos recibidos: {"id":20,"codigo":"17606530606522","cantidad":2,"precio":1200,"subtotal":2400,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":35,"codigo":"17606530606522","tipo_codigo":"masivo","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-19 17:48:39 - [LOTE MASIVO][Prod0_ID20] No actualizando codigos_barras aquí - se manejará por triggers 2025-10-19 17:48:39 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID20] Params: cantidad=2, peso=, lote_id=35 2025-10-19 17:48:39 - [Stock Process][Prod0_ID20] Procesando stock con cantidad: 2 2025-10-19 17:48:39 - [Stock Masivo][Prod0_ID20] Aplicando lógica de UPDATE. 2025-10-19 17:48:39 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID20] Params: {"pid":"20"} 2025-10-19 17:48:39 - [Stock Masivo][Prod0_ID20] Producto masivo - código de barras principal: 35, numero_lote: 2025-10-19 17:48:39 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID20] Params: {"cant":"2","id":35} 2025-10-19 17:48:39 - [Stock Masivo][Prod0_ID20] Stock actualizado para ID: 35. Descontado: 2. 2025-10-19 17:48:39 - [Stock Strategy NORMAL][Prod0_ID20] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 2 2025-10-19 17:48:39 - [Stock Update NORMAL][Prod0_ID20] codigos_barras ya actualizado en sección anterior 2025-10-19 17:48:39 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 20, Cantidad: 2, Venta ID: 24 2025-10-19 17:48:39 - [Movimiento Stock] Registrando movimiento para Producto ID: 20, Cantidad: 2 2025-10-19 17:48:39 - [MOVIMIENTO MASIVO] Stock actual: 98.00, Cantidad vendida: 2 2025-10-19 17:48:39 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 20 2025-10-19 17:48:39 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-19 17:48:39 - [Stock Strategy NORMAL][Prod0_ID20] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-19 17:48:39 - [DTE Detalle][Prod0_ID20] Agregado a venta_detalles_para_api con formato original 2025-10-19 17:48:39 - --- Fin procesamiento para Prod0_ID20 --- 2025-10-19 17:48:39 - Detalles de venta insertados y stock actualizado. 2025-10-19 17:48:39 - No se intentó la emisión DTE para Venta ID: 24 (Modo API inactivo o condiciones no cumplidas). 2025-10-19 17:48:39 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 24 2025-10-19 17:48:39 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-19 17:48:39 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-19 17:48:39 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-19 17:48:39 - Transacción completada con éxito para Venta ID: 24 2025-10-19 17:48:39 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-19 17:48:39 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 13:18:28 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 13:18:28 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 13:18:28 - Datos recibidos: {"productos":[{"id":46,"codigo":"17612362792239","cantidad":1,"precio":11900,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":70,"codigo":"17612362792239","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":10000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-23 13:18:28 - Content-Type: application/json 2025-10-23 13:18:28 - Resultado de json_decode: OK 2025-10-23 13:18:28 - ID sesión de caja recibido en JSON: 10 2025-10-23 13:18:28 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 13:18:28 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-23 13:18:28 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 13:18:28 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-23 13:18:28 - Modo API DTE está INACTIVO según configuración. 2025-10-23 13:18:28 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 13:18:28 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-23 13:18:28 - Venta insertada con ID: 25 2025-10-23 13:18:28 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 13:18:28 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 25) 2025-10-23 13:18:28 - Token de vista generado: 81d581a119fab8c713e580545c5b399e 2025-10-23 13:18:28 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 13:18:28 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 13:18:28 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 13:18:28 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 13:18:28 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 13:18:28 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 13:18:28 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 13:18:28 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 13:18:28 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 13:18:28 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 13:18:28 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 13:18:28 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 13:18:28 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 13:18:28 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 13:18:28 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 13:18:28 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 13:18:28 - --- Iniciando procesamiento para Prod0_ID46 --- 2025-10-23 13:18:28 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID46] Params: {"pid":46} 2025-10-23 13:18:28 - [Stock Check] Producto ID: 46, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 13:18:28 - [DEBUG PRODUCTO][Prod0_ID46] Datos recibidos: {"id":46,"codigo":"17612362792239","cantidad":1,"precio":11900,"subtotal":10000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":70,"codigo":"17612362792239","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-23 13:18:28 - [LOTE AUTO-DETECTADO][Prod0_ID46] Código escaneado 17612362792239 pertenece al LOTE1 (ID: 70) 2025-10-23 13:18:28 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID46] Params: cantidad=1, peso=, lote_id=70 2025-10-23 13:18:28 - [Stock Process][Prod0_ID46] Procesando stock con cantidad: 1 2025-10-23 13:18:28 - [Stock manual][Prod0_ID46] Aplicando lógica basada en cantidad. 2025-10-23 13:18:28 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID46] Params: {"pid":"46","codigo":"17612362792239"} 2025-10-23 13:18:28 - [Stock Manual][Prod0_ID46] Producto manual - código de barras específico: 70, numero_lote: LOTE1 2025-10-23 13:18:28 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID46_Esc] Params: {"cant":"1","id":70} 2025-10-23 13:18:28 - [Stock manual][Prod0_ID46] Actualizado código escaneado ID: 70. Descontado: 1 2025-10-23 13:18:28 - [Stock Strategy NORMAL][Prod0_ID46] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-23 13:18:28 - [Stock Update NORMAL][Prod0_ID46] codigos_barras ya actualizado en sección anterior 2025-10-23 13:18:28 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 46, Cantidad: 1, Venta ID: 25 2025-10-23 13:18:28 - [Movimiento Stock] Registrando movimiento para Producto ID: 46, Cantidad: 1 2025-10-23 13:18:28 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 46 2025-10-23 13:18:28 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 13:18:28 - [Stock Strategy NORMAL][Prod0_ID46] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 13:18:28 - [DTE Detalle][Prod0_ID46] Agregado a venta_detalles_para_api con formato original 2025-10-23 13:18:28 - --- Fin procesamiento para Prod0_ID46 --- 2025-10-23 13:18:28 - Detalles de venta insertados y stock actualizado. 2025-10-23 13:18:28 - No se intentó la emisión DTE para Venta ID: 25 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 13:18:28 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 25 2025-10-23 13:18:28 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 13:18:28 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 13:18:28 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 13:18:28 - Transacción completada con éxito para Venta ID: 25 2025-10-23 13:18:28 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 13:18:28 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:22:50 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:22:50 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:22:50 - Datos recibidos: {"productos":[{"id":56,"codigo":"11112","cantidad":2,"precio":55000,"subtotal":110000,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":79,"codigo":"11112","tipo_codigo":"diferente","cantidad":"10.00","fecha_vencimiento":null},{"id":80,"codigo":"34565","tipo_codigo":"diferente","cantidad":"20.00","fecha_vencimiento":null},{"id":81,"codigo":"123242","tipo_codigo":"diferente","cantidad":"30.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":92437,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"12"} 2025-10-23 23:22:50 - Content-Type: application/json 2025-10-23 23:22:50 - Resultado de json_decode: OK 2025-10-23 23:22:50 - ID sesión de caja recibido en JSON: 12 2025-10-23 23:22:50 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:22:50 - [DB EXECUTE][ID: ConfigDTE] Params: ["16.414.902-1"] 2025-10-23 23:22:50 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:22:50 - [DB EXECUTE][ID: DatosNegocio] Params: ["16.414.902-1"] 2025-10-23 23:22:50 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:22:50 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:22:50 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=12) 2025-10-23 23:22:50 - Venta insertada con ID: 26 2025-10-23 23:22:50 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:22:50 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 26) 2025-10-23 23:22:50 - Token de vista generado: 1e07d02d29854dcf4dfdcf6029b7407c 2025-10-23 23:22:50 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:22:50 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:22:50 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:22:50 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:22:50 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:22:50 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:22:50 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:22:50 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:22:50 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:22:50 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:22:50 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:22:50 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:22:50 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:22:50 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:22:50 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:22:50 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:22:50 - --- Iniciando procesamiento para Prod0_ID56 --- 2025-10-23 23:22:50 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID56] Params: {"pid":56} 2025-10-23 23:22:50 - [Stock Check] Producto ID: 56, Tipo Código: diferente, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:22:50 - [DEBUG PRODUCTO][Prod0_ID56] Datos recibidos: {"id":56,"codigo":"11112","cantidad":2,"precio":55000,"subtotal":110000,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":79,"codigo":"11112","tipo_codigo":"diferente","cantidad":"10.00","fecha_vencimiento":null},{"id":80,"codigo":"34565","tipo_codigo":"diferente","cantidad":"20.00","fecha_vencimiento":null},{"id":81,"codigo":"123242","tipo_codigo":"diferente","cantidad":"30.00","fecha_vencimiento":null}]} 2025-10-23 23:22:50 - [LOTE AUTO-DETECTADO][Prod0_ID56] Código escaneado 11112 pertenece al LOTE1 (ID: 79) 2025-10-23 23:22:50 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID56] Params: cantidad=2, peso=, lote_id=79 2025-10-23 23:22:50 - [Stock Process][Prod0_ID56] Procesando stock con cantidad: 2 2025-10-23 23:22:50 - [Stock Diferente - Cantidad][Prod0_ID56] Procesando. 2025-10-23 23:22:50 - [DB EXECUTE][ID: FindEscaneado_Prod0_ID56] Params: {"pid":"56","codigo":"11112"} 2025-10-23 23:22:50 - [Stock Diferente][Prod0_ID56] Producto diferente - código de barras específico: 79, numero_lote: LOTE1 2025-10-23 23:22:50 - [Stock Diferente - Cantidad][Prod0_ID56] Código '11112' (ID:79): Necesitadas=2, Disponibles Escaneado=10, A procesar con este=2 2025-10-23 23:22:50 - [DB EXECUTE][ID: UpdateEscaneado_Prod0_ID56] Params: {"cant":"2","id":79} 2025-10-23 23:22:50 - [Stock Diferente - Cantidad][Prod0_ID56] Éxito: Actualizada cantidad para ID 79. Descontado: 2 2025-10-23 23:22:50 - [Stock Diferente - Cantidad][Prod0_ID56] Cantidad restante a procesar: 0 2025-10-23 23:22:50 - [Stock Diferente - Cantidad][Prod0_ID56] Éxito final: Procesadas 2 unidades. 2025-10-23 23:22:50 - [Stock Strategy NORMAL][Prod0_ID56] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 2 2025-10-23 23:22:50 - [Stock Update NORMAL][Prod0_ID56] codigos_barras ya actualizado en sección anterior 2025-10-23 23:22:50 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 56, Cantidad: 2, Venta ID: 26 2025-10-23 23:22:50 - [Movimiento Stock] Registrando movimiento para Producto ID: 56, Cantidad: 2 2025-10-23 23:22:50 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 56 2025-10-23 23:22:50 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:22:50 - [Stock Strategy NORMAL][Prod0_ID56] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:22:50 - [DTE Detalle][Prod0_ID56] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:22:50 - --- Fin procesamiento para Prod0_ID56 --- 2025-10-23 23:22:50 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:22:50 - No se intentó la emisión DTE para Venta ID: 26 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:22:50 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 26 2025-10-23 23:22:50 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:22:50 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:22:50 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:22:50 - Transacción completada con éxito para Venta ID: 26 2025-10-23 23:22:50 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:22:50 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:22:59 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:22:59 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:22:59 - Datos recibidos: {"productos":[{"id":57,"codigo":"17612725059165","cantidad":5,"precio":4165,"subtotal":20825,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":82,"codigo":"17612725059165","tipo_codigo":"manual","cantidad":"150.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":17500,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"12"} 2025-10-23 23:22:59 - Content-Type: application/json 2025-10-23 23:22:59 - Resultado de json_decode: OK 2025-10-23 23:22:59 - ID sesión de caja recibido en JSON: 12 2025-10-23 23:22:59 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:22:59 - [DB EXECUTE][ID: ConfigDTE] Params: ["16.414.902-1"] 2025-10-23 23:22:59 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:22:59 - [DB EXECUTE][ID: DatosNegocio] Params: ["16.414.902-1"] 2025-10-23 23:22:59 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:22:59 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:22:59 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=12) 2025-10-23 23:22:59 - Venta insertada con ID: 27 2025-10-23 23:22:59 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:22:59 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 27) 2025-10-23 23:22:59 - Token de vista generado: 48d9b982becd6c643c7c020b6c5399b6 2025-10-23 23:22:59 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:22:59 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:22:59 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:22:59 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:22:59 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:22:59 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:22:59 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:22:59 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:22:59 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:22:59 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:22:59 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:22:59 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:22:59 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:22:59 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:22:59 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:22:59 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:22:59 - --- Iniciando procesamiento para Prod0_ID57 --- 2025-10-23 23:22:59 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID57] Params: {"pid":57} 2025-10-23 23:22:59 - [Stock Check] Producto ID: 57, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:22:59 - [DEBUG PRODUCTO][Prod0_ID57] Datos recibidos: {"id":57,"codigo":"17612725059165","cantidad":5,"precio":4165,"subtotal":20825,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":82,"codigo":"17612725059165","tipo_codigo":"manual","cantidad":"150.00","fecha_vencimiento":null}]} 2025-10-23 23:22:59 - [LOTE AUTO-DETECTADO][Prod0_ID57] Código escaneado 17612725059165 pertenece al LOTE1 (ID: 82) 2025-10-23 23:22:59 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID57] Params: cantidad=5, peso=, lote_id=82 2025-10-23 23:22:59 - [Stock Process][Prod0_ID57] Procesando stock con cantidad: 5 2025-10-23 23:22:59 - [Stock manual][Prod0_ID57] Aplicando lógica basada en cantidad. 2025-10-23 23:22:59 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID57] Params: {"pid":"57","codigo":"17612725059165"} 2025-10-23 23:22:59 - [Stock Manual][Prod0_ID57] Producto manual - código de barras específico: 82, numero_lote: LOTE1 2025-10-23 23:22:59 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID57_Esc] Params: {"cant":"5","id":82} 2025-10-23 23:22:59 - [Stock manual][Prod0_ID57] Actualizado código escaneado ID: 82. Descontado: 5 2025-10-23 23:22:59 - [Stock Strategy NORMAL][Prod0_ID57] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-23 23:22:59 - [Stock Update NORMAL][Prod0_ID57] codigos_barras ya actualizado en sección anterior 2025-10-23 23:22:59 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 57, Cantidad: 5, Venta ID: 27 2025-10-23 23:22:59 - [Movimiento Stock] Registrando movimiento para Producto ID: 57, Cantidad: 5 2025-10-23 23:22:59 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 57 2025-10-23 23:22:59 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:22:59 - [Stock Strategy NORMAL][Prod0_ID57] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:22:59 - [DTE Detalle][Prod0_ID57] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:22:59 - --- Fin procesamiento para Prod0_ID57 --- 2025-10-23 23:22:59 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:22:59 - No se intentó la emisión DTE para Venta ID: 27 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:22:59 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 27 2025-10-23 23:22:59 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:22:59 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:22:59 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:22:59 - Transacción completada con éxito para Venta ID: 27 2025-10-23 23:22:59 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:22:59 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:23:11 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:23:11 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:23:11 - Datos recibidos: {"productos":[{"id":54,"codigo":"17612720655999","cantidad":1,"precio":2100,"subtotal":1765,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":77,"codigo":"17612720655999","tipo_codigo":"masivo","cantidad":"30.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":1765,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"12"} 2025-10-23 23:23:11 - Content-Type: application/json 2025-10-23 23:23:11 - Resultado de json_decode: OK 2025-10-23 23:23:11 - ID sesión de caja recibido en JSON: 12 2025-10-23 23:23:11 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:23:11 - [DB EXECUTE][ID: ConfigDTE] Params: ["16.414.902-1"] 2025-10-23 23:23:11 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:23:11 - [DB EXECUTE][ID: DatosNegocio] Params: ["16.414.902-1"] 2025-10-23 23:23:11 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:23:11 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:23:11 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=12) 2025-10-23 23:23:11 - Venta insertada con ID: 28 2025-10-23 23:23:11 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:23:11 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 28) 2025-10-23 23:23:11 - Token de vista generado: 8d16bc9ee02cadcdb5792022c21a67b8 2025-10-23 23:23:11 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:23:11 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:23:11 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:23:11 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:23:11 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:23:11 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:23:11 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:23:11 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:23:11 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:23:11 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:23:11 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:23:11 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:23:11 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:23:11 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:23:11 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:23:11 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:23:11 - --- Iniciando procesamiento para Prod0_ID54 --- 2025-10-23 23:23:11 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID54] Params: {"pid":54} 2025-10-23 23:23:11 - [Stock Check] Producto ID: 54, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:23:11 - [DEBUG PRODUCTO][Prod0_ID54] Datos recibidos: {"id":54,"codigo":"17612720655999","cantidad":1,"precio":2100,"subtotal":1765,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":77,"codigo":"17612720655999","tipo_codigo":"masivo","cantidad":"30.00","fecha_vencimiento":null}]} 2025-10-23 23:23:11 - [LOTE MASIVO][Prod0_ID54] No actualizando codigos_barras aquí - se manejará por triggers 2025-10-23 23:23:11 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID54] Params: cantidad=1, peso=, lote_id=77 2025-10-23 23:23:11 - [Stock Process][Prod0_ID54] Procesando stock con cantidad: 1 2025-10-23 23:23:11 - [Stock Masivo][Prod0_ID54] Aplicando lógica de UPDATE. 2025-10-23 23:23:11 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID54] Params: {"pid":"54"} 2025-10-23 23:23:11 - [Stock Masivo][Prod0_ID54] Producto masivo - código de barras principal: 77, numero_lote: 2025-10-23 23:23:11 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID54] Params: {"cant":"1","id":77} 2025-10-23 23:23:11 - [Stock Masivo][Prod0_ID54] Stock actualizado para ID: 77. Descontado: 1. 2025-10-23 23:23:11 - [Stock Strategy NORMAL][Prod0_ID54] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-23 23:23:11 - [Stock Update NORMAL][Prod0_ID54] codigos_barras ya actualizado en sección anterior 2025-10-23 23:23:11 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 54, Cantidad: 1, Venta ID: 28 2025-10-23 23:23:11 - [Movimiento Stock] Registrando movimiento para Producto ID: 54, Cantidad: 1 2025-10-23 23:23:11 - [MOVIMIENTO MASIVO] Stock actual: 29.00, Cantidad vendida: 1 2025-10-23 23:23:11 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 54 2025-10-23 23:23:11 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:23:11 - [Stock Strategy NORMAL][Prod0_ID54] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:23:11 - [DTE Detalle][Prod0_ID54] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:23:11 - --- Fin procesamiento para Prod0_ID54 --- 2025-10-23 23:23:11 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:23:11 - No se intentó la emisión DTE para Venta ID: 28 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:23:11 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 28 2025-10-23 23:23:11 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:23:11 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:23:11 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:23:11 - Transacción completada con éxito para Venta ID: 28 2025-10-23 23:23:11 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:23:11 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:23:22 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:23:22 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:23:22 - Datos recibidos: {"productos":[{"id":53,"codigo":"17612719981936","cantidad":1,"precio":4000,"subtotal":3361,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":76,"codigo":"17612719981936","tipo_codigo":"manual","cantidad":"20.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":3361,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"12"} 2025-10-23 23:23:22 - Content-Type: application/json 2025-10-23 23:23:22 - Resultado de json_decode: OK 2025-10-23 23:23:22 - ID sesión de caja recibido en JSON: 12 2025-10-23 23:23:22 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:23:22 - [DB EXECUTE][ID: ConfigDTE] Params: ["16.414.902-1"] 2025-10-23 23:23:22 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:23:22 - [DB EXECUTE][ID: DatosNegocio] Params: ["16.414.902-1"] 2025-10-23 23:23:22 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:23:22 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:23:22 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=12) 2025-10-23 23:23:22 - Venta insertada con ID: 29 2025-10-23 23:23:22 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:23:22 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 29) 2025-10-23 23:23:22 - Token de vista generado: 9a91dc093a7284c0a734e5c0b63c1fcc 2025-10-23 23:23:22 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:23:22 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:23:22 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:23:22 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:23:22 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:23:22 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:23:22 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:23:22 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:23:22 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:23:22 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:23:22 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:23:22 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:23:22 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:23:22 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:23:22 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:23:22 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:23:22 - --- Iniciando procesamiento para Prod0_ID53 --- 2025-10-23 23:23:22 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID53] Params: {"pid":53} 2025-10-23 23:23:22 - [Stock Check] Producto ID: 53, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:23:22 - [DEBUG PRODUCTO][Prod0_ID53] Datos recibidos: {"id":53,"codigo":"17612719981936","cantidad":1,"precio":4000,"subtotal":3361,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":76,"codigo":"17612719981936","tipo_codigo":"manual","cantidad":"20.00","fecha_vencimiento":null}]} 2025-10-23 23:23:22 - [LOTE AUTO-DETECTADO][Prod0_ID53] Código escaneado 17612719981936 pertenece al LOTE1 (ID: 76) 2025-10-23 23:23:22 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID53] Params: cantidad=1, peso=, lote_id=76 2025-10-23 23:23:22 - [Stock Process][Prod0_ID53] Procesando stock con cantidad: 1 2025-10-23 23:23:22 - [Stock manual][Prod0_ID53] Aplicando lógica basada en cantidad. 2025-10-23 23:23:22 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID53] Params: {"pid":"53","codigo":"17612719981936"} 2025-10-23 23:23:22 - [Stock Manual][Prod0_ID53] Producto manual - código de barras específico: 76, numero_lote: LOTE1 2025-10-23 23:23:22 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID53_Esc] Params: {"cant":"1","id":76} 2025-10-23 23:23:22 - [Stock manual][Prod0_ID53] Actualizado código escaneado ID: 76. Descontado: 1 2025-10-23 23:23:22 - [Stock Strategy NORMAL][Prod0_ID53] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-23 23:23:22 - [Stock Update NORMAL][Prod0_ID53] codigos_barras ya actualizado en sección anterior 2025-10-23 23:23:22 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 53, Cantidad: 1, Venta ID: 29 2025-10-23 23:23:22 - [Movimiento Stock] Registrando movimiento para Producto ID: 53, Cantidad: 1 2025-10-23 23:23:22 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 53 2025-10-23 23:23:22 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:23:22 - [Stock Strategy NORMAL][Prod0_ID53] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:23:22 - [DTE Detalle][Prod0_ID53] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:23:22 - --- Fin procesamiento para Prod0_ID53 --- 2025-10-23 23:23:22 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:23:22 - No se intentó la emisión DTE para Venta ID: 29 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:23:22 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 29 2025-10-23 23:23:22 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:23:22 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:23:22 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:23:22 - Transacción completada con éxito para Venta ID: 29 2025-10-23 23:23:22 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:23:22 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:23:31 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:23:31 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:23:31 - Datos recibidos: {"productos":[{"id":53,"codigo":"17612719981936","cantidad":1,"precio":4000,"subtotal":3361,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":76,"codigo":"17612719981936","tipo_codigo":"manual","cantidad":"19.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":3361,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"12"} 2025-10-23 23:23:31 - Content-Type: application/json 2025-10-23 23:23:31 - Resultado de json_decode: OK 2025-10-23 23:23:31 - ID sesión de caja recibido en JSON: 12 2025-10-23 23:23:31 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:23:31 - [DB EXECUTE][ID: ConfigDTE] Params: ["16.414.902-1"] 2025-10-23 23:23:31 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:23:31 - [DB EXECUTE][ID: DatosNegocio] Params: ["16.414.902-1"] 2025-10-23 23:23:31 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:23:31 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:23:31 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=12) 2025-10-23 23:23:31 - Venta insertada con ID: 30 2025-10-23 23:23:31 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:23:31 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 30) 2025-10-23 23:23:31 - Token de vista generado: 325d39adef7120094bbc6f15d5699a54 2025-10-23 23:23:31 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:23:31 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:23:31 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:23:31 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:23:31 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:23:31 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:23:31 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:23:31 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:23:31 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:23:31 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:23:31 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:23:31 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:23:31 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:23:31 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:23:31 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:23:31 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:23:31 - --- Iniciando procesamiento para Prod0_ID53 --- 2025-10-23 23:23:31 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID53] Params: {"pid":53} 2025-10-23 23:23:31 - [Stock Check] Producto ID: 53, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:23:31 - [DEBUG PRODUCTO][Prod0_ID53] Datos recibidos: {"id":53,"codigo":"17612719981936","cantidad":1,"precio":4000,"subtotal":3361,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":76,"codigo":"17612719981936","tipo_codigo":"manual","cantidad":"19.00","fecha_vencimiento":null}]} 2025-10-23 23:23:31 - [LOTE AUTO-DETECTADO][Prod0_ID53] Código escaneado 17612719981936 pertenece al LOTE1 (ID: 76) 2025-10-23 23:23:31 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID53] Params: cantidad=1, peso=, lote_id=76 2025-10-23 23:23:31 - [Stock Process][Prod0_ID53] Procesando stock con cantidad: 1 2025-10-23 23:23:31 - [Stock manual][Prod0_ID53] Aplicando lógica basada en cantidad. 2025-10-23 23:23:31 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID53] Params: {"pid":"53","codigo":"17612719981936"} 2025-10-23 23:23:31 - [Stock Manual][Prod0_ID53] Producto manual - código de barras específico: 76, numero_lote: LOTE1 2025-10-23 23:23:31 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID53_Esc] Params: {"cant":"1","id":76} 2025-10-23 23:23:31 - [Stock manual][Prod0_ID53] Actualizado código escaneado ID: 76. Descontado: 1 2025-10-23 23:23:31 - [Stock Strategy NORMAL][Prod0_ID53] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-23 23:23:31 - [Stock Update NORMAL][Prod0_ID53] codigos_barras ya actualizado en sección anterior 2025-10-23 23:23:31 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 53, Cantidad: 1, Venta ID: 30 2025-10-23 23:23:31 - [Movimiento Stock] Registrando movimiento para Producto ID: 53, Cantidad: 1 2025-10-23 23:23:31 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 53 2025-10-23 23:23:31 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:23:31 - [Stock Strategy NORMAL][Prod0_ID53] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:23:31 - [DTE Detalle][Prod0_ID53] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:23:31 - --- Fin procesamiento para Prod0_ID53 --- 2025-10-23 23:23:31 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:23:31 - No se intentó la emisión DTE para Venta ID: 30 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:23:31 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 30 2025-10-23 23:23:31 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:23:31 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:23:31 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:23:31 - Transacción completada con éxito para Venta ID: 30 2025-10-23 23:23:31 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:23:31 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:29:40 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:29:40 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:29:40 - Datos recibidos: {"productos":[{"id":58,"codigo":"17612727071462","cantidad":1,"precio":15000,"subtotal":12605,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":83,"codigo":"17612727071462","tipo_codigo":"manual","cantidad":"10.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":12605,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"11"} 2025-10-23 23:29:40 - Content-Type: application/json 2025-10-23 23:29:40 - Resultado de json_decode: OK 2025-10-23 23:29:40 - ID sesión de caja recibido en JSON: 11 2025-10-23 23:29:40 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:29:40 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.612.457-1"] 2025-10-23 23:29:40 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:29:40 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.612.457-1"] 2025-10-23 23:29:40 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:29:40 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:29:40 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=11) 2025-10-23 23:29:40 - Venta insertada con ID: 31 2025-10-23 23:29:40 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:29:40 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 31) 2025-10-23 23:29:40 - Token de vista generado: 1e1b9338985bfc8cab655c995c2a03f8 2025-10-23 23:29:40 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:29:40 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:29:40 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:29:40 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:29:40 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:29:40 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:29:40 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:29:40 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:29:40 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:29:40 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:29:40 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:29:40 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:29:40 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:29:40 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:29:40 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:29:40 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:29:40 - --- Iniciando procesamiento para Prod0_ID58 --- 2025-10-23 23:29:40 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID58] Params: {"pid":58} 2025-10-23 23:29:40 - [Stock Check] Producto ID: 58, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:29:40 - [DEBUG PRODUCTO][Prod0_ID58] Datos recibidos: {"id":58,"codigo":"17612727071462","cantidad":1,"precio":15000,"subtotal":12605,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":83,"codigo":"17612727071462","tipo_codigo":"manual","cantidad":"10.00","fecha_vencimiento":null}]} 2025-10-23 23:29:40 - [LOTE AUTO-DETECTADO][Prod0_ID58] Código escaneado 17612727071462 pertenece al LOTE1 (ID: 83) 2025-10-23 23:29:40 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID58] Params: cantidad=1, peso=, lote_id=83 2025-10-23 23:29:40 - [Stock Process][Prod0_ID58] Procesando stock con cantidad: 1 2025-10-23 23:29:40 - [Stock manual][Prod0_ID58] Aplicando lógica basada en cantidad. 2025-10-23 23:29:40 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID58] Params: {"pid":"58","codigo":"17612727071462"} 2025-10-23 23:29:40 - [Stock Manual][Prod0_ID58] Producto manual - código de barras específico: 83, numero_lote: LOTE1 2025-10-23 23:29:40 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID58_Esc] Params: {"cant":"1","id":83} 2025-10-23 23:29:40 - [Stock manual][Prod0_ID58] Actualizado código escaneado ID: 83. Descontado: 1 2025-10-23 23:29:40 - [Stock Strategy NORMAL][Prod0_ID58] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-23 23:29:40 - [Stock Update NORMAL][Prod0_ID58] codigos_barras ya actualizado en sección anterior 2025-10-23 23:29:40 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 58, Cantidad: 1, Venta ID: 31 2025-10-23 23:29:40 - [Movimiento Stock] Registrando movimiento para Producto ID: 58, Cantidad: 1 2025-10-23 23:29:40 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 58 2025-10-23 23:29:40 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:29:40 - [Stock Strategy NORMAL][Prod0_ID58] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:29:40 - [DTE Detalle][Prod0_ID58] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:29:40 - --- Fin procesamiento para Prod0_ID58 --- 2025-10-23 23:29:40 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:29:40 - No se intentó la emisión DTE para Venta ID: 31 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:29:40 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 31 2025-10-23 23:29:40 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:29:40 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:29:40 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:29:40 - Transacción completada con éxito para Venta ID: 31 2025-10-23 23:29:40 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:29:40 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:29:52 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:29:52 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:29:52 - Datos recibidos: {"productos":[{"id":60,"codigo":"17612728564199","cantidad":2,"precio":12000,"subtotal":24000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":85,"codigo":"17612728564199","tipo_codigo":"manual","cantidad":"20.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":20168,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"11"} 2025-10-23 23:29:52 - Content-Type: application/json 2025-10-23 23:29:52 - Resultado de json_decode: OK 2025-10-23 23:29:52 - ID sesión de caja recibido en JSON: 11 2025-10-23 23:29:52 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:29:52 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.612.457-1"] 2025-10-23 23:29:52 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:29:52 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.612.457-1"] 2025-10-23 23:29:52 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:29:52 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:29:52 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=11) 2025-10-23 23:29:52 - Venta insertada con ID: 32 2025-10-23 23:29:52 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:29:52 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 32) 2025-10-23 23:29:52 - Token de vista generado: 292b69275d55243dd8b4b9aea340be59 2025-10-23 23:29:52 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:29:52 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:29:52 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:29:52 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:29:52 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:29:52 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:29:52 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:29:52 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:29:52 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:29:52 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:29:52 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:29:52 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:29:52 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:29:52 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:29:52 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:29:52 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:29:52 - --- Iniciando procesamiento para Prod0_ID60 --- 2025-10-23 23:29:52 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID60] Params: {"pid":60} 2025-10-23 23:29:52 - [Stock Check] Producto ID: 60, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:29:52 - [DEBUG PRODUCTO][Prod0_ID60] Datos recibidos: {"id":60,"codigo":"17612728564199","cantidad":2,"precio":12000,"subtotal":24000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":85,"codigo":"17612728564199","tipo_codigo":"manual","cantidad":"20.00","fecha_vencimiento":null}]} 2025-10-23 23:29:52 - [LOTE AUTO-DETECTADO][Prod0_ID60] Código escaneado 17612728564199 pertenece al LOTE1 (ID: 85) 2025-10-23 23:29:52 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID60] Params: cantidad=2, peso=, lote_id=85 2025-10-23 23:29:52 - [Stock Process][Prod0_ID60] Procesando stock con cantidad: 2 2025-10-23 23:29:52 - [Stock manual][Prod0_ID60] Aplicando lógica basada en cantidad. 2025-10-23 23:29:52 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID60] Params: {"pid":"60","codigo":"17612728564199"} 2025-10-23 23:29:52 - [Stock Manual][Prod0_ID60] Producto manual - código de barras específico: 85, numero_lote: LOTE1 2025-10-23 23:29:52 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID60_Esc] Params: {"cant":"2","id":85} 2025-10-23 23:29:52 - [Stock manual][Prod0_ID60] Actualizado código escaneado ID: 85. Descontado: 2 2025-10-23 23:29:52 - [Stock Strategy NORMAL][Prod0_ID60] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 2 2025-10-23 23:29:52 - [Stock Update NORMAL][Prod0_ID60] codigos_barras ya actualizado en sección anterior 2025-10-23 23:29:52 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 60, Cantidad: 2, Venta ID: 32 2025-10-23 23:29:52 - [Movimiento Stock] Registrando movimiento para Producto ID: 60, Cantidad: 2 2025-10-23 23:29:52 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 60 2025-10-23 23:29:52 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:29:52 - [Stock Strategy NORMAL][Prod0_ID60] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:29:52 - [DTE Detalle][Prod0_ID60] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:29:52 - --- Fin procesamiento para Prod0_ID60 --- 2025-10-23 23:29:52 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:29:52 - No se intentó la emisión DTE para Venta ID: 32 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:29:52 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 32 2025-10-23 23:29:52 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:29:52 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:29:52 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:29:52 - Transacción completada con éxito para Venta ID: 32 2025-10-23 23:29:52 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:29:52 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:30:03 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:30:03 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:30:03 - Datos recibidos: {"productos":[{"id":59,"codigo":"17612727794675","cantidad":1,"precio":33000,"subtotal":27731,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":84,"codigo":"17612727794675","tipo_codigo":"masivo","cantidad":"40.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":27731,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"11"} 2025-10-23 23:30:03 - Content-Type: application/json 2025-10-23 23:30:03 - Resultado de json_decode: OK 2025-10-23 23:30:03 - ID sesión de caja recibido en JSON: 11 2025-10-23 23:30:03 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:30:03 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.612.457-1"] 2025-10-23 23:30:03 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:30:03 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.612.457-1"] 2025-10-23 23:30:03 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:30:03 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:30:03 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=11) 2025-10-23 23:30:03 - Venta insertada con ID: 33 2025-10-23 23:30:03 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:30:03 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 33) 2025-10-23 23:30:03 - Token de vista generado: dae27cbec9a0c9adf3f3475bca6369c2 2025-10-23 23:30:03 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:30:03 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:30:03 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:30:03 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:30:03 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:30:03 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:30:03 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:30:03 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:30:03 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:30:03 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:30:03 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:30:03 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:30:03 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:30:03 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:30:03 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:30:03 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:30:03 - --- Iniciando procesamiento para Prod0_ID59 --- 2025-10-23 23:30:03 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID59] Params: {"pid":59} 2025-10-23 23:30:03 - [Stock Check] Producto ID: 59, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:30:03 - [DEBUG PRODUCTO][Prod0_ID59] Datos recibidos: {"id":59,"codigo":"17612727794675","cantidad":1,"precio":33000,"subtotal":27731,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":84,"codigo":"17612727794675","tipo_codigo":"masivo","cantidad":"40.00","fecha_vencimiento":null}]} 2025-10-23 23:30:03 - [LOTE MASIVO][Prod0_ID59] No actualizando codigos_barras aquí - se manejará por triggers 2025-10-23 23:30:03 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID59] Params: cantidad=1, peso=, lote_id=84 2025-10-23 23:30:03 - [Stock Process][Prod0_ID59] Procesando stock con cantidad: 1 2025-10-23 23:30:03 - [Stock Masivo][Prod0_ID59] Aplicando lógica de UPDATE. 2025-10-23 23:30:03 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID59] Params: {"pid":"59"} 2025-10-23 23:30:03 - [Stock Masivo][Prod0_ID59] Producto masivo - código de barras principal: 84, numero_lote: 2025-10-23 23:30:03 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID59] Params: {"cant":"1","id":84} 2025-10-23 23:30:03 - [Stock Masivo][Prod0_ID59] Stock actualizado para ID: 84. Descontado: 1. 2025-10-23 23:30:03 - [Stock Strategy NORMAL][Prod0_ID59] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-23 23:30:03 - [Stock Update NORMAL][Prod0_ID59] codigos_barras ya actualizado en sección anterior 2025-10-23 23:30:03 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 59, Cantidad: 1, Venta ID: 33 2025-10-23 23:30:03 - [Movimiento Stock] Registrando movimiento para Producto ID: 59, Cantidad: 1 2025-10-23 23:30:03 - [MOVIMIENTO MASIVO] Stock actual: 39.00, Cantidad vendida: 1 2025-10-23 23:30:03 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 59 2025-10-23 23:30:03 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:30:03 - [Stock Strategy NORMAL][Prod0_ID59] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:30:03 - [DTE Detalle][Prod0_ID59] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:30:03 - --- Fin procesamiento para Prod0_ID59 --- 2025-10-23 23:30:03 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:30:03 - No se intentó la emisión DTE para Venta ID: 33 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:30:03 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 33 2025-10-23 23:30:03 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:30:03 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:30:03 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:30:03 - Transacción completada con éxito para Venta ID: 33 2025-10-23 23:30:03 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:30:03 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:30:20 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:30:20 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:30:20 - Datos recibidos: {"productos":[{"id":59,"codigo":"17612727794675","cantidad":1,"precio":33000,"subtotal":27731,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":84,"codigo":"17612727794675","tipo_codigo":"masivo","cantidad":"39.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":27731,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"11"} 2025-10-23 23:30:20 - Content-Type: application/json 2025-10-23 23:30:20 - Resultado de json_decode: OK 2025-10-23 23:30:20 - ID sesión de caja recibido en JSON: 11 2025-10-23 23:30:20 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:30:20 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.612.457-1"] 2025-10-23 23:30:20 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:30:20 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.612.457-1"] 2025-10-23 23:30:20 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:30:20 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:30:20 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=11) 2025-10-23 23:30:20 - Venta insertada con ID: 34 2025-10-23 23:30:20 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:30:20 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 34) 2025-10-23 23:30:20 - Token de vista generado: b2b9cbbf275ae0a22af0d9591f04ded3 2025-10-23 23:30:20 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:30:20 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:30:20 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:30:20 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:30:20 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:30:20 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:30:20 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:30:20 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:30:20 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:30:20 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:30:20 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:30:20 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:30:20 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:30:20 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:30:20 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:30:20 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:30:20 - --- Iniciando procesamiento para Prod0_ID59 --- 2025-10-23 23:30:20 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID59] Params: {"pid":59} 2025-10-23 23:30:20 - [Stock Check] Producto ID: 59, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:30:20 - [DEBUG PRODUCTO][Prod0_ID59] Datos recibidos: {"id":59,"codigo":"17612727794675","cantidad":1,"precio":33000,"subtotal":27731,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":84,"codigo":"17612727794675","tipo_codigo":"masivo","cantidad":"39.00","fecha_vencimiento":null}]} 2025-10-23 23:30:20 - [LOTE MASIVO][Prod0_ID59] No actualizando codigos_barras aquí - se manejará por triggers 2025-10-23 23:30:20 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID59] Params: cantidad=1, peso=, lote_id=84 2025-10-23 23:30:20 - [Stock Process][Prod0_ID59] Procesando stock con cantidad: 1 2025-10-23 23:30:20 - [Stock Masivo][Prod0_ID59] Aplicando lógica de UPDATE. 2025-10-23 23:30:20 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID59] Params: {"pid":"59"} 2025-10-23 23:30:20 - [Stock Masivo][Prod0_ID59] Producto masivo - código de barras principal: 84, numero_lote: 2025-10-23 23:30:20 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID59] Params: {"cant":"1","id":84} 2025-10-23 23:30:20 - [Stock Masivo][Prod0_ID59] Stock actualizado para ID: 84. Descontado: 1. 2025-10-23 23:30:20 - [Stock Strategy NORMAL][Prod0_ID59] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-23 23:30:20 - [Stock Update NORMAL][Prod0_ID59] codigos_barras ya actualizado en sección anterior 2025-10-23 23:30:20 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 59, Cantidad: 1, Venta ID: 34 2025-10-23 23:30:20 - [Movimiento Stock] Registrando movimiento para Producto ID: 59, Cantidad: 1 2025-10-23 23:30:20 - [MOVIMIENTO MASIVO] Stock actual: 38.00, Cantidad vendida: 1 2025-10-23 23:30:20 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 59 2025-10-23 23:30:20 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:30:20 - [Stock Strategy NORMAL][Prod0_ID59] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:30:20 - [DTE Detalle][Prod0_ID59] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:30:20 - --- Fin procesamiento para Prod0_ID59 --- 2025-10-23 23:30:20 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:30:20 - No se intentó la emisión DTE para Venta ID: 34 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:30:20 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 34 2025-10-23 23:30:20 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:30:20 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:30:20 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:30:20 - Transacción completada con éxito para Venta ID: 34 2025-10-23 23:30:20 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:30:20 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:39:53 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:39:53 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:39:53 - Datos recibidos: {"productos":[{"id":51,"codigo":"17612461268521","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":74,"codigo":"17612461268521","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-23 23:39:53 - Content-Type: application/json 2025-10-23 23:39:53 - Resultado de json_decode: OK 2025-10-23 23:39:53 - ID sesión de caja recibido en JSON: 10 2025-10-23 23:39:53 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:39:53 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-23 23:39:53 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:39:53 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-23 23:39:53 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:39:53 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:39:53 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-23 23:39:53 - Venta insertada con ID: 35 2025-10-23 23:39:53 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:39:53 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 35) 2025-10-23 23:39:53 - Token de vista generado: a4466deaea841d516008a304fded5976 2025-10-23 23:39:53 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:39:53 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:39:53 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:39:53 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:39:53 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:39:53 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:39:53 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:39:53 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:39:53 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:39:53 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:39:53 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:39:53 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:39:53 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:39:53 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:39:53 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:39:53 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:39:53 - --- Iniciando procesamiento para Prod0_ID51 --- 2025-10-23 23:39:53 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID51] Params: {"pid":51} 2025-10-23 23:39:53 - [Stock Check] Producto ID: 51, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:39:53 - [DEBUG PRODUCTO][Prod0_ID51] Datos recibidos: {"id":51,"codigo":"17612461268521","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":74,"codigo":"17612461268521","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-10-23 23:39:53 - [LOTE AUTO-DETECTADO][Prod0_ID51] Código escaneado 17612461268521 pertenece al LOTE1 (ID: 74) 2025-10-23 23:39:53 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID51] Params: cantidad=1, peso=, lote_id=74 2025-10-23 23:39:53 - [Stock Process][Prod0_ID51] Procesando stock con cantidad: 1 2025-10-23 23:39:53 - [Stock manual][Prod0_ID51] Aplicando lógica basada en cantidad. 2025-10-23 23:39:53 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID51] Params: {"pid":"51","codigo":"17612461268521"} 2025-10-23 23:39:53 - [Stock Manual][Prod0_ID51] Producto manual - código de barras específico: 74, numero_lote: LOTE1 2025-10-23 23:39:53 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID51_Esc] Params: {"cant":"1","id":74} 2025-10-23 23:39:53 - [Stock manual][Prod0_ID51] Actualizado código escaneado ID: 74. Descontado: 1 2025-10-23 23:39:53 - [Stock Strategy NORMAL][Prod0_ID51] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-23 23:39:53 - [Stock Update NORMAL][Prod0_ID51] codigos_barras ya actualizado en sección anterior 2025-10-23 23:39:53 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 51, Cantidad: 1, Venta ID: 35 2025-10-23 23:39:53 - [Movimiento Stock] Registrando movimiento para Producto ID: 51, Cantidad: 1 2025-10-23 23:39:53 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 51 2025-10-23 23:39:53 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:39:53 - [Stock Strategy NORMAL][Prod0_ID51] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:39:53 - [DTE Detalle][Prod0_ID51] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:39:53 - --- Fin procesamiento para Prod0_ID51 --- 2025-10-23 23:39:53 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:39:53 - No se intentó la emisión DTE para Venta ID: 35 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:39:53 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 35 2025-10-23 23:39:53 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:39:53 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:39:53 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:39:53 - Transacción completada con éxito para Venta ID: 35 2025-10-23 23:39:53 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:39:53 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:40:00 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:40:00 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:40:00 - Datos recibidos: {"productos":[{"id":66,"codigo":"234234","cantidad":1,"precio":2190,"subtotal":1840,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":94,"codigo":"234234","tipo_codigo":"diferente","cantidad":"20.00","fecha_vencimiento":null},{"id":95,"codigo":"23423","tipo_codigo":"diferente","cantidad":"32.00","fecha_vencimiento":null},{"id":96,"codigo":"4234234","tipo_codigo":"diferente","cantidad":"15.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":1840,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-23 23:40:00 - Content-Type: application/json 2025-10-23 23:40:00 - Resultado de json_decode: OK 2025-10-23 23:40:00 - ID sesión de caja recibido en JSON: 10 2025-10-23 23:40:00 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:40:00 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-23 23:40:00 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:40:00 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-23 23:40:00 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:40:00 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:40:00 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-23 23:40:00 - Venta insertada con ID: 36 2025-10-23 23:40:00 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:40:00 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 36) 2025-10-23 23:40:00 - Token de vista generado: b9aba664479ce279131d9cc92288caa8 2025-10-23 23:40:00 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:40:00 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:40:00 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:40:00 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:40:00 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:40:00 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:40:00 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:40:00 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:40:00 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:40:00 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:40:00 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:40:00 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:40:00 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:40:00 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:40:00 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:40:00 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:40:00 - --- Iniciando procesamiento para Prod0_ID66 --- 2025-10-23 23:40:00 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID66] Params: {"pid":66} 2025-10-23 23:40:00 - [Stock Check] Producto ID: 66, Tipo Código: diferente, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:40:00 - [DEBUG PRODUCTO][Prod0_ID66] Datos recibidos: {"id":66,"codigo":"234234","cantidad":1,"precio":2190,"subtotal":1840,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":94,"codigo":"234234","tipo_codigo":"diferente","cantidad":"20.00","fecha_vencimiento":null},{"id":95,"codigo":"23423","tipo_codigo":"diferente","cantidad":"32.00","fecha_vencimiento":null},{"id":96,"codigo":"4234234","tipo_codigo":"diferente","cantidad":"15.00","fecha_vencimiento":null}]} 2025-10-23 23:40:00 - [LOTE AUTO-DETECTADO][Prod0_ID66] Código escaneado 234234 pertenece al LOTE1 (ID: 94) 2025-10-23 23:40:00 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID66] Params: cantidad=1, peso=, lote_id=94 2025-10-23 23:40:00 - [Stock Process][Prod0_ID66] Procesando stock con cantidad: 1 2025-10-23 23:40:00 - [Stock Diferente - Cantidad][Prod0_ID66] Procesando. 2025-10-23 23:40:00 - [DB EXECUTE][ID: FindEscaneado_Prod0_ID66] Params: {"pid":"66","codigo":"234234"} 2025-10-23 23:40:00 - [Stock Diferente][Prod0_ID66] Producto diferente - código de barras específico: 94, numero_lote: LOTE1 2025-10-23 23:40:00 - [Stock Diferente - Cantidad][Prod0_ID66] Código '234234' (ID:94): Necesitadas=1, Disponibles Escaneado=20, A procesar con este=1 2025-10-23 23:40:00 - [DB EXECUTE][ID: UpdateEscaneado_Prod0_ID66] Params: {"cant":"1","id":94} 2025-10-23 23:40:00 - [Stock Diferente - Cantidad][Prod0_ID66] Éxito: Actualizada cantidad para ID 94. Descontado: 1 2025-10-23 23:40:00 - [Stock Diferente - Cantidad][Prod0_ID66] Cantidad restante a procesar: 0 2025-10-23 23:40:00 - [Stock Diferente - Cantidad][Prod0_ID66] Éxito final: Procesadas 1 unidades. 2025-10-23 23:40:00 - [Stock Strategy NORMAL][Prod0_ID66] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-23 23:40:00 - [Stock Update NORMAL][Prod0_ID66] codigos_barras ya actualizado en sección anterior 2025-10-23 23:40:00 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 66, Cantidad: 1, Venta ID: 36 2025-10-23 23:40:00 - [Movimiento Stock] Registrando movimiento para Producto ID: 66, Cantidad: 1 2025-10-23 23:40:00 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 66 2025-10-23 23:40:00 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:40:00 - [Stock Strategy NORMAL][Prod0_ID66] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:40:00 - [DTE Detalle][Prod0_ID66] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:40:00 - --- Fin procesamiento para Prod0_ID66 --- 2025-10-23 23:40:00 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:40:00 - No se intentó la emisión DTE para Venta ID: 36 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:40:00 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 36 2025-10-23 23:40:00 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:40:00 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:40:00 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:40:00 - Transacción completada con éxito para Venta ID: 36 2025-10-23 23:40:00 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:40:00 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:40:12 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:40:12 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:40:12 - Datos recibidos: {"productos":[{"id":65,"codigo":"17612733457569","cantidad":2,"precio":1630,"subtotal":3260,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":92,"codigo":"17612733457569","tipo_codigo":"manual","cantidad":"15.00","fecha_vencimiento":null},{"id":93,"codigo":"17612733489089","tipo_codigo":"manual","cantidad":"12.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2739,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-23 23:40:12 - Content-Type: application/json 2025-10-23 23:40:12 - Resultado de json_decode: OK 2025-10-23 23:40:12 - ID sesión de caja recibido en JSON: 10 2025-10-23 23:40:12 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:40:12 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-23 23:40:12 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:40:12 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-23 23:40:12 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:40:12 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:40:12 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-23 23:40:12 - Venta insertada con ID: 37 2025-10-23 23:40:12 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:40:12 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 37) 2025-10-23 23:40:12 - Token de vista generado: 9b4816b7b788f8f2e8a777cbb070bf26 2025-10-23 23:40:12 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:40:12 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:40:12 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:40:12 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:40:12 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:40:12 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:40:12 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:40:12 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:40:12 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:40:12 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:40:12 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:40:12 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:40:12 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:40:12 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:40:12 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:40:12 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:40:12 - --- Iniciando procesamiento para Prod0_ID65 --- 2025-10-23 23:40:12 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID65] Params: {"pid":65} 2025-10-23 23:40:12 - [Stock Check] Producto ID: 65, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:40:12 - [DEBUG PRODUCTO][Prod0_ID65] Datos recibidos: {"id":65,"codigo":"17612733457569","cantidad":2,"precio":1630,"subtotal":3260,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":92,"codigo":"17612733457569","tipo_codigo":"manual","cantidad":"15.00","fecha_vencimiento":null},{"id":93,"codigo":"17612733489089","tipo_codigo":"manual","cantidad":"12.00","fecha_vencimiento":null}]} 2025-10-23 23:40:12 - [LOTE AUTO-DETECTADO][Prod0_ID65] Código escaneado 17612733457569 pertenece al LOTE1 (ID: 92) 2025-10-23 23:40:12 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID65] Params: cantidad=2, peso=, lote_id=92 2025-10-23 23:40:12 - [Stock Process][Prod0_ID65] Procesando stock con cantidad: 2 2025-10-23 23:40:12 - [Stock manual][Prod0_ID65] Aplicando lógica basada en cantidad. 2025-10-23 23:40:12 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID65] Params: {"pid":"65","codigo":"17612733457569"} 2025-10-23 23:40:12 - [Stock Manual][Prod0_ID65] Producto manual - código de barras específico: 92, numero_lote: LOTE1 2025-10-23 23:40:12 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID65_Esc] Params: {"cant":"2","id":92} 2025-10-23 23:40:12 - [Stock manual][Prod0_ID65] Actualizado código escaneado ID: 92. Descontado: 2 2025-10-23 23:40:12 - [Stock Strategy NORMAL][Prod0_ID65] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 2 2025-10-23 23:40:12 - [Stock Update NORMAL][Prod0_ID65] codigos_barras ya actualizado en sección anterior 2025-10-23 23:40:12 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 65, Cantidad: 2, Venta ID: 37 2025-10-23 23:40:12 - [Movimiento Stock] Registrando movimiento para Producto ID: 65, Cantidad: 2 2025-10-23 23:40:12 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 65 2025-10-23 23:40:12 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:40:12 - [Stock Strategy NORMAL][Prod0_ID65] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:40:12 - [DTE Detalle][Prod0_ID65] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:40:12 - --- Fin procesamiento para Prod0_ID65 --- 2025-10-23 23:40:12 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:40:12 - No se intentó la emisión DTE para Venta ID: 37 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:40:12 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 37 2025-10-23 23:40:12 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:40:12 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:40:12 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:40:12 - Transacción completada con éxito para Venta ID: 37 2025-10-23 23:40:12 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:40:12 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:47:50 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:47:50 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:47:50 - Datos recibidos: {"productos":[{"id":67,"codigo":"17612738372223","cantidad":5,"precio":1000,"subtotal":5000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":97,"codigo":"17612738372223","tipo_codigo":"manual","cantidad":"19.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":4202,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"13"} 2025-10-23 23:47:50 - Content-Type: application/json 2025-10-23 23:47:50 - Resultado de json_decode: OK 2025-10-23 23:47:50 - ID sesión de caja recibido en JSON: 13 2025-10-23 23:47:50 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:47:50 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-23 23:47:50 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:47:50 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-23 23:47:50 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:47:50 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:47:50 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=13) 2025-10-23 23:47:50 - Venta insertada con ID: 38 2025-10-23 23:47:50 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:47:50 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 38) 2025-10-23 23:47:50 - Token de vista generado: 2bc3b18a4d7c8f304dba4efe43bc06db 2025-10-23 23:47:50 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:47:50 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:47:50 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:47:50 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:47:50 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:47:50 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:47:50 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:47:50 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:47:50 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:47:50 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:47:50 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:47:50 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:47:50 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:47:50 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:47:50 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:47:50 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:47:50 - --- Iniciando procesamiento para Prod0_ID67 --- 2025-10-23 23:47:50 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID67] Params: {"pid":67} 2025-10-23 23:47:50 - [Stock Check] Producto ID: 67, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:47:50 - [DEBUG PRODUCTO][Prod0_ID67] Datos recibidos: {"id":67,"codigo":"17612738372223","cantidad":5,"precio":1000,"subtotal":5000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":97,"codigo":"17612738372223","tipo_codigo":"manual","cantidad":"19.00","fecha_vencimiento":null}]} 2025-10-23 23:47:50 - [LOTE AUTO-DETECTADO][Prod0_ID67] Código escaneado 17612738372223 pertenece al LOTE1 (ID: 97) 2025-10-23 23:47:50 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID67] Params: cantidad=5, peso=, lote_id=97 2025-10-23 23:47:50 - [Stock Process][Prod0_ID67] Procesando stock con cantidad: 5 2025-10-23 23:47:50 - [Stock manual][Prod0_ID67] Aplicando lógica basada en cantidad. 2025-10-23 23:47:50 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID67] Params: {"pid":"67","codigo":"17612738372223"} 2025-10-23 23:47:50 - [Stock Manual][Prod0_ID67] Producto manual - código de barras específico: 97, numero_lote: LOTE1 2025-10-23 23:47:50 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID67_Esc] Params: {"cant":"5","id":97} 2025-10-23 23:47:50 - [Stock manual][Prod0_ID67] Actualizado código escaneado ID: 97. Descontado: 5 2025-10-23 23:47:50 - [Stock Strategy NORMAL][Prod0_ID67] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-23 23:47:50 - [Stock Update NORMAL][Prod0_ID67] codigos_barras ya actualizado en sección anterior 2025-10-23 23:47:50 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 67, Cantidad: 5, Venta ID: 38 2025-10-23 23:47:50 - [Movimiento Stock] Registrando movimiento para Producto ID: 67, Cantidad: 5 2025-10-23 23:47:50 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 67 2025-10-23 23:47:50 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:47:50 - [Stock Strategy NORMAL][Prod0_ID67] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:47:50 - [DTE Detalle][Prod0_ID67] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:47:50 - --- Fin procesamiento para Prod0_ID67 --- 2025-10-23 23:47:50 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:47:50 - No se intentó la emisión DTE para Venta ID: 38 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:47:50 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 38 2025-10-23 23:47:50 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:47:50 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:47:50 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:47:50 - Transacción completada con éxito para Venta ID: 38 2025-10-23 23:47:50 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:47:50 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:48:04 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:48:04 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:48:04 - Datos recibidos: {"productos":[{"id":68,"codigo":"17612739162759","cantidad":1,"precio":3990,"subtotal":3353,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":98,"codigo":"17612739162759","tipo_codigo":"masivo","cantidad":"20.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":3353,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"13"} 2025-10-23 23:48:04 - Content-Type: application/json 2025-10-23 23:48:04 - Resultado de json_decode: OK 2025-10-23 23:48:04 - ID sesión de caja recibido en JSON: 13 2025-10-23 23:48:04 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:48:04 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-23 23:48:04 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:48:04 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-23 23:48:04 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:48:04 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:48:04 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=13) 2025-10-23 23:48:04 - Venta insertada con ID: 39 2025-10-23 23:48:04 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:48:04 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 39) 2025-10-23 23:48:04 - Token de vista generado: 6576edbcc678d7e3c8c1bbabc3af7a0a 2025-10-23 23:48:04 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:48:04 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:48:04 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:48:04 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:48:04 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:48:04 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:48:04 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:48:04 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:48:04 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:48:04 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:48:04 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:48:04 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:48:04 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:48:04 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:48:04 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:48:04 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:48:04 - --- Iniciando procesamiento para Prod0_ID68 --- 2025-10-23 23:48:04 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID68] Params: {"pid":68} 2025-10-23 23:48:04 - [Stock Check] Producto ID: 68, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:48:04 - [DEBUG PRODUCTO][Prod0_ID68] Datos recibidos: {"id":68,"codigo":"17612739162759","cantidad":1,"precio":3990,"subtotal":3353,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":98,"codigo":"17612739162759","tipo_codigo":"masivo","cantidad":"20.00","fecha_vencimiento":null}]} 2025-10-23 23:48:04 - [LOTE MASIVO][Prod0_ID68] No actualizando codigos_barras aquí - se manejará por triggers 2025-10-23 23:48:04 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID68] Params: cantidad=1, peso=, lote_id=98 2025-10-23 23:48:04 - [Stock Process][Prod0_ID68] Procesando stock con cantidad: 1 2025-10-23 23:48:04 - [Stock Masivo][Prod0_ID68] Aplicando lógica de UPDATE. 2025-10-23 23:48:04 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID68] Params: {"pid":"68"} 2025-10-23 23:48:04 - [Stock Masivo][Prod0_ID68] Producto masivo - código de barras principal: 98, numero_lote: 2025-10-23 23:48:04 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID68] Params: {"cant":"1","id":98} 2025-10-23 23:48:04 - [Stock Masivo][Prod0_ID68] Stock actualizado para ID: 98. Descontado: 1. 2025-10-23 23:48:04 - [Stock Strategy NORMAL][Prod0_ID68] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-23 23:48:04 - [Stock Update NORMAL][Prod0_ID68] codigos_barras ya actualizado en sección anterior 2025-10-23 23:48:04 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 68, Cantidad: 1, Venta ID: 39 2025-10-23 23:48:04 - [Movimiento Stock] Registrando movimiento para Producto ID: 68, Cantidad: 1 2025-10-23 23:48:04 - [MOVIMIENTO MASIVO] Stock actual: 19.00, Cantidad vendida: 1 2025-10-23 23:48:04 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 68 2025-10-23 23:48:04 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:48:04 - [Stock Strategy NORMAL][Prod0_ID68] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:48:04 - [DTE Detalle][Prod0_ID68] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:48:04 - --- Fin procesamiento para Prod0_ID68 --- 2025-10-23 23:48:04 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:48:04 - No se intentó la emisión DTE para Venta ID: 39 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:48:04 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 39 2025-10-23 23:48:04 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:48:04 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:48:04 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:48:04 - Transacción completada con éxito para Venta ID: 39 2025-10-23 23:48:04 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:48:04 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-23 23:48:12 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-23 23:48:12 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-23 23:48:12 - Datos recibidos: {"productos":[{"id":69,"codigo":"17612739947545","cantidad":5,"precio":1780,"subtotal":8900,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":99,"codigo":"17612739947545","tipo_codigo":"manual","cantidad":"20.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":7479,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"13"} 2025-10-23 23:48:12 - Content-Type: application/json 2025-10-23 23:48:12 - Resultado de json_decode: OK 2025-10-23 23:48:12 - ID sesión de caja recibido en JSON: 13 2025-10-23 23:48:12 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-23 23:48:12 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.669.023-2"] 2025-10-23 23:48:12 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-23 23:48:12 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.669.023-2"] 2025-10-23 23:48:12 - Modo API DTE está INACTIVO según configuración. 2025-10-23 23:48:12 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-23 23:48:12 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=13) 2025-10-23 23:48:12 - Venta insertada con ID: 40 2025-10-23 23:48:12 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-23 23:48:12 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 40) 2025-10-23 23:48:12 - Token de vista generado: 04ce92872ce6bf586e032fe20beb500d 2025-10-23 23:48:12 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-23 23:48:12 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-23 23:48:12 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-23 23:48:12 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-23 23:48:12 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:48:12 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-23 23:48:12 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-23 23:48:12 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-23 23:48:12 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:48:12 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:48:12 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:48:12 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:48:12 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-23 23:48:12 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-23 23:48:12 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-23 23:48:12 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-23 23:48:12 - --- Iniciando procesamiento para Prod0_ID69 --- 2025-10-23 23:48:12 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID69] Params: {"pid":69} 2025-10-23 23:48:12 - [Stock Check] Producto ID: 69, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-23 23:48:12 - [DEBUG PRODUCTO][Prod0_ID69] Datos recibidos: {"id":69,"codigo":"17612739947545","cantidad":5,"precio":1780,"subtotal":8900,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":99,"codigo":"17612739947545","tipo_codigo":"manual","cantidad":"20.00","fecha_vencimiento":null}]} 2025-10-23 23:48:12 - [LOTE AUTO-DETECTADO][Prod0_ID69] Código escaneado 17612739947545 pertenece al LOTE1 (ID: 99) 2025-10-23 23:48:12 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID69] Params: cantidad=5, peso=, lote_id=99 2025-10-23 23:48:12 - [Stock Process][Prod0_ID69] Procesando stock con cantidad: 5 2025-10-23 23:48:12 - [Stock manual][Prod0_ID69] Aplicando lógica basada en cantidad. 2025-10-23 23:48:12 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID69] Params: {"pid":"69","codigo":"17612739947545"} 2025-10-23 23:48:12 - [Stock Manual][Prod0_ID69] Producto manual - código de barras específico: 99, numero_lote: LOTE1 2025-10-23 23:48:12 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID69_Esc] Params: {"cant":"5","id":99} 2025-10-23 23:48:12 - [Stock manual][Prod0_ID69] Actualizado código escaneado ID: 99. Descontado: 5 2025-10-23 23:48:12 - [Stock Strategy NORMAL][Prod0_ID69] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 5 2025-10-23 23:48:12 - [Stock Update NORMAL][Prod0_ID69] codigos_barras ya actualizado en sección anterior 2025-10-23 23:48:12 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 69, Cantidad: 5, Venta ID: 40 2025-10-23 23:48:12 - [Movimiento Stock] Registrando movimiento para Producto ID: 69, Cantidad: 5 2025-10-23 23:48:12 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 69 2025-10-23 23:48:12 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-23 23:48:12 - [Stock Strategy NORMAL][Prod0_ID69] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-23 23:48:12 - [DTE Detalle][Prod0_ID69] Agregado a venta_detalles_para_api con formato original 2025-10-23 23:48:12 - --- Fin procesamiento para Prod0_ID69 --- 2025-10-23 23:48:12 - Detalles de venta insertados y stock actualizado. 2025-10-23 23:48:12 - No se intentó la emisión DTE para Venta ID: 40 (Modo API inactivo o condiciones no cumplidas). 2025-10-23 23:48:12 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 40 2025-10-23 23:48:12 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-23 23:48:12 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-23 23:48:12 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-23 23:48:12 - Transacción completada con éxito para Venta ID: 40 2025-10-23 23:48:12 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-23 23:48:12 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-27 22:38:50 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-27 22:38:50 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-27 22:38:50 - Datos recibidos: {"productos":[{"id":62,"codigo":"BER-062","cantidad":4,"precio":"2500.00","subtotal":10000,"es_busqueda_por_codigo":false}],"metodo_pago":"2","total":8403,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-27 22:38:50 - Content-Type: application/json 2025-10-27 22:38:50 - Resultado de json_decode: OK 2025-10-27 22:38:50 - ID sesión de caja recibido en JSON: 10 2025-10-27 22:38:50 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-27 22:38:50 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-27 22:38:50 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-27 22:38:50 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-27 22:38:50 - Modo API DTE está INACTIVO según configuración. 2025-10-27 22:38:50 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-27 22:38:50 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-27 22:38:50 - Venta insertada con ID: 52 2025-10-27 22:38:50 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-27 22:38:50 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 52) 2025-10-27 22:38:50 - Token de vista generado: 38c6970e41ddcf670a314eeb8d72704a 2025-10-27 22:38:50 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-27 22:38:50 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-27 22:38:50 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-27 22:38:50 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-27 22:38:50 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-27 22:38:50 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-27 22:38:50 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-27 22:38:50 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-27 22:38:50 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-27 22:38:50 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-27 22:38:50 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-27 22:38:50 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-27 22:38:50 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-27 22:38:50 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-27 22:38:50 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-27 22:38:50 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-27 22:38:50 - --- Iniciando procesamiento para Prod0_ID62 --- 2025-10-27 22:38:50 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID62] Params: {"pid":62} 2025-10-27 22:38:50 - [Stock Check] Producto ID: 62, Tipo Código: especial, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-27 22:38:50 - [DEBUG PRODUCTO][Prod0_ID62] Datos recibidos: {"id":62,"codigo":"BER-062","cantidad":4,"precio":"2500.00","subtotal":10000,"es_busqueda_por_codigo":false} 2025-10-27 22:38:50 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID62] Lote ID: 58, Cantidad reducida: 4 2025-10-27 22:38:50 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID62] Params: cantidad=4, peso=, lote_id=58 2025-10-27 22:38:50 - [Stock Process][Prod0_ID62] Procesando stock con cantidad: 4 2025-10-27 22:38:50 - [Stock ESPECIAL][Prod0_ID62] Procesando producto especial con códigos de barras 2025-10-27 22:38:50 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID62] Params: {"pid":"62","codigo":"BER-062"} 2025-10-27 22:38:50 - [Stock Especial][Prod0_ID62] Producto especial - solo código de barras genérico: 89 2025-10-27 22:38:50 - [Stock Especial][Prod0_ID62] Actualizado código escaneado ID: 89. Descontado: 4 2025-10-27 22:38:50 - [Stock Strategy ESPECIAL][Prod0_ID62] Producto especial por UNIDAD - sincronización manual de 4 tablas. Cantidad a restar: 4 2025-10-27 22:38:50 - [Stock Update ESPECIAL][Prod0_ID62] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-27 22:38:50 - [Stock Update ESPECIAL][Prod0_ID62] Stock anterior: 50, cantidad a restar: 4, stock nuevo: 46 2025-10-27 22:38:50 - [Stock Update MASIVO][Prod0_ID62] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-27 22:38:50 - [Stock Update MASIVO][Prod0_ID62] Código genérico capturado: ID 89 2025-10-27 22:38:50 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 62, Cantidad: 4, Venta ID: 52 2025-10-27 22:38:50 - [Movimiento Stock] Registrando movimiento para Producto ID: 62, Cantidad: 4 2025-10-27 22:38:50 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 62 2025-10-27 22:38:50 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-27 22:38:50 - [DTE Detalle][Prod0_ID62] Agregado a venta_detalles_para_api con formato original 2025-10-27 22:38:50 - --- Fin procesamiento para Prod0_ID62 --- 2025-10-27 22:38:50 - Detalles de venta insertados y stock actualizado. 2025-10-27 22:38:50 - No se intentó la emisión DTE para Venta ID: 52 (Modo API inactivo o condiciones no cumplidas). 2025-10-27 22:38:50 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 52 2025-10-27 22:38:50 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-27 22:38:50 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-27 22:38:50 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-27 22:38:50 - Transacción completada con éxito para Venta ID: 52 2025-10-27 22:38:50 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-27 22:38:50 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-27 22:39:18 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-27 22:39:18 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-27 22:39:18 - Datos recibidos: {"productos":[{"id":51,"codigo":"17612461268521","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":74,"codigo":"17612461268521","tipo_codigo":"manual","cantidad":"99.00","fecha_vencimiento":null}]},{"id":66,"codigo":"234234","cantidad":1,"precio":2190,"subtotal":1840,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":94,"codigo":"234234","tipo_codigo":"diferente","cantidad":"19.00","fecha_vencimiento":null},{"id":95,"codigo":"23423","tipo_codigo":"diferente","cantidad":"32.00","fecha_vencimiento":null},{"id":96,"codigo":"4234234","tipo_codigo":"diferente","cantidad":"15.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":3840,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-27 22:39:18 - Content-Type: application/json 2025-10-27 22:39:18 - Resultado de json_decode: OK 2025-10-27 22:39:18 - ID sesión de caja recibido en JSON: 10 2025-10-27 22:39:18 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-27 22:39:18 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-27 22:39:18 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-27 22:39:18 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-27 22:39:18 - Modo API DTE está INACTIVO según configuración. 2025-10-27 22:39:18 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-27 22:39:18 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-27 22:39:18 - Venta insertada con ID: 53 2025-10-27 22:39:18 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-27 22:39:18 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 53) 2025-10-27 22:39:18 - Token de vista generado: 10a00926434ff809a07ccefafcecf8c1 2025-10-27 22:39:18 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-27 22:39:18 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-27 22:39:18 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-27 22:39:18 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-27 22:39:18 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-27 22:39:18 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-27 22:39:18 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-27 22:39:18 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-27 22:39:18 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-27 22:39:18 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-27 22:39:18 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-27 22:39:18 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-27 22:39:18 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-27 22:39:18 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-27 22:39:18 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-27 22:39:18 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-27 22:39:18 - --- Iniciando procesamiento para Prod0_ID51 --- 2025-10-27 22:39:18 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID51] Params: {"pid":51} 2025-10-27 22:39:18 - [Stock Check] Producto ID: 51, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-27 22:39:18 - [DEBUG PRODUCTO][Prod0_ID51] Datos recibidos: {"id":51,"codigo":"17612461268521","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":74,"codigo":"17612461268521","tipo_codigo":"manual","cantidad":"99.00","fecha_vencimiento":null}]} 2025-10-27 22:39:18 - [LOTE AUTO-DETECTADO][Prod0_ID51] Código escaneado 17612461268521 pertenece al LOTE1 (ID: 74) 2025-10-27 22:39:18 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID51] Params: cantidad=1, peso=, lote_id=74 2025-10-27 22:39:18 - [Stock Process][Prod0_ID51] Procesando stock con cantidad: 1 2025-10-27 22:39:18 - [Stock manual][Prod0_ID51] Aplicando lógica basada en cantidad. 2025-10-27 22:39:18 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID51] Params: {"pid":"51","codigo":"17612461268521"} 2025-10-27 22:39:18 - [Stock Manual][Prod0_ID51] Producto manual - código de barras específico: 74, numero_lote: LOTE1 2025-10-27 22:39:18 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID51_Esc] Params: {"cant":"1","id":74} 2025-10-27 22:39:18 - [Stock manual][Prod0_ID51] Actualizado código escaneado ID: 74. Descontado: 1 2025-10-27 22:39:18 - [Stock Strategy NORMAL][Prod0_ID51] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-27 22:39:18 - [Stock Update NORMAL][Prod0_ID51] codigos_barras ya actualizado en sección anterior 2025-10-27 22:39:18 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 51, Cantidad: 1, Venta ID: 53 2025-10-27 22:39:18 - [Movimiento Stock] Registrando movimiento para Producto ID: 51, Cantidad: 1 2025-10-27 22:39:18 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 51 2025-10-27 22:39:18 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-27 22:39:18 - [Stock Strategy NORMAL][Prod0_ID51] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-27 22:39:18 - [DTE Detalle][Prod0_ID51] Agregado a venta_detalles_para_api con formato original 2025-10-27 22:39:18 - --- Fin procesamiento para Prod0_ID51 --- 2025-10-27 22:39:18 - --- Iniciando procesamiento para Prod1_ID66 --- 2025-10-27 22:39:18 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID66] Params: {"pid":66} 2025-10-27 22:39:18 - [Stock Check] Producto ID: 66, Tipo Código: diferente, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-27 22:39:18 - [DEBUG PRODUCTO][Prod1_ID66] Datos recibidos: {"id":66,"codigo":"234234","cantidad":1,"precio":2190,"subtotal":1840,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":94,"codigo":"234234","tipo_codigo":"diferente","cantidad":"19.00","fecha_vencimiento":null},{"id":95,"codigo":"23423","tipo_codigo":"diferente","cantidad":"32.00","fecha_vencimiento":null},{"id":96,"codigo":"4234234","tipo_codigo":"diferente","cantidad":"15.00","fecha_vencimiento":null}]} 2025-10-27 22:39:18 - [LOTE AUTO-DETECTADO][Prod1_ID66] Código escaneado 234234 pertenece al LOTE1 (ID: 94) 2025-10-27 22:39:18 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID66] Params: cantidad=1, peso=, lote_id=94 2025-10-27 22:39:18 - [Stock Process][Prod1_ID66] Procesando stock con cantidad: 1 2025-10-27 22:39:18 - [Stock Diferente - Cantidad][Prod1_ID66] Procesando. 2025-10-27 22:39:18 - [DB EXECUTE][ID: FindEscaneado_Prod1_ID66] Params: {"pid":"66","codigo":"234234"} 2025-10-27 22:39:18 - [Stock Diferente][Prod1_ID66] Producto diferente - código de barras específico: 94, numero_lote: LOTE1 2025-10-27 22:39:18 - [Stock Diferente - Cantidad][Prod1_ID66] Código '234234' (ID:94): Necesitadas=1, Disponibles Escaneado=19, A procesar con este=1 2025-10-27 22:39:18 - [DB EXECUTE][ID: UpdateEscaneado_Prod1_ID66] Params: {"cant":"1","id":94} 2025-10-27 22:39:18 - [Stock Diferente - Cantidad][Prod1_ID66] Éxito: Actualizada cantidad para ID 94. Descontado: 1 2025-10-27 22:39:18 - [Stock Diferente - Cantidad][Prod1_ID66] Cantidad restante a procesar: 0 2025-10-27 22:39:18 - [Stock Diferente - Cantidad][Prod1_ID66] Éxito final: Procesadas 1 unidades. 2025-10-27 22:39:18 - [Stock Strategy NORMAL][Prod1_ID66] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-10-27 22:39:18 - [Stock Update NORMAL][Prod1_ID66] codigos_barras ya actualizado en sección anterior 2025-10-27 22:39:18 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 66, Cantidad: 1, Venta ID: 53 2025-10-27 22:39:18 - [Movimiento Stock] Registrando movimiento para Producto ID: 66, Cantidad: 1 2025-10-27 22:39:18 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 66 2025-10-27 22:39:18 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-27 22:39:18 - [Stock Strategy NORMAL][Prod1_ID66] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-27 22:39:18 - [DTE Detalle][Prod1_ID66] Agregado a venta_detalles_para_api con formato original 2025-10-27 22:39:18 - --- Fin procesamiento para Prod1_ID66 --- 2025-10-27 22:39:18 - Detalles de venta insertados y stock actualizado. 2025-10-27 22:39:18 - No se intentó la emisión DTE para Venta ID: 53 (Modo API inactivo o condiciones no cumplidas). 2025-10-27 22:39:18 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 53 2025-10-27 22:39:18 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-27 22:39:18 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-27 22:39:18 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-27 22:39:18 - Transacción completada con éxito para Venta ID: 53 2025-10-27 22:39:18 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-27 22:39:18 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-28 09:06:29 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-28 09:06:29 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-28 09:06:29 - Datos recibidos: {"productos":[{"id":66,"codigo":"234234","cantidad":10,"precio":2190,"subtotal":21900,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":94,"codigo":"234234","tipo_codigo":"diferente","cantidad":"18.00","fecha_vencimiento":null},{"id":95,"codigo":"23423","tipo_codigo":"diferente","cantidad":"32.00","fecha_vencimiento":null},{"id":96,"codigo":"4234234","tipo_codigo":"diferente","cantidad":"15.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":18403,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-28 09:06:29 - Content-Type: application/json 2025-10-28 09:06:29 - Resultado de json_decode: OK 2025-10-28 09:06:29 - ID sesión de caja recibido en JSON: 10 2025-10-28 09:06:29 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-28 09:06:29 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-28 09:06:29 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-28 09:06:29 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-28 09:06:29 - Modo API DTE está INACTIVO según configuración. 2025-10-28 09:06:29 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-28 09:06:29 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-28 09:06:29 - Venta insertada con ID: 54 2025-10-28 09:06:29 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-28 09:06:29 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 54) 2025-10-28 09:06:29 - Token de vista generado: 6d342fd0ca314677b514bdc5f6eb76dc 2025-10-28 09:06:29 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-28 09:06:29 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-28 09:06:29 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-28 09:06:29 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-28 09:06:29 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-28 09:06:29 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-28 09:06:29 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-28 09:06:29 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-28 09:06:29 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-28 09:06:29 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-28 09:06:29 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-28 09:06:29 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-28 09:06:29 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-28 09:06:29 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-28 09:06:29 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-28 09:06:29 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-28 09:06:29 - --- Iniciando procesamiento para Prod0_ID66 --- 2025-10-28 09:06:29 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID66] Params: {"pid":66} 2025-10-28 09:06:29 - [Stock Check] Producto ID: 66, Tipo Código: diferente, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-28 09:06:29 - [DEBUG PRODUCTO][Prod0_ID66] Datos recibidos: {"id":66,"codigo":"234234","cantidad":10,"precio":2190,"subtotal":21900,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":94,"codigo":"234234","tipo_codigo":"diferente","cantidad":"18.00","fecha_vencimiento":null},{"id":95,"codigo":"23423","tipo_codigo":"diferente","cantidad":"32.00","fecha_vencimiento":null},{"id":96,"codigo":"4234234","tipo_codigo":"diferente","cantidad":"15.00","fecha_vencimiento":null}]} 2025-10-28 09:06:29 - [LOTE AUTO-DETECTADO][Prod0_ID66] Código escaneado 234234 pertenece al LOTE1 (ID: 94) 2025-10-28 09:06:29 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID66] Params: cantidad=10, peso=, lote_id=94 2025-10-28 09:06:29 - [Stock Process][Prod0_ID66] Procesando stock con cantidad: 10 2025-10-28 09:06:29 - [Stock Diferente - Cantidad][Prod0_ID66] Procesando. 2025-10-28 09:06:29 - [DB EXECUTE][ID: FindEscaneado_Prod0_ID66] Params: {"pid":"66","codigo":"234234"} 2025-10-28 09:06:29 - [Stock Diferente][Prod0_ID66] Producto diferente - código de barras específico: 94, numero_lote: LOTE1 2025-10-28 09:06:29 - [Stock Diferente - Cantidad][Prod0_ID66] Código '234234' (ID:94): Necesitadas=10, Disponibles Escaneado=18, A procesar con este=10 2025-10-28 09:06:29 - [DB EXECUTE][ID: UpdateEscaneado_Prod0_ID66] Params: {"cant":"10","id":94} 2025-10-28 09:06:29 - [Stock Diferente - Cantidad][Prod0_ID66] Éxito: Actualizada cantidad para ID 94. Descontado: 10 2025-10-28 09:06:29 - [Stock Diferente - Cantidad][Prod0_ID66] Cantidad restante a procesar: 0 2025-10-28 09:06:29 - [Stock Diferente - Cantidad][Prod0_ID66] Éxito final: Procesadas 10 unidades. 2025-10-28 09:06:29 - [Stock Strategy NORMAL][Prod0_ID66] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 10 2025-10-28 09:06:29 - [Stock Update NORMAL][Prod0_ID66] codigos_barras ya actualizado en sección anterior 2025-10-28 09:06:29 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 66, Cantidad: 10, Venta ID: 54 2025-10-28 09:06:29 - [Movimiento Stock] Registrando movimiento para Producto ID: 66, Cantidad: 10 2025-10-28 09:06:29 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 66 2025-10-28 09:06:29 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-28 09:06:29 - [Stock Strategy NORMAL][Prod0_ID66] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-28 09:06:29 - [DTE Detalle][Prod0_ID66] Agregado a venta_detalles_para_api con formato original 2025-10-28 09:06:29 - --- Fin procesamiento para Prod0_ID66 --- 2025-10-28 09:06:29 - Detalles de venta insertados y stock actualizado. 2025-10-28 09:06:29 - No se intentó la emisión DTE para Venta ID: 54 (Modo API inactivo o condiciones no cumplidas). 2025-10-28 09:06:29 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 54 2025-10-28 09:06:29 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-28 09:06:29 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-28 09:06:29 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-28 09:06:29 - Transacción completada con éxito para Venta ID: 54 2025-10-28 09:06:29 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-28 09:06:29 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-28 09:42:35 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-28 09:42:35 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-28 09:42:35 - Datos recibidos: {"productos":[{"id":89,"codigo":"PAN-089","cantidad":4,"precio":"2500.00","subtotal":10000,"es_busqueda_por_codigo":false,"peso_real":2}],"metodo_pago":"2","total":8403,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-28 09:42:35 - Content-Type: application/json 2025-10-28 09:42:35 - Resultado de json_decode: OK 2025-10-28 09:42:35 - ID sesión de caja recibido en JSON: 10 2025-10-28 09:42:35 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-28 09:42:35 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-28 09:42:35 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-28 09:42:35 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-28 09:42:35 - Modo API DTE está INACTIVO según configuración. 2025-10-28 09:42:35 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-28 09:42:35 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-28 09:42:35 - Venta insertada con ID: 55 2025-10-28 09:42:35 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-28 09:42:35 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 55) 2025-10-28 09:42:35 - Token de vista generado: 5397dc70532450901bdbc5626c8b5f59 2025-10-28 09:42:35 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-28 09:42:35 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-28 09:42:35 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-28 09:42:35 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-28 09:42:35 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-28 09:42:35 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-28 09:42:35 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-28 09:42:35 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-28 09:42:35 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-28 09:42:35 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-28 09:42:35 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-28 09:42:35 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-28 09:42:35 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-28 09:42:35 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-28 09:42:35 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-28 09:42:35 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-28 09:42:35 - --- Iniciando procesamiento para Prod0_ID89 --- 2025-10-28 09:42:35 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID89] Params: {"pid":89} 2025-10-28 09:42:35 - [Stock Check] Producto ID: 89, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-28 09:42:35 - [Producto Por Peso][Prod0_ID89] Peso real: 2 Kg 2025-10-28 09:42:35 - [DEBUG PRODUCTO][Prod0_ID89] Datos recibidos: {"id":89,"codigo":"PAN-089","cantidad":4,"precio":"2500.00","subtotal":10000,"es_busqueda_por_codigo":false,"peso_real":2} 2025-10-28 09:42:35 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID89] Lote ID: 64, Cantidad reducida: 2 2025-10-28 09:42:35 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID89] Params: cantidad=2, peso=2, lote_id=64 2025-10-28 09:42:35 - [Detalle Actualizado][Prod0_ID89] Nombre especial actualizado a: Producto (2 Kg) 2025-10-28 09:42:35 - [Stock Process][Prod0_ID89] Procesando stock con cantidad: 2 2025-10-28 09:42:35 - [Stock ESPECIAL][Prod0_ID89] Procesando producto especial con códigos de barras 2025-10-28 09:42:35 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID89] Params: {"pid":"89","codigo":"PAN-089"} 2025-10-28 09:42:35 - [Stock Especial][Prod0_ID89] Producto especial - solo código de barras genérico: 103 2025-10-28 09:42:35 - [Stock Especial][Prod0_ID89] Actualizado código escaneado ID: 103. Descontado: 2 2025-10-28 09:42:35 - [Stock Strategy ESPECIAL][Prod0_ID89] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 2 2025-10-28 09:42:35 - [Stock Update ESPECIAL][Prod0_ID89] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-28 09:42:35 - [Stock Update ESPECIAL][Prod0_ID89] Stock anterior: 20, cantidad a restar: 2, stock nuevo: 18 2025-10-28 09:42:35 - [Stock Update MASIVO][Prod0_ID89] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-28 09:42:35 - [Stock Update MASIVO][Prod0_ID89] Código genérico capturado: ID 103 2025-10-28 09:42:35 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 89, Cantidad: 2, Venta ID: 55 2025-10-28 09:42:35 - [Movimiento Stock] Registrando movimiento para Producto ID: 89, Cantidad: 2 2025-10-28 09:42:35 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 89 2025-10-28 09:42:35 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-28 09:42:35 - [DTE Detalle][Prod0_ID89] Agregado a venta_detalles_para_api con formato original 2025-10-28 09:42:35 - --- Fin procesamiento para Prod0_ID89 --- 2025-10-28 09:42:35 - Detalles de venta insertados y stock actualizado. 2025-10-28 09:42:35 - No se intentó la emisión DTE para Venta ID: 55 (Modo API inactivo o condiciones no cumplidas). 2025-10-28 09:42:35 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 55 2025-10-28 09:42:35 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-28 09:42:35 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-28 09:42:35 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-28 09:42:35 - Transacción completada con éxito para Venta ID: 55 2025-10-28 09:42:35 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-28 09:42:35 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-28 09:43:52 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-28 09:43:52 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-28 09:43:52 - Datos recibidos: {"productos":[{"id":89,"codigo":"PAN-089","cantidad":2,"precio":"2500.00","subtotal":5000,"es_busqueda_por_codigo":false,"peso_real":2},{"id":64,"codigo":"PAN-064","cantidad":2,"precio":"2200.00","subtotal":4400,"es_busqueda_por_codigo":false,"peso_real":2}],"metodo_pago":"2","total":7899,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"10"} 2025-10-28 09:43:52 - Content-Type: application/json 2025-10-28 09:43:52 - Resultado de json_decode: OK 2025-10-28 09:43:52 - ID sesión de caja recibido en JSON: 10 2025-10-28 09:43:52 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-28 09:43:52 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-10-28 09:43:52 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-28 09:43:52 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-10-28 09:43:52 - Modo API DTE está INACTIVO según configuración. 2025-10-28 09:43:52 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-28 09:43:52 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=10) 2025-10-28 09:43:52 - Venta insertada con ID: 56 2025-10-28 09:43:52 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-28 09:43:52 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 56) 2025-10-28 09:43:52 - Token de vista generado: 08d9aa9dfe9facfe5bc402affb9df8ed 2025-10-28 09:43:52 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-28 09:43:52 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-28 09:43:52 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-28 09:43:52 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-28 09:43:52 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-28 09:43:52 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-28 09:43:52 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-28 09:43:52 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-28 09:43:52 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-28 09:43:52 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-28 09:43:52 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-28 09:43:52 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-28 09:43:52 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-28 09:43:52 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-28 09:43:52 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-28 09:43:52 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-28 09:43:52 - --- Iniciando procesamiento para Prod0_ID89 --- 2025-10-28 09:43:52 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID89] Params: {"pid":89} 2025-10-28 09:43:52 - [Stock Check] Producto ID: 89, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-28 09:43:52 - [Producto Por Peso][Prod0_ID89] Peso real: 2 Kg 2025-10-28 09:43:52 - [DEBUG PRODUCTO][Prod0_ID89] Datos recibidos: {"id":89,"codigo":"PAN-089","cantidad":2,"precio":"2500.00","subtotal":5000,"es_busqueda_por_codigo":false,"peso_real":2} 2025-10-28 09:43:52 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID89] Lote ID: 64, Cantidad reducida: 2 2025-10-28 09:43:52 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID89] Params: cantidad=2, peso=2, lote_id=64 2025-10-28 09:43:52 - [Detalle Actualizado][Prod0_ID89] Nombre especial actualizado a: Producto (2 Kg) 2025-10-28 09:43:52 - [Stock Process][Prod0_ID89] Procesando stock con cantidad: 2 2025-10-28 09:43:52 - [Stock ESPECIAL][Prod0_ID89] Procesando producto especial con códigos de barras 2025-10-28 09:43:52 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID89] Params: {"pid":"89","codigo":"PAN-089"} 2025-10-28 09:43:52 - [Stock Especial][Prod0_ID89] Producto especial - solo código de barras genérico: 103 2025-10-28 09:43:52 - [Stock Especial][Prod0_ID89] Actualizado código escaneado ID: 103. Descontado: 2 2025-10-28 09:43:52 - [Stock Strategy ESPECIAL][Prod0_ID89] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 2 2025-10-28 09:43:52 - [Stock Update ESPECIAL][Prod0_ID89] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-28 09:43:52 - [Stock Update ESPECIAL][Prod0_ID89] Stock anterior: 18, cantidad a restar: 2, stock nuevo: 16 2025-10-28 09:43:52 - [Stock Update MASIVO][Prod0_ID89] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-28 09:43:52 - [Stock Update MASIVO][Prod0_ID89] Código genérico capturado: ID 103 2025-10-28 09:43:52 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 89, Cantidad: 2, Venta ID: 56 2025-10-28 09:43:52 - [Movimiento Stock] Registrando movimiento para Producto ID: 89, Cantidad: 2 2025-10-28 09:43:52 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 89 2025-10-28 09:43:52 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-28 09:43:52 - [DTE Detalle][Prod0_ID89] Agregado a venta_detalles_para_api con formato original 2025-10-28 09:43:52 - --- Fin procesamiento para Prod0_ID89 --- 2025-10-28 09:43:52 - --- Iniciando procesamiento para Prod1_ID64 --- 2025-10-28 09:43:52 - [DB EXECUTE][ID: TipoProdLoop_Prod1_ID64] Params: {"pid":64} 2025-10-28 09:43:52 - [Stock Check] Producto ID: 64, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-10-28 09:43:52 - [Producto Por Peso][Prod1_ID64] Peso real: 2 kg 2025-10-28 09:43:52 - [DEBUG PRODUCTO][Prod1_ID64] Datos recibidos: {"id":64,"codigo":"PAN-064","cantidad":2,"precio":"2200.00","subtotal":4400,"es_busqueda_por_codigo":false,"peso_real":2} 2025-10-28 09:43:52 - [LOTE ESPECIAL ACTUALIZADO][Prod1_ID64] Lote ID: 60, Cantidad reducida: 2 2025-10-28 09:43:52 - [DB EXECUTE][ID: DetalleInsertLoop_Prod1_ID64] Params: cantidad=2, peso=2, lote_id=60 2025-10-28 09:43:52 - [Detalle Actualizado][Prod1_ID64] Nombre especial actualizado a: Producto (2 kg) 2025-10-28 09:43:52 - [Stock Process][Prod1_ID64] Procesando stock con cantidad: 2 2025-10-28 09:43:52 - [Stock ESPECIAL][Prod1_ID64] Procesando producto especial con códigos de barras 2025-10-28 09:43:52 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod1_ID64] Params: {"pid":"64","codigo":"PAN-064"} 2025-10-28 09:43:52 - [Stock Especial][Prod1_ID64] Producto especial - solo código de barras genérico: 91 2025-10-28 09:43:52 - [Stock Especial][Prod1_ID64] Actualizado código escaneado ID: 91. Descontado: 2 2025-10-28 09:43:52 - [Stock Strategy ESPECIAL][Prod1_ID64] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 2 2025-10-28 09:43:52 - [Stock Update ESPECIAL][Prod1_ID64] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-10-28 09:43:52 - [Stock Update ESPECIAL][Prod1_ID64] Stock anterior: 25, cantidad a restar: 2, stock nuevo: 23 2025-10-28 09:43:52 - [Stock Update MASIVO][Prod1_ID64] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-10-28 09:43:52 - [Stock Update MASIVO][Prod1_ID64] Código genérico capturado: ID 91 2025-10-28 09:43:52 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 64, Cantidad: 2, Venta ID: 56 2025-10-28 09:43:52 - [Movimiento Stock] Registrando movimiento para Producto ID: 64, Cantidad: 2 2025-10-28 09:43:52 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 64 2025-10-28 09:43:52 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-10-28 09:43:52 - [DTE Detalle][Prod1_ID64] Agregado a venta_detalles_para_api con formato original 2025-10-28 09:43:52 - --- Fin procesamiento para Prod1_ID64 --- 2025-10-28 09:43:52 - Detalles de venta insertados y stock actualizado. 2025-10-28 09:43:52 - No se intentó la emisión DTE para Venta ID: 56 (Modo API inactivo o condiciones no cumplidas). 2025-10-28 09:43:52 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 56 2025-10-28 09:43:52 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-28 09:43:52 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-28 09:43:52 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-28 09:43:52 - Transacción completada con éxito para Venta ID: 56 2025-10-28 09:43:52 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-28 09:43:52 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-10-28 14:01:44 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-10-28 14:01:44 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-10-28 14:01:44 - Datos recibidos: {"productos":[{"id":61,"codigo":"453467","cantidad":6,"precio":30000,"subtotal":180000,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":86,"codigo":"453467","tipo_codigo":"diferente","cantidad":"7.00","fecha_vencimiento":null},{"id":87,"codigo":"23645","tipo_codigo":"diferente","cantidad":"10.00","fecha_vencimiento":null},{"id":88,"codigo":"623436","tipo_codigo":"diferente","cantidad":"3.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":151261,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"11"} 2025-10-28 14:01:44 - Content-Type: application/json 2025-10-28 14:01:44 - Resultado de json_decode: OK 2025-10-28 14:01:44 - ID sesión de caja recibido en JSON: 11 2025-10-28 14:01:44 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-10-28 14:01:44 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.612.457-1"] 2025-10-28 14:01:44 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-10-28 14:01:44 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.612.457-1"] 2025-10-28 14:01:44 - Modo API DTE está INACTIVO según configuración. 2025-10-28 14:01:44 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-10-28 14:01:44 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=11) 2025-10-28 14:01:44 - Venta insertada con ID: 57 2025-10-28 14:01:44 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-10-28 14:01:44 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 57) 2025-10-28 14:01:44 - Token de vista generado: 1391b5a1656f97a911050daa1d4aab89 2025-10-28 14:01:44 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-10-28 14:01:44 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-10-28 14:01:44 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-10-28 14:01:44 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-10-28 14:01:44 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-28 14:01:44 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-10-28 14:01:44 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-10-28 14:01:44 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-10-28 14:01:44 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-28 14:01:44 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-28 14:01:44 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-28 14:01:44 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-28 14:01:44 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-10-28 14:01:44 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-10-28 14:01:44 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-10-28 14:01:44 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-10-28 14:01:44 - --- Iniciando procesamiento para Prod0_ID61 --- 2025-10-28 14:01:44 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID61] Params: {"pid":61} 2025-10-28 14:01:44 - [Stock Check] Producto ID: 61, Tipo Código: diferente, Modo Venta: UNIDAD, Controla Stock: SI 2025-10-28 14:01:44 - [DEBUG PRODUCTO][Prod0_ID61] Datos recibidos: {"id":61,"codigo":"453467","cantidad":6,"precio":30000,"subtotal":180000,"es_busqueda_por_codigo":false,"tipo_codigo":"diferente","codigos_disponibles":[{"id":86,"codigo":"453467","tipo_codigo":"diferente","cantidad":"7.00","fecha_vencimiento":null},{"id":87,"codigo":"23645","tipo_codigo":"diferente","cantidad":"10.00","fecha_vencimiento":null},{"id":88,"codigo":"623436","tipo_codigo":"diferente","cantidad":"3.00","fecha_vencimiento":null}]} 2025-10-28 14:01:44 - [LOTE AUTO-DETECTADO][Prod0_ID61] Código escaneado 453467 pertenece al LOTE1 (ID: 86) 2025-10-28 14:01:44 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID61] Params: cantidad=6, peso=, lote_id=86 2025-10-28 14:01:44 - [Stock Process][Prod0_ID61] Procesando stock con cantidad: 6 2025-10-28 14:01:44 - [Stock Diferente - Cantidad][Prod0_ID61] Procesando. 2025-10-28 14:01:44 - [DB EXECUTE][ID: FindEscaneado_Prod0_ID61] Params: {"pid":"61","codigo":"453467"} 2025-10-28 14:01:44 - [Stock Diferente][Prod0_ID61] Producto diferente - código de barras específico: 86, numero_lote: LOTE1 2025-10-28 14:01:44 - [Stock Diferente - Cantidad][Prod0_ID61] Código '453467' (ID:86): Necesitadas=6, Disponibles Escaneado=7, A procesar con este=6 2025-10-28 14:01:44 - [DB EXECUTE][ID: UpdateEscaneado_Prod0_ID61] Params: {"cant":"6","id":86} 2025-10-28 14:01:44 - [Stock Diferente - Cantidad][Prod0_ID61] Éxito: Actualizada cantidad para ID 86. Descontado: 6 2025-10-28 14:01:44 - [Stock Diferente - Cantidad][Prod0_ID61] Cantidad restante a procesar: 0 2025-10-28 14:01:44 - [Stock Diferente - Cantidad][Prod0_ID61] Éxito final: Procesadas 6 unidades. 2025-10-28 14:01:44 - [Stock Strategy NORMAL][Prod0_ID61] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 6 2025-10-28 14:01:44 - [Stock Update NORMAL][Prod0_ID61] codigos_barras ya actualizado en sección anterior 2025-10-28 14:01:44 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 61, Cantidad: 6, Venta ID: 57 2025-10-28 14:01:44 - [Movimiento Stock] Registrando movimiento para Producto ID: 61, Cantidad: 6 2025-10-28 14:01:44 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 61 2025-10-28 14:01:44 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-10-28 14:01:44 - [Stock Strategy NORMAL][Prod0_ID61] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-10-28 14:01:44 - [DTE Detalle][Prod0_ID61] Agregado a venta_detalles_para_api con formato original 2025-10-28 14:01:44 - --- Fin procesamiento para Prod0_ID61 --- 2025-10-28 14:01:44 - Detalles de venta insertados y stock actualizado. 2025-10-28 14:01:44 - No se intentó la emisión DTE para Venta ID: 57 (Modo API inactivo o condiciones no cumplidas). 2025-10-28 14:01:44 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 57 2025-10-28 14:01:44 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-10-28 14:01:44 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-10-28 14:01:44 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-10-28 14:01:44 - Transacción completada con éxito para Venta ID: 57 2025-10-28 14:01:44 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-10-28 14:01:44 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 13:36:19 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 13:36:19 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 13:36:19 - Datos recibidos: {"productos":[{"id":98,"codigo":"7801610022283","cantidad":1,"precio":1800,"subtotal":1513,"es_busqueda_por_codigo":true,"tipo_codigo":"diferente","codigo_barras_id":114}],"metodo_pago":"2","total":1513,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"20"} 2025-11-05 13:36:19 - Content-Type: application/json 2025-11-05 13:36:19 - Resultado de json_decode: OK 2025-11-05 13:36:19 - ID sesión de caja recibido en JSON: 20 2025-11-05 13:36:19 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 13:36:19 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.612.457-1"] 2025-11-05 13:36:19 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 13:36:19 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.612.457-1"] 2025-11-05 13:36:19 - Modo API DTE está INACTIVO según configuración. 2025-11-05 13:36:19 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 13:36:19 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=20) 2025-11-05 13:36:19 - Venta insertada con ID: 58 2025-11-05 13:36:19 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 13:36:19 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 58) 2025-11-05 13:36:19 - Token de vista generado: 9b1e53ea7c980027b89c14ac71410911 2025-11-05 13:36:19 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 13:36:19 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 13:36:19 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 13:36:19 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 13:36:19 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 13:36:19 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 13:36:19 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 13:36:19 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 13:36:19 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 13:36:19 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 13:36:19 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 13:36:19 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 13:36:19 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 13:36:19 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 13:36:19 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 13:36:19 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 13:36:19 - --- Iniciando procesamiento para Prod0_ID98 --- 2025-11-05 13:36:19 - [Frontend][Prod0_ID98] Usando codigo_barras_id del frontend: 114 2025-11-05 13:36:19 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID98] Params: {"pid":98} 2025-11-05 13:36:19 - [Stock Check] Producto ID: 98, Tipo Código: diferente, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 13:36:19 - [DEBUG PRODUCTO][Prod0_ID98] Datos recibidos: {"id":98,"codigo":"7801610022283","cantidad":1,"precio":1800,"subtotal":1513,"es_busqueda_por_codigo":true,"tipo_codigo":"diferente","codigo_barras_id":114} 2025-11-05 13:36:19 - [LOTE AUTO-DETECTADO][Prod0_ID98] Código escaneado 7801610022283 pertenece al LOTE1 (ID: 114) 2025-11-05 13:36:19 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID98] Params: cantidad=1, peso=, lote_id=114 2025-11-05 13:36:19 - [Stock Process][Prod0_ID98] Procesando stock con cantidad: 1 2025-11-05 13:36:19 - [Stock Diferente - Cantidad][Prod0_ID98] Procesando. 2025-11-05 13:36:19 - [DB EXECUTE][ID: FindEscaneado_Prod0_ID98] Params: {"pid":"98","codigo":"7801610022283"} 2025-11-05 13:36:19 - [Stock Diferente][Prod0_ID98] Producto diferente - código de barras específico: 114, numero_lote: LOTE1 2025-11-05 13:36:19 - [Stock Diferente - Cantidad][Prod0_ID98] Código '7801610022283' (ID:114): Necesitadas=1, Disponibles Escaneado=100, A procesar con este=1 2025-11-05 13:36:19 - [DB EXECUTE][ID: UpdateEscaneado_Prod0_ID98] Params: {"cant":"1","id":114} 2025-11-05 13:36:19 - [Stock Diferente - Cantidad][Prod0_ID98] Éxito: Actualizada cantidad para ID 114. Descontado: 1 2025-11-05 13:36:19 - [Stock Diferente - Cantidad][Prod0_ID98] Cantidad restante a procesar: 0 2025-11-05 13:36:19 - [Stock Diferente - Cantidad][Prod0_ID98] Éxito final: Procesadas 1 unidades. 2025-11-05 13:36:19 - [Stock Strategy NORMAL][Prod0_ID98] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 13:36:19 - [Stock Update NORMAL][Prod0_ID98] codigos_barras ya actualizado en sección anterior 2025-11-05 13:36:19 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 98, Cantidad: 1, Venta ID: 58 2025-11-05 13:36:19 - [Movimiento Stock] Registrando movimiento para Producto ID: 98, Cantidad: 1 2025-11-05 13:36:19 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 98 2025-11-05 13:36:19 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 13:36:19 - [Stock Strategy NORMAL][Prod0_ID98] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 13:36:19 - [DTE Detalle][Prod0_ID98] Agregado a venta_detalles_para_api con formato original 2025-11-05 13:36:19 - --- Fin procesamiento para Prod0_ID98 --- 2025-11-05 13:36:19 - Detalles de venta insertados y stock actualizado. 2025-11-05 13:36:19 - No se intentó la emisión DTE para Venta ID: 58 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 13:36:19 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 58 2025-11-05 13:36:19 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 13:36:19 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 13:36:19 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 13:36:19 - Transacción completada con éxito para Venta ID: 58 2025-11-05 13:36:19 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 13:36:19 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 13:55:49 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 13:55:49 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 13:55:49 - Datos recibidos: {"productos":[{"id":100,"codigo":"PAN-100","cantidad":0.25,"precio":"2100.00","subtotal":525,"es_busqueda_por_codigo":false,"peso_real":0.25}],"metodo_pago":"1","total":441,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"20"} 2025-11-05 13:55:49 - Content-Type: application/json 2025-11-05 13:55:49 - Resultado de json_decode: OK 2025-11-05 13:55:49 - ID sesión de caja recibido en JSON: 20 2025-11-05 13:55:49 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 13:55:49 - [DB EXECUTE][ID: ConfigDTE] Params: ["17.612.457-1"] 2025-11-05 13:55:49 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 13:55:49 - [DB EXECUTE][ID: DatosNegocio] Params: ["17.612.457-1"] 2025-11-05 13:55:49 - Modo API DTE está INACTIVO según configuración. 2025-11-05 13:55:49 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 13:55:49 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=20) 2025-11-05 13:55:49 - Venta insertada con ID: 59 2025-11-05 13:55:49 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 13:55:49 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 59) 2025-11-05 13:55:49 - Token de vista generado: 1b9aaf97a0f28674444a62b826954666 2025-11-05 13:55:49 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 13:55:49 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 13:55:49 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 13:55:49 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 13:55:49 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 13:55:49 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 13:55:49 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 13:55:49 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 13:55:49 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 13:55:49 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 13:55:49 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 13:55:49 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 13:55:49 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 13:55:49 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 13:55:49 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 13:55:49 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 13:55:49 - --- Iniciando procesamiento para Prod0_ID100 --- 2025-11-05 13:55:49 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID100] Params: {"pid":100} 2025-11-05 13:55:49 - [Stock Check] Producto ID: 100, Tipo Código: especial, Modo Venta: PESO, Controla Stock: SI 2025-11-05 13:55:49 - [Producto Por Peso][Prod0_ID100] Peso real: 0.25 Kg 2025-11-05 13:55:49 - [DEBUG PRODUCTO][Prod0_ID100] Datos recibidos: {"id":100,"codigo":"PAN-100","cantidad":0.25,"precio":"2100.00","subtotal":525,"es_busqueda_por_codigo":false,"peso_real":0.25} 2025-11-05 13:55:49 - [LOTE ESPECIAL ACTUALIZADO][Prod0_ID100] Lote ID: 68, Cantidad reducida: 0.25 2025-11-05 13:55:49 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID100] Params: cantidad=0.25, peso=0.25, lote_id=68 2025-11-05 13:55:49 - [Detalle Actualizado][Prod0_ID100] Nombre especial actualizado a: Producto (0.25 Kg) 2025-11-05 13:55:49 - [Stock Process][Prod0_ID100] Procesando stock con cantidad: 0.25 2025-11-05 13:55:49 - [Stock ESPECIAL][Prod0_ID100] Procesando producto especial con códigos de barras 2025-11-05 13:55:49 - [DB EXECUTE][ID: FindCodeEspecialLoop_Prod0_ID100] Params: {"pid":"100","codigo":"PAN-100"} 2025-11-05 13:55:49 - [Stock Especial][Prod0_ID100] Producto especial - solo código de barras genérico: 116 2025-11-05 13:55:49 - [Stock Especial][Prod0_ID100] Actualizado código escaneado ID: 116. Descontado: 0.25 2025-11-05 13:55:49 - [Stock Strategy ESPECIAL][Prod0_ID100] Producto especial por PESO - sincronización manual de 4 tablas. Cantidad a restar: 0.25 2025-11-05 13:55:49 - [Stock Update ESPECIAL][Prod0_ID100] Actualizando manualmente las 4 tablas: productos, inventario, codigos_barras, resumen_productos 2025-11-05 13:55:49 - [Stock Update ESPECIAL][Prod0_ID100] Stock anterior: 40, cantidad a restar: 0.25, stock nuevo: 39.75 2025-11-05 13:55:49 - [Stock Update MASIVO][Prod0_ID100] Solo registrando movimiento - trigger sincronizará todas las tablas 2025-11-05 13:55:49 - [Stock Update MASIVO][Prod0_ID100] Código genérico capturado: ID 116 2025-11-05 13:55:49 - [MOVIMIENTO MASIVO] Llamando a registrarMovimientoStock para Producto ID: 100, Cantidad: 0.25, Venta ID: 59 2025-11-05 13:55:49 - [Movimiento Stock] Registrando movimiento para Producto ID: 100, Cantidad: 0.25 2025-11-05 13:55:49 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 100 2025-11-05 13:55:49 - [MOVIMIENTO MASIVO] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 13:55:49 - [DTE Detalle][Prod0_ID100] Agregado a venta_detalles_para_api con formato original 2025-11-05 13:55:49 - --- Fin procesamiento para Prod0_ID100 --- 2025-11-05 13:55:49 - Detalles de venta insertados y stock actualizado. 2025-11-05 13:55:49 - No se intentó la emisión DTE para Venta ID: 59 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 13:55:49 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 59 2025-11-05 13:55:49 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 13:55:49 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 13:55:49 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 13:55:49 - Transacción completada con éxito para Venta ID: 59 2025-11-05 13:55:49 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 13:55:49 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:23:33 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:23:33 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:23:33 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:23:33 - Content-Type: application/json 2025-11-05 21:23:33 - Resultado de json_decode: OK 2025-11-05 21:23:33 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:23:33 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:23:33 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:23:33 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:23:33 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:23:33 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:23:33 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:23:33 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:23:33 - Venta insertada con ID: 60 2025-11-05 21:23:33 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:23:33 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 60) 2025-11-05 21:23:33 - Token de vista generado: d3a7dd2b80f3ead3510417318d61ec8b 2025-11-05 21:23:33 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:23:33 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:23:33 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:23:33 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:23:33 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:23:33 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:23:33 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:23:33 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:23:33 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:23:33 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:23:33 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:23:33 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:23:33 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:23:33 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:23:33 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:23:33 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:23:33 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:23:33 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:23:33 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:23:33 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"100.00","fecha_vencimiento":null}]} 2025-11-05 21:23:33 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:23:33 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:23:33 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:23:33 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:23:33 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:23:33 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:23:33 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:23:33 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:23:33 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:23:33 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:23:33 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 60 2025-11-05 21:23:33 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:23:33 - [MOVIMIENTO MASIVO] Stock actual: 99.00, Cantidad vendida: 1 2025-11-05 21:23:33 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:23:33 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:23:33 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:23:33 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:23:33 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:23:33 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:23:33 - No se intentó la emisión DTE para Venta ID: 60 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:23:33 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 60 2025-11-05 21:23:33 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:23:33 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:23:33 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:23:33 - Transacción completada con éxito para Venta ID: 60 2025-11-05 21:23:33 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:23:33 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:26:04 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:26:04 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:26:04 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"99.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:26:04 - Content-Type: application/json 2025-11-05 21:26:04 - Resultado de json_decode: OK 2025-11-05 21:26:04 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:26:04 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:26:04 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:26:04 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:26:04 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:26:04 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:26:04 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:26:04 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:26:04 - Venta insertada con ID: 61 2025-11-05 21:26:04 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:26:04 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 61) 2025-11-05 21:26:04 - Token de vista generado: d16748e1791e0a1b97a626794422007a 2025-11-05 21:26:04 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:26:04 - Número de venta real para negocio 78.216.219-5: 2 2025-11-05 21:26:04 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:26:04 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:26:04 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:26:04 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:26:04 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:26:04 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:26:04 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:26:04 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:26:04 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:26:04 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:26:04 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:26:04 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:26:04 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:26:04 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:26:04 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:26:04 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:26:04 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:26:04 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:26:04 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:26:04 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"99.00","fecha_vencimiento":null}]} 2025-11-05 21:26:04 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:26:04 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:26:04 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:26:04 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:26:04 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:26:04 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:26:04 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:26:04 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:26:04 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:26:04 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:26:04 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 61 2025-11-05 21:26:04 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:26:04 - [MOVIMIENTO MASIVO] Stock actual: 98.00, Cantidad vendida: 1 2025-11-05 21:26:04 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:26:04 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:26:04 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:26:04 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:26:04 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:26:04 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:26:04 - No se intentó la emisión DTE para Venta ID: 61 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:26:04 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 61 2025-11-05 21:26:04 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:26:04 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:26:04 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:26:04 - Transacción completada con éxito para Venta ID: 61 2025-11-05 21:26:04 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:26:04 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:26:53 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:26:53 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:26:53 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"98.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:26:53 - Content-Type: application/json 2025-11-05 21:26:53 - Resultado de json_decode: OK 2025-11-05 21:26:53 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:26:53 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:26:53 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:26:53 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:26:53 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:26:53 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:26:53 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:26:53 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:26:53 - Venta insertada con ID: 62 2025-11-05 21:26:53 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:26:53 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 62) 2025-11-05 21:26:53 - Token de vista generado: c9bc8571e06e11d6f22f485edb8f1e1d 2025-11-05 21:26:53 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:26:53 - Número de venta real para negocio 78.216.219-5: 3 2025-11-05 21:26:53 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:26:53 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:26:53 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:26:53 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:26:53 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:26:53 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:26:53 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:26:53 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:26:53 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:26:53 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:26:53 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:26:53 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:26:53 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:26:53 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:26:53 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:26:53 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:26:53 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:26:53 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:26:53 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:26:53 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"98.00","fecha_vencimiento":null}]} 2025-11-05 21:26:53 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:26:53 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:26:53 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:26:53 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:26:53 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:26:53 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:26:53 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:26:53 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:26:53 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:26:53 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:26:53 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 62 2025-11-05 21:26:53 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:26:53 - [MOVIMIENTO MASIVO] Stock actual: 97.00, Cantidad vendida: 1 2025-11-05 21:26:53 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:26:53 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:26:53 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:26:53 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:26:53 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:26:53 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:26:53 - No se intentó la emisión DTE para Venta ID: 62 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:26:53 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 62 2025-11-05 21:26:53 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:26:53 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:26:53 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:26:53 - Transacción completada con éxito para Venta ID: 62 2025-11-05 21:26:53 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:26:53 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:28:22 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:28:22 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:28:22 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"97.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:28:22 - Content-Type: application/json 2025-11-05 21:28:22 - Resultado de json_decode: OK 2025-11-05 21:28:22 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:28:22 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:28:22 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:28:22 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:28:22 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:28:22 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:28:22 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:28:22 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:28:22 - Venta insertada con ID: 63 2025-11-05 21:28:22 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:28:22 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 63) 2025-11-05 21:28:22 - Token de vista generado: 3f4c53f74a838c685235c671a6869098 2025-11-05 21:28:22 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:28:22 - Número de venta real para negocio 78.216.219-5: 4 2025-11-05 21:28:22 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:28:22 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:28:22 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:28:22 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:28:22 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:28:22 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:28:22 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:28:22 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:28:22 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:28:22 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:28:22 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:28:22 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:28:22 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:28:22 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:28:22 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:28:22 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:28:22 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:28:22 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:28:22 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:28:22 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"97.00","fecha_vencimiento":null}]} 2025-11-05 21:28:22 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:28:22 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:28:22 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:28:22 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:28:22 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:28:22 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:28:22 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:28:22 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:28:22 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:28:22 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:28:22 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 63 2025-11-05 21:28:22 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:28:22 - [MOVIMIENTO MASIVO] Stock actual: 96.00, Cantidad vendida: 1 2025-11-05 21:28:22 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:28:22 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:28:22 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:28:22 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:28:22 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:28:22 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:28:22 - No se intentó la emisión DTE para Venta ID: 63 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:28:22 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 63 2025-11-05 21:28:22 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:28:22 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:28:22 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:28:22 - Transacción completada con éxito para Venta ID: 63 2025-11-05 21:28:22 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:28:22 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:34:14 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:34:14 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:34:14 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"96.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:34:14 - Content-Type: application/json 2025-11-05 21:34:14 - Resultado de json_decode: OK 2025-11-05 21:34:14 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:34:14 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:34:14 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:34:14 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:34:14 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:34:14 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:34:14 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:34:14 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:34:14 - Venta insertada con ID: 64 2025-11-05 21:34:14 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:34:14 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 64) 2025-11-05 21:34:14 - Token de vista generado: 0a731a79eab89cf11e3a5b81617ca4dd 2025-11-05 21:34:14 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:34:14 - Número de venta real para negocio 78.216.219-5: 5 2025-11-05 21:34:14 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:34:14 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:34:14 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:34:14 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:34:14 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:34:14 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:34:14 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:34:14 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:34:14 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:34:14 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:34:14 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:34:14 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:34:14 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:34:14 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:34:14 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:34:14 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:34:14 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:34:14 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:34:14 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:34:14 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"96.00","fecha_vencimiento":null}]} 2025-11-05 21:34:14 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:34:14 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:34:14 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:34:14 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:34:14 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:34:14 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:34:14 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:34:14 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:34:14 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:34:14 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:34:14 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 64 2025-11-05 21:34:14 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:34:14 - [MOVIMIENTO MASIVO] Stock actual: 95.00, Cantidad vendida: 1 2025-11-05 21:34:14 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:34:14 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:34:14 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:34:14 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:34:14 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:34:14 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:34:14 - No se intentó la emisión DTE para Venta ID: 64 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:34:14 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 64 2025-11-05 21:34:14 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:34:14 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:34:14 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:34:14 - Transacción completada con éxito para Venta ID: 64 2025-11-05 21:34:14 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:34:14 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:34:46 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:34:46 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:34:46 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"95.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:34:46 - Content-Type: application/json 2025-11-05 21:34:46 - Resultado de json_decode: OK 2025-11-05 21:34:46 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:34:46 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:34:46 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:34:46 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:34:46 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:34:46 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:34:46 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:34:46 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:34:46 - Venta insertada con ID: 65 2025-11-05 21:34:46 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:34:46 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 65) 2025-11-05 21:34:46 - Token de vista generado: 5774236ef90e295881214a9065ecf1fc 2025-11-05 21:34:46 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:34:46 - Número de venta real para negocio 78.216.219-5: 6 2025-11-05 21:34:46 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:34:46 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:34:46 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:34:46 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:34:46 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:34:46 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:34:46 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:34:46 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:34:46 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:34:46 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:34:46 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:34:46 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:34:46 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:34:46 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:34:46 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:34:46 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:34:46 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:34:46 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:34:46 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:34:46 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"95.00","fecha_vencimiento":null}]} 2025-11-05 21:34:46 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:34:46 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:34:46 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:34:46 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:34:46 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:34:46 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:34:46 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:34:46 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:34:46 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:34:46 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:34:46 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 65 2025-11-05 21:34:46 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:34:46 - [MOVIMIENTO MASIVO] Stock actual: 94.00, Cantidad vendida: 1 2025-11-05 21:34:46 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:34:46 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:34:46 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:34:46 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:34:46 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:34:46 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:34:46 - No se intentó la emisión DTE para Venta ID: 65 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:34:46 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 65 2025-11-05 21:34:46 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:34:46 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:34:46 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:34:46 - Transacción completada con éxito para Venta ID: 65 2025-11-05 21:34:46 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:34:46 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:37:28 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:37:28 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:37:28 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"94.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:37:28 - Content-Type: application/json 2025-11-05 21:37:28 - Resultado de json_decode: OK 2025-11-05 21:37:28 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:37:28 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:37:28 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:37:28 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:37:28 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:37:28 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:37:28 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:37:28 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:37:28 - Venta insertada con ID: 66 2025-11-05 21:37:28 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:37:28 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 66) 2025-11-05 21:37:28 - Token de vista generado: 13a68b2271ff2b734f8d4805ae593174 2025-11-05 21:37:28 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:37:28 - Número de venta real para negocio 78.216.219-5: 7 2025-11-05 21:37:28 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:37:28 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:37:28 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:37:28 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:37:28 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:37:28 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:37:28 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:37:28 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:37:28 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:37:28 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:37:28 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:37:28 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:37:28 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:37:28 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:37:28 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:37:28 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:37:28 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:37:28 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:37:28 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:37:28 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"94.00","fecha_vencimiento":null}]} 2025-11-05 21:37:28 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:37:28 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:37:28 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:37:28 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:37:28 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:37:28 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:37:28 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:37:28 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:37:28 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:37:28 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:37:28 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 66 2025-11-05 21:37:28 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:37:28 - [MOVIMIENTO MASIVO] Stock actual: 93.00, Cantidad vendida: 1 2025-11-05 21:37:28 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:37:28 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:37:28 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:37:28 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:37:28 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:37:28 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:37:28 - No se intentó la emisión DTE para Venta ID: 66 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:37:28 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 66 2025-11-05 21:37:28 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:37:28 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:37:28 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:37:28 - Transacción completada con éxito para Venta ID: 66 2025-11-05 21:37:28 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:37:28 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:39:37 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:39:37 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:39:37 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"93.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:39:37 - Content-Type: application/json 2025-11-05 21:39:37 - Resultado de json_decode: OK 2025-11-05 21:39:37 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:39:37 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:39:37 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:39:37 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:39:37 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:39:37 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:39:37 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:39:37 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:39:37 - Venta insertada con ID: 67 2025-11-05 21:39:37 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:39:37 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 67) 2025-11-05 21:39:37 - Token de vista generado: 4109a80bf6bbc4887f95148fbfc0a1ad 2025-11-05 21:39:37 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:39:37 - Número de venta real para negocio 78.216.219-5: 8 2025-11-05 21:39:37 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:39:37 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:39:37 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:39:37 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:39:37 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:39:37 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:39:37 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:39:37 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:39:37 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:39:37 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:39:37 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:39:37 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:39:37 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:39:37 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:39:37 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:39:37 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:39:37 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:39:37 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:39:37 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:39:37 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"93.00","fecha_vencimiento":null}]} 2025-11-05 21:39:37 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:39:37 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:39:37 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:39:37 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:39:37 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:39:37 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:39:37 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:39:37 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:39:37 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:39:37 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:39:37 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 67 2025-11-05 21:39:37 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:39:37 - [MOVIMIENTO MASIVO] Stock actual: 92.00, Cantidad vendida: 1 2025-11-05 21:39:37 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:39:37 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:39:37 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:39:37 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:39:37 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:39:37 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:39:37 - No se intentó la emisión DTE para Venta ID: 67 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:39:37 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 67 2025-11-05 21:39:37 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:39:37 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:39:37 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:39:37 - Transacción completada con éxito para Venta ID: 67 2025-11-05 21:39:37 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:39:37 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:40:06 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:40:06 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:40:06 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"92.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:40:06 - Content-Type: application/json 2025-11-05 21:40:06 - Resultado de json_decode: OK 2025-11-05 21:40:06 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:40:06 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:40:06 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:40:06 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:40:06 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:40:06 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:40:06 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:40:06 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:40:06 - Venta insertada con ID: 68 2025-11-05 21:40:06 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:40:06 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 68) 2025-11-05 21:40:06 - Token de vista generado: e9cc7b9a83eb66edc817b558fdfcebdf 2025-11-05 21:40:06 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:40:06 - Número de venta real para negocio 78.216.219-5: 9 2025-11-05 21:40:06 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:40:06 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:40:06 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:40:06 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:40:06 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:40:06 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:40:06 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:40:06 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:40:06 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:40:06 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:40:06 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:40:06 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:40:06 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:40:06 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:40:06 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:40:06 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:40:06 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:40:06 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:40:06 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:40:06 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"92.00","fecha_vencimiento":null}]} 2025-11-05 21:40:06 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:40:06 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:40:06 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:40:06 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:40:06 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:40:06 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:40:06 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:40:06 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:40:06 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:40:06 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:40:06 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 68 2025-11-05 21:40:06 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:40:06 - [MOVIMIENTO MASIVO] Stock actual: 91.00, Cantidad vendida: 1 2025-11-05 21:40:06 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:40:06 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:40:06 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:40:06 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:40:06 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:40:06 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:40:06 - No se intentó la emisión DTE para Venta ID: 68 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:40:06 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 68 2025-11-05 21:40:06 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:40:06 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:40:06 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:40:06 - Transacción completada con éxito para Venta ID: 68 2025-11-05 21:40:06 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:40:06 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:44:52 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:44:52 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:44:52 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"91.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:44:52 - Content-Type: application/json 2025-11-05 21:44:52 - Resultado de json_decode: OK 2025-11-05 21:44:52 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:44:52 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:44:52 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:44:52 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:44:52 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:44:52 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:44:52 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:44:52 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:44:52 - Venta insertada con ID: 69 2025-11-05 21:44:52 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:44:52 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 69) 2025-11-05 21:44:52 - Token de vista generado: 387ac601ae14d6d7d931ce5f06516555 2025-11-05 21:44:52 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:44:52 - Número de venta real para negocio 78.216.219-5: 10 2025-11-05 21:44:52 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:44:52 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:44:52 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:44:52 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:44:52 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:44:52 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:44:52 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:44:52 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:44:52 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:44:52 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:44:52 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:44:52 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:44:52 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:44:52 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:44:52 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:44:52 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:44:52 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:44:52 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:44:52 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:44:52 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"91.00","fecha_vencimiento":null}]} 2025-11-05 21:44:52 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:44:52 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:44:52 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:44:52 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:44:52 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:44:52 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:44:52 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:44:52 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:44:52 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:44:52 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:44:52 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 69 2025-11-05 21:44:52 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:44:52 - [MOVIMIENTO MASIVO] Stock actual: 90.00, Cantidad vendida: 1 2025-11-05 21:44:52 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:44:52 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:44:52 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:44:52 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:44:52 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:44:52 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:44:52 - No se intentó la emisión DTE para Venta ID: 69 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:44:52 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 69 2025-11-05 21:44:52 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:44:52 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:44:52 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:44:52 - Transacción completada con éxito para Venta ID: 69 2025-11-05 21:44:52 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:44:52 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:47:44 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:47:44 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:47:44 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"90.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:47:44 - Content-Type: application/json 2025-11-05 21:47:44 - Resultado de json_decode: OK 2025-11-05 21:47:44 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:47:44 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:47:44 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:47:44 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:47:44 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:47:44 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:47:44 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:47:44 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:47:44 - Venta insertada con ID: 70 2025-11-05 21:47:44 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:47:44 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 70) 2025-11-05 21:47:44 - Token de vista generado: d195281af6256f4d861033731086e74f 2025-11-05 21:47:44 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:47:44 - Número de venta real para negocio 78.216.219-5: 11 2025-11-05 21:47:44 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:47:44 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:47:44 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:47:44 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:47:44 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:47:44 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:47:44 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:47:44 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:47:44 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:47:44 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:47:44 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:47:44 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:47:44 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:47:44 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:47:44 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:47:44 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:47:44 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:47:44 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:47:44 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:47:44 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"90.00","fecha_vencimiento":null}]} 2025-11-05 21:47:44 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:47:44 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:47:44 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:47:44 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:47:44 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:47:44 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:47:44 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:47:44 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:47:44 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:47:44 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:47:44 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 70 2025-11-05 21:47:44 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:47:44 - [MOVIMIENTO MASIVO] Stock actual: 89.00, Cantidad vendida: 1 2025-11-05 21:47:44 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:47:44 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:47:44 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:47:44 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:47:44 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:47:44 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:47:44 - No se intentó la emisión DTE para Venta ID: 70 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:47:44 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 70 2025-11-05 21:47:44 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:47:44 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:47:44 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:47:44 - Transacción completada con éxito para Venta ID: 70 2025-11-05 21:47:44 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:47:44 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:51:17 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:51:17 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:51:17 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"89.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:51:17 - Content-Type: application/json 2025-11-05 21:51:17 - Resultado de json_decode: OK 2025-11-05 21:51:17 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:51:17 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:51:17 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:51:17 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:51:17 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:51:17 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:51:17 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:51:17 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:51:17 - Venta insertada con ID: 71 2025-11-05 21:51:17 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:51:17 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 71) 2025-11-05 21:51:17 - Token de vista generado: c9713084a935f540f8d83d3d75964e93 2025-11-05 21:51:17 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:51:17 - Número de venta real para negocio 78.216.219-5: 12 2025-11-05 21:51:17 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:51:17 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:51:17 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:51:17 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:51:17 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:51:17 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:51:17 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:51:17 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:51:17 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:51:17 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:51:17 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:51:17 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:51:17 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:51:17 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:51:17 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:51:17 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:51:17 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:51:17 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:51:17 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:51:17 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"89.00","fecha_vencimiento":null}]} 2025-11-05 21:51:17 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:51:17 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:51:17 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:51:17 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:51:17 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:51:17 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:51:17 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:51:17 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:51:17 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:51:17 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:51:17 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 71 2025-11-05 21:51:17 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:51:17 - [MOVIMIENTO MASIVO] Stock actual: 88.00, Cantidad vendida: 1 2025-11-05 21:51:17 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:51:17 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:51:17 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:51:17 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:51:17 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:51:17 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:51:17 - No se intentó la emisión DTE para Venta ID: 71 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:51:17 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 71 2025-11-05 21:51:17 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:51:17 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:51:17 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:51:17 - Transacción completada con éxito para Venta ID: 71 2025-11-05 21:51:17 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:51:17 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:54:49 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:54:49 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:54:49 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"88.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:54:49 - Content-Type: application/json 2025-11-05 21:54:49 - Resultado de json_decode: OK 2025-11-05 21:54:49 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:54:49 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:54:49 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:54:49 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:54:49 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:54:49 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:54:49 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:54:49 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:54:49 - Venta insertada con ID: 72 2025-11-05 21:54:49 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:54:49 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 72) 2025-11-05 21:54:49 - Token de vista generado: 2eda52f3821a68b5b1f1191b021b812b 2025-11-05 21:54:49 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:54:49 - Número de venta real para negocio 78.216.219-5: 13 2025-11-05 21:54:49 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:54:49 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:54:49 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:54:49 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:54:49 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:54:49 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:54:49 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:54:49 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:54:49 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:54:49 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:54:49 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:54:49 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:54:49 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:54:49 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:54:49 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:54:49 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:54:49 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:54:49 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:54:49 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:54:49 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"88.00","fecha_vencimiento":null}]} 2025-11-05 21:54:49 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:54:49 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:54:49 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:54:49 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:54:49 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:54:49 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:54:49 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:54:49 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:54:49 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:54:49 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:54:49 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 72 2025-11-05 21:54:49 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:54:49 - [MOVIMIENTO MASIVO] Stock actual: 87.00, Cantidad vendida: 1 2025-11-05 21:54:49 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:54:49 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:54:49 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:54:49 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:54:49 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:54:49 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:54:49 - No se intentó la emisión DTE para Venta ID: 72 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:54:49 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 72 2025-11-05 21:54:49 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:54:49 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:54:49 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:54:49 - Transacción completada con éxito para Venta ID: 72 2025-11-05 21:54:49 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:54:49 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 21:59:25 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 21:59:25 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 21:59:25 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"87.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 21:59:25 - Content-Type: application/json 2025-11-05 21:59:25 - Resultado de json_decode: OK 2025-11-05 21:59:25 - ID sesión de caja recibido en JSON: 19 2025-11-05 21:59:25 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 21:59:25 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 21:59:25 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 21:59:25 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 21:59:25 - Modo API DTE está INACTIVO según configuración. 2025-11-05 21:59:25 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 21:59:25 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 21:59:25 - Venta insertada con ID: 73 2025-11-05 21:59:25 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 21:59:25 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 73) 2025-11-05 21:59:25 - Token de vista generado: ca9eeb280e62f280f24b6caba05cb61a 2025-11-05 21:59:25 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 21:59:25 - Número de venta real para negocio 78.216.219-5: 14 2025-11-05 21:59:25 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 21:59:25 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 21:59:25 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 21:59:25 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 21:59:25 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:59:25 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 21:59:25 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 21:59:25 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 21:59:25 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:59:25 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:59:25 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:59:25 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:59:25 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 21:59:25 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 21:59:25 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 21:59:25 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 21:59:25 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 21:59:25 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 21:59:25 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 21:59:25 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"87.00","fecha_vencimiento":null}]} 2025-11-05 21:59:25 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 21:59:25 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 21:59:25 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 21:59:25 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 21:59:25 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 21:59:25 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 21:59:25 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 21:59:25 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 21:59:25 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 21:59:25 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 21:59:25 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 73 2025-11-05 21:59:25 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 21:59:25 - [MOVIMIENTO MASIVO] Stock actual: 86.00, Cantidad vendida: 1 2025-11-05 21:59:25 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 21:59:25 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 21:59:25 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 21:59:25 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 21:59:25 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 21:59:25 - Detalles de venta insertados y stock actualizado. 2025-11-05 21:59:25 - No se intentó la emisión DTE para Venta ID: 73 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 21:59:25 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 73 2025-11-05 21:59:25 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 21:59:25 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 21:59:25 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 21:59:25 - Transacción completada con éxito para Venta ID: 73 2025-11-05 21:59:25 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 21:59:25 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 22:02:49 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 22:02:49 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 22:02:49 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"86.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 22:02:49 - Content-Type: application/json 2025-11-05 22:02:49 - Resultado de json_decode: OK 2025-11-05 22:02:49 - ID sesión de caja recibido en JSON: 19 2025-11-05 22:02:49 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 22:02:49 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 22:02:49 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 22:02:49 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 22:02:49 - Modo API DTE está INACTIVO según configuración. 2025-11-05 22:02:49 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 22:02:49 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 22:02:49 - Venta insertada con ID: 74 2025-11-05 22:02:49 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 22:02:49 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 74) 2025-11-05 22:02:49 - Token de vista generado: b77f4252467177959a798cbd555e88c7 2025-11-05 22:02:49 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 22:02:49 - Número de venta real para negocio 78.216.219-5: 15 2025-11-05 22:02:49 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 22:02:49 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 22:02:49 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 22:02:49 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 22:02:49 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:02:49 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:02:49 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 22:02:49 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 22:02:49 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:02:49 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:02:49 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:02:49 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:02:49 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 22:02:49 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:02:49 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 22:02:49 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:02:49 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 22:02:49 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 22:02:49 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 22:02:49 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"86.00","fecha_vencimiento":null}]} 2025-11-05 22:02:49 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 22:02:49 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 22:02:49 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 22:02:49 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 22:02:49 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 22:02:49 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 22:02:49 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 22:02:49 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 22:02:49 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 22:02:49 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 22:02:49 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 74 2025-11-05 22:02:49 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 22:02:49 - [MOVIMIENTO MASIVO] Stock actual: 85.00, Cantidad vendida: 1 2025-11-05 22:02:49 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 22:02:49 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 22:02:49 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 22:02:49 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 22:02:49 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 22:02:49 - Detalles de venta insertados y stock actualizado. 2025-11-05 22:02:49 - No se intentó la emisión DTE para Venta ID: 74 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 22:02:49 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 74 2025-11-05 22:02:49 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 22:02:49 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 22:02:49 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 22:02:49 - Transacción completada con éxito para Venta ID: 74 2025-11-05 22:02:49 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 22:02:49 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 22:04:20 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 22:04:20 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 22:04:20 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"85.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 22:04:20 - Content-Type: application/json 2025-11-05 22:04:20 - Resultado de json_decode: OK 2025-11-05 22:04:20 - ID sesión de caja recibido en JSON: 19 2025-11-05 22:04:20 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 22:04:20 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 22:04:20 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 22:04:20 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 22:04:20 - Modo API DTE está INACTIVO según configuración. 2025-11-05 22:04:20 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 22:04:20 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 22:04:20 - Venta insertada con ID: 75 2025-11-05 22:04:20 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 22:04:20 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 75) 2025-11-05 22:04:20 - Token de vista generado: 5674b54748c6f5bcb0ee2f0678e9224f 2025-11-05 22:04:20 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 22:04:20 - Número de venta real para negocio 78.216.219-5: 16 2025-11-05 22:04:20 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 22:04:20 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 22:04:20 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 22:04:20 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 22:04:20 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:04:20 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:04:20 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 22:04:20 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 22:04:20 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:04:20 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:04:20 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:04:20 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:04:20 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 22:04:20 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:04:20 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 22:04:20 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:04:20 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 22:04:20 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 22:04:20 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 22:04:20 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"85.00","fecha_vencimiento":null}]} 2025-11-05 22:04:20 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 22:04:20 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 22:04:20 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 22:04:20 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 22:04:20 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 22:04:20 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 22:04:20 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 22:04:20 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 22:04:20 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 22:04:20 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 22:04:20 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 75 2025-11-05 22:04:20 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 22:04:20 - [MOVIMIENTO MASIVO] Stock actual: 84.00, Cantidad vendida: 1 2025-11-05 22:04:20 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 22:04:20 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 22:04:20 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 22:04:20 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 22:04:20 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 22:04:20 - Detalles de venta insertados y stock actualizado. 2025-11-05 22:04:20 - No se intentó la emisión DTE para Venta ID: 75 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 22:04:20 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 75 2025-11-05 22:04:20 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 22:04:20 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 22:04:20 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 22:04:20 - Transacción completada con éxito para Venta ID: 75 2025-11-05 22:04:20 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 22:04:20 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 22:06:23 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 22:06:23 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 22:06:23 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"84.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 22:06:23 - Content-Type: application/json 2025-11-05 22:06:23 - Resultado de json_decode: OK 2025-11-05 22:06:23 - ID sesión de caja recibido en JSON: 19 2025-11-05 22:06:23 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 22:06:23 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 22:06:23 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 22:06:23 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 22:06:23 - Modo API DTE está INACTIVO según configuración. 2025-11-05 22:06:23 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 22:06:23 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 22:06:23 - Venta insertada con ID: 76 2025-11-05 22:06:23 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 22:06:23 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 76) 2025-11-05 22:06:23 - Token de vista generado: c54f0740b2eb5c8cbcd29123d198efa4 2025-11-05 22:06:23 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 22:06:23 - Número de venta real para negocio 78.216.219-5: 17 2025-11-05 22:06:23 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 22:06:23 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 22:06:23 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 22:06:23 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 22:06:23 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:06:23 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:06:23 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 22:06:23 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 22:06:23 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:06:23 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:06:23 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:06:23 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:06:23 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 22:06:23 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:06:23 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 22:06:23 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:06:23 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 22:06:23 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 22:06:23 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 22:06:23 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"84.00","fecha_vencimiento":null}]} 2025-11-05 22:06:23 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 22:06:23 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 22:06:23 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 22:06:23 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 22:06:23 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 22:06:23 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 22:06:23 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 22:06:23 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 22:06:23 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 22:06:23 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 22:06:23 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 76 2025-11-05 22:06:23 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 22:06:23 - [MOVIMIENTO MASIVO] Stock actual: 83.00, Cantidad vendida: 1 2025-11-05 22:06:23 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 22:06:23 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 22:06:23 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 22:06:23 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 22:06:23 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 22:06:23 - Detalles de venta insertados y stock actualizado. 2025-11-05 22:06:23 - No se intentó la emisión DTE para Venta ID: 76 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 22:06:23 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 76 2025-11-05 22:06:23 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 22:06:23 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 22:06:23 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 22:06:23 - Transacción completada con éxito para Venta ID: 76 2025-11-05 22:06:23 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 22:06:23 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 22:06:30 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 22:06:30 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 22:06:30 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"83.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 22:06:30 - Content-Type: application/json 2025-11-05 22:06:30 - Resultado de json_decode: OK 2025-11-05 22:06:30 - ID sesión de caja recibido en JSON: 19 2025-11-05 22:06:30 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 22:06:30 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 22:06:30 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 22:06:30 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 22:06:30 - Modo API DTE está INACTIVO según configuración. 2025-11-05 22:06:30 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 22:06:30 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 22:06:30 - Venta insertada con ID: 77 2025-11-05 22:06:30 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 22:06:30 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 77) 2025-11-05 22:06:30 - Token de vista generado: 568fa1af0d0eec924a174f9a2db671d0 2025-11-05 22:06:30 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 22:06:30 - Número de venta real para negocio 78.216.219-5: 18 2025-11-05 22:06:30 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 22:06:30 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 22:06:30 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 22:06:30 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 22:06:30 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:06:30 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:06:30 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 22:06:30 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 22:06:30 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:06:30 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:06:30 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:06:30 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:06:30 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 22:06:30 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:06:30 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 22:06:30 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:06:30 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 22:06:30 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 22:06:30 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 22:06:30 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"83.00","fecha_vencimiento":null}]} 2025-11-05 22:06:30 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 22:06:30 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 22:06:30 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 22:06:30 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 22:06:30 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 22:06:30 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 22:06:30 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 22:06:30 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 22:06:30 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 22:06:30 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 22:06:30 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 77 2025-11-05 22:06:30 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 22:06:30 - [MOVIMIENTO MASIVO] Stock actual: 82.00, Cantidad vendida: 1 2025-11-05 22:06:30 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 22:06:30 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 22:06:30 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 22:06:30 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 22:06:30 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 22:06:30 - Detalles de venta insertados y stock actualizado. 2025-11-05 22:06:30 - No se intentó la emisión DTE para Venta ID: 77 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 22:06:30 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 77 2025-11-05 22:06:30 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 22:06:30 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 22:06:30 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 22:06:30 - Transacción completada con éxito para Venta ID: 77 2025-11-05 22:06:30 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 22:06:30 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 22:08:18 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 22:08:18 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 22:08:18 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"82.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 22:08:18 - Content-Type: application/json 2025-11-05 22:08:18 - Resultado de json_decode: OK 2025-11-05 22:08:18 - ID sesión de caja recibido en JSON: 19 2025-11-05 22:08:18 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 22:08:18 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 22:08:18 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 22:08:18 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 22:08:18 - Modo API DTE está INACTIVO según configuración. 2025-11-05 22:08:18 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 22:08:18 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 22:08:18 - Venta insertada con ID: 78 2025-11-05 22:08:18 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 22:08:18 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 78) 2025-11-05 22:08:18 - Token de vista generado: 10adfb8b190e9e30ad98f40992128dfb 2025-11-05 22:08:18 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 22:08:18 - Número de venta real para negocio 78.216.219-5: 19 2025-11-05 22:08:18 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 22:08:18 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 22:08:18 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 22:08:18 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 22:08:18 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:08:18 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:08:18 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 22:08:18 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 22:08:18 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:08:18 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:08:18 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:08:18 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:08:18 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 22:08:18 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:08:18 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 22:08:18 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:08:18 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 22:08:18 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 22:08:18 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 22:08:18 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"82.00","fecha_vencimiento":null}]} 2025-11-05 22:08:18 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 22:08:18 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 22:08:18 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 22:08:18 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 22:08:18 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 22:08:18 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 22:08:18 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 22:08:18 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 22:08:18 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 22:08:18 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 22:08:18 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 78 2025-11-05 22:08:18 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 22:08:18 - [MOVIMIENTO MASIVO] Stock actual: 81.00, Cantidad vendida: 1 2025-11-05 22:08:18 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 22:08:18 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 22:08:18 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 22:08:18 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 22:08:18 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 22:08:18 - Detalles de venta insertados y stock actualizado. 2025-11-05 22:08:18 - No se intentó la emisión DTE para Venta ID: 78 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 22:08:18 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 78 2025-11-05 22:08:18 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 22:08:18 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 22:08:18 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 22:08:18 - Transacción completada con éxito para Venta ID: 78 2025-11-05 22:08:18 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 22:08:18 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 22:10:27 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 22:10:27 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 22:10:27 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"81.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 22:10:27 - Content-Type: application/json 2025-11-05 22:10:27 - Resultado de json_decode: OK 2025-11-05 22:10:27 - ID sesión de caja recibido en JSON: 19 2025-11-05 22:10:27 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 22:10:27 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 22:10:27 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 22:10:27 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 22:10:27 - Modo API DTE está INACTIVO según configuración. 2025-11-05 22:10:27 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 22:10:27 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 22:10:27 - Venta insertada con ID: 79 2025-11-05 22:10:27 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 22:10:27 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 79) 2025-11-05 22:10:27 - Token de vista generado: bb33d6808df9546109d1b9f028cca266 2025-11-05 22:10:27 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 22:10:27 - Número de venta real para negocio 78.216.219-5: 20 2025-11-05 22:10:27 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 22:10:27 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 22:10:27 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 22:10:27 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 22:10:27 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:10:27 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:10:27 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 22:10:27 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 22:10:27 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:10:27 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:10:27 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:10:27 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:10:27 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 22:10:27 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:10:27 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 22:10:27 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:10:27 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 22:10:27 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 22:10:27 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 22:10:27 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"81.00","fecha_vencimiento":null}]} 2025-11-05 22:10:27 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 22:10:27 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 22:10:27 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 22:10:27 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 22:10:27 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 22:10:27 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 22:10:27 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 22:10:27 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 22:10:27 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 22:10:27 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 22:10:27 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 79 2025-11-05 22:10:27 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 22:10:27 - [MOVIMIENTO MASIVO] Stock actual: 80.00, Cantidad vendida: 1 2025-11-05 22:10:27 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 22:10:27 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 22:10:27 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 22:10:27 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 22:10:27 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 22:10:27 - Detalles de venta insertados y stock actualizado. 2025-11-05 22:10:27 - No se intentó la emisión DTE para Venta ID: 79 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 22:10:27 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 79 2025-11-05 22:10:27 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 22:10:27 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 22:10:27 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 22:10:27 - Transacción completada con éxito para Venta ID: 79 2025-11-05 22:10:27 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 22:10:27 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 22:10:33 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 22:10:33 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 22:10:33 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"80.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 22:10:33 - Content-Type: application/json 2025-11-05 22:10:33 - Resultado de json_decode: OK 2025-11-05 22:10:33 - ID sesión de caja recibido en JSON: 19 2025-11-05 22:10:33 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 22:10:33 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 22:10:33 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 22:10:33 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 22:10:33 - Modo API DTE está INACTIVO según configuración. 2025-11-05 22:10:33 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 22:10:33 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 22:10:33 - Venta insertada con ID: 80 2025-11-05 22:10:33 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 22:10:33 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 80) 2025-11-05 22:10:33 - Token de vista generado: 62f420b70e408c86c78f5a22b6415fc1 2025-11-05 22:10:33 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 22:10:33 - Número de venta real para negocio 78.216.219-5: 21 2025-11-05 22:10:33 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 22:10:33 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 22:10:33 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 22:10:33 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 22:10:33 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:10:33 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:10:33 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 22:10:33 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 22:10:33 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:10:33 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:10:33 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:10:33 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:10:33 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 22:10:33 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:10:33 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 22:10:33 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:10:33 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 22:10:33 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 22:10:33 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 22:10:33 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"80.00","fecha_vencimiento":null}]} 2025-11-05 22:10:33 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 22:10:33 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 22:10:33 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 22:10:33 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 22:10:33 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 22:10:33 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 22:10:33 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 22:10:33 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 22:10:33 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 22:10:33 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 22:10:33 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 80 2025-11-05 22:10:33 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 22:10:33 - [MOVIMIENTO MASIVO] Stock actual: 79.00, Cantidad vendida: 1 2025-11-05 22:10:33 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 22:10:33 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 22:10:33 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 22:10:33 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 22:10:33 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 22:10:33 - Detalles de venta insertados y stock actualizado. 2025-11-05 22:10:33 - No se intentó la emisión DTE para Venta ID: 80 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 22:10:33 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 80 2025-11-05 22:10:33 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 22:10:33 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 22:10:33 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 22:10:33 - Transacción completada con éxito para Venta ID: 80 2025-11-05 22:10:33 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 22:10:33 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 22:15:35 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 22:15:35 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 22:15:35 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"79.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 22:15:35 - Content-Type: application/json 2025-11-05 22:15:35 - Resultado de json_decode: OK 2025-11-05 22:15:35 - ID sesión de caja recibido en JSON: 19 2025-11-05 22:15:35 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 22:15:35 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 22:15:35 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 22:15:35 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 22:15:35 - Modo API DTE está INACTIVO según configuración. 2025-11-05 22:15:35 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 22:15:35 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 22:15:35 - Venta insertada con ID: 81 2025-11-05 22:15:35 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 22:15:35 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 81) 2025-11-05 22:15:35 - Token de vista generado: 0bef4e99c8d0a8c30dd275ea5889a6ed 2025-11-05 22:15:35 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 22:15:35 - Número de venta real para negocio 78.216.219-5: 22 2025-11-05 22:15:35 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 22:15:35 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 22:15:35 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 22:15:35 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 22:15:35 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:15:35 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:15:35 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 22:15:35 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 22:15:35 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:15:35 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:15:35 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:15:35 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:15:35 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 22:15:35 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:15:35 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 22:15:35 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:15:35 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 22:15:35 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 22:15:35 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 22:15:35 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"79.00","fecha_vencimiento":null}]} 2025-11-05 22:15:35 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 22:15:35 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 22:15:35 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 22:15:35 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 22:15:35 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 22:15:35 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 22:15:35 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 22:15:35 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 22:15:35 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 22:15:35 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 22:15:35 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 81 2025-11-05 22:15:35 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 22:15:35 - [MOVIMIENTO MASIVO] Stock actual: 78.00, Cantidad vendida: 1 2025-11-05 22:15:35 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 22:15:35 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 22:15:35 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 22:15:35 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 22:15:35 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 22:15:35 - Detalles de venta insertados y stock actualizado. 2025-11-05 22:15:35 - No se intentó la emisión DTE para Venta ID: 81 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 22:15:35 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 81 2025-11-05 22:15:35 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 22:15:35 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 22:15:35 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 22:15:35 - Transacción completada con éxito para Venta ID: 81 2025-11-05 22:15:35 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 22:15:35 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 22:18:28 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 22:18:28 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 22:18:28 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"78.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 22:18:28 - Content-Type: application/json 2025-11-05 22:18:28 - Resultado de json_decode: OK 2025-11-05 22:18:28 - ID sesión de caja recibido en JSON: 19 2025-11-05 22:18:28 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 22:18:28 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 22:18:28 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 22:18:28 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 22:18:28 - Modo API DTE está INACTIVO según configuración. 2025-11-05 22:18:28 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 22:18:28 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 22:18:28 - Venta insertada con ID: 82 2025-11-05 22:18:28 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 22:18:28 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 82) 2025-11-05 22:18:28 - Token de vista generado: af264a3530a73c79117f565484a10a7f 2025-11-05 22:18:28 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 22:18:28 - Número de venta real para negocio 78.216.219-5: 23 2025-11-05 22:18:28 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 22:18:28 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 22:18:28 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 22:18:28 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 22:18:28 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:18:28 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:18:28 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 22:18:28 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 22:18:28 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:18:28 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:18:28 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:18:28 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:18:28 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 22:18:28 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:18:28 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 22:18:28 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:18:28 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 22:18:28 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 22:18:28 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 22:18:28 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"78.00","fecha_vencimiento":null}]} 2025-11-05 22:18:28 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 22:18:28 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 22:18:28 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 22:18:28 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 22:18:28 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 22:18:28 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 22:18:28 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 22:18:28 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 22:18:28 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 22:18:28 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 22:18:28 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 82 2025-11-05 22:18:28 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 22:18:28 - [MOVIMIENTO MASIVO] Stock actual: 77.00, Cantidad vendida: 1 2025-11-05 22:18:28 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 22:18:28 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 22:18:28 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 22:18:28 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 22:18:28 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 22:18:28 - Detalles de venta insertados y stock actualizado. 2025-11-05 22:18:28 - No se intentó la emisión DTE para Venta ID: 82 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 22:18:28 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 82 2025-11-05 22:18:28 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 22:18:28 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 22:18:28 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 22:18:28 - Transacción completada con éxito para Venta ID: 82 2025-11-05 22:18:28 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 22:18:28 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 22:28:58 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 22:28:58 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 22:28:58 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"77.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 22:28:58 - Content-Type: application/json 2025-11-05 22:28:58 - Resultado de json_decode: OK 2025-11-05 22:28:58 - ID sesión de caja recibido en JSON: 19 2025-11-05 22:28:58 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 22:28:58 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 22:28:58 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 22:28:58 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 22:28:58 - Modo API DTE está INACTIVO según configuración. 2025-11-05 22:28:58 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 22:28:58 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 22:28:58 - Venta insertada con ID: 83 2025-11-05 22:28:58 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 22:28:58 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 83) 2025-11-05 22:28:58 - Token de vista generado: 0540beffdcb1f6399df874d34eae4314 2025-11-05 22:28:58 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 22:28:58 - Número de venta real para negocio 78.216.219-5: 24 2025-11-05 22:28:58 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 22:28:58 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 22:28:58 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 22:28:58 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 22:28:58 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:28:58 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:28:58 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 22:28:58 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 22:28:58 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:28:58 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:28:58 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:28:58 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:28:58 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 22:28:58 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:28:58 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 22:28:58 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:28:58 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 22:28:58 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 22:28:58 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 22:28:58 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"77.00","fecha_vencimiento":null}]} 2025-11-05 22:28:58 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 22:28:58 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 22:28:58 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 22:28:58 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 22:28:58 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 22:28:58 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 22:28:58 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 22:28:58 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 22:28:58 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 22:28:58 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 22:28:58 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 83 2025-11-05 22:28:58 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 22:28:58 - [MOVIMIENTO MASIVO] Stock actual: 76.00, Cantidad vendida: 1 2025-11-05 22:28:58 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 22:28:58 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 22:28:58 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 22:28:58 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 22:28:58 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 22:28:58 - Detalles de venta insertados y stock actualizado. 2025-11-05 22:28:58 - No se intentó la emisión DTE para Venta ID: 83 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 22:28:58 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 83 2025-11-05 22:28:58 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 22:28:58 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 22:28:58 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 22:28:58 - Transacción completada con éxito para Venta ID: 83 2025-11-05 22:28:58 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 22:28:58 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-05 22:29:04 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-05 22:29:04 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-05 22:29:04 - Datos recibidos: {"productos":[{"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"76.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-05 22:29:04 - Content-Type: application/json 2025-11-05 22:29:04 - Resultado de json_decode: OK 2025-11-05 22:29:04 - ID sesión de caja recibido en JSON: 19 2025-11-05 22:29:04 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-05 22:29:04 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-05 22:29:04 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-05 22:29:04 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-05 22:29:04 - Modo API DTE está INACTIVO según configuración. 2025-11-05 22:29:04 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-05 22:29:04 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-05 22:29:04 - Venta insertada con ID: 84 2025-11-05 22:29:04 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-05 22:29:04 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 84) 2025-11-05 22:29:04 - Token de vista generado: 7fc19e43d69ebac52f7afd90cb57b209 2025-11-05 22:29:04 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-05 22:29:04 - Número de venta real para negocio 78.216.219-5: 25 2025-11-05 22:29:04 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-05 22:29:04 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-05 22:29:04 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-05 22:29:04 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-05 22:29:04 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:29:04 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-05 22:29:04 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-05 22:29:04 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-05 22:29:04 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:29:04 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:29:04 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:29:04 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:29:04 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-05 22:29:04 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-05 22:29:04 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-05 22:29:04 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-05 22:29:04 - --- Iniciando procesamiento para Prod0_ID102 --- 2025-11-05 22:29:04 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID102] Params: {"pid":102} 2025-11-05 22:29:04 - [Stock Check] Producto ID: 102, Tipo Código: masivo, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-05 22:29:04 - [DEBUG PRODUCTO][Prod0_ID102] Datos recibidos: {"id":102,"codigo":"17623687193955","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":false,"tipo_codigo":"masivo","codigos_disponibles":[{"id":118,"codigo":"17623687193955","tipo_codigo":"masivo","cantidad":"76.00","fecha_vencimiento":null}]} 2025-11-05 22:29:04 - [LOTE MASIVO][Prod0_ID102] No actualizando codigos_barras aquí - se manejará por triggers 2025-11-05 22:29:04 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID102] Params: cantidad=1, peso=, lote_id=118 2025-11-05 22:29:04 - [Stock Process][Prod0_ID102] Procesando stock con cantidad: 1 2025-11-05 22:29:04 - [Stock Masivo][Prod0_ID102] Aplicando lógica de UPDATE. 2025-11-05 22:29:04 - [DB EXECUTE][ID: CheckMasivoLoop_Prod0_ID102] Params: {"pid":"102"} 2025-11-05 22:29:04 - [Stock Masivo][Prod0_ID102] Producto masivo - código de barras principal: 118, numero_lote: 2025-11-05 22:29:04 - [DB EXECUTE][ID: UpdateMasivoLoop_Prod0_ID102] Params: {"cant":"1","id":118} 2025-11-05 22:29:04 - [Stock Masivo][Prod0_ID102] Stock actualizado para ID: 118. Descontado: 1. 2025-11-05 22:29:04 - [Stock Strategy NORMAL][Prod0_ID102] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-05 22:29:04 - [Stock Update NORMAL][Prod0_ID102] codigos_barras ya actualizado en sección anterior 2025-11-05 22:29:04 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 102, Cantidad: 1, Venta ID: 84 2025-11-05 22:29:04 - [Movimiento Stock] Registrando movimiento para Producto ID: 102, Cantidad: 1 2025-11-05 22:29:04 - [MOVIMIENTO MASIVO] Stock actual: 75.00, Cantidad vendida: 1 2025-11-05 22:29:04 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 102 2025-11-05 22:29:04 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-05 22:29:04 - [Stock Strategy NORMAL][Prod0_ID102] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-05 22:29:04 - [DTE Detalle][Prod0_ID102] Agregado a venta_detalles_para_api con formato original 2025-11-05 22:29:04 - --- Fin procesamiento para Prod0_ID102 --- 2025-11-05 22:29:04 - Detalles de venta insertados y stock actualizado. 2025-11-05 22:29:04 - No se intentó la emisión DTE para Venta ID: 84 (Modo API inactivo o condiciones no cumplidas). 2025-11-05 22:29:04 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 84 2025-11-05 22:29:04 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-05 22:29:04 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-05 22:29:04 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-05 22:29:04 - Transacción completada con éxito para Venta ID: 84 2025-11-05 22:29:04 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-05 22:29:04 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-06 12:45:15 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-06 12:45:15 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-06 12:45:15 - Datos recibidos: {"productos":[{"id":97,"codigo":"17623602264760","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":113,"codigo":"17623602264760","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":2101,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"19"} 2025-11-06 12:45:15 - Content-Type: application/json 2025-11-06 12:45:15 - Resultado de json_decode: OK 2025-11-06 12:45:15 - ID sesión de caja recibido en JSON: 19 2025-11-06 12:45:15 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-06 12:45:15 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-06 12:45:15 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-06 12:45:15 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-06 12:45:15 - Modo API DTE está INACTIVO según configuración. 2025-11-06 12:45:15 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-06 12:45:15 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=19) 2025-11-06 12:45:15 - Venta insertada con ID: 85 2025-11-06 12:45:15 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-06 12:45:15 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 85) 2025-11-06 12:45:15 - Token de vista generado: 1033c5bf3dcb5110d13ba1e33e3c950b 2025-11-06 12:45:15 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-06 12:45:15 - Número de venta real para negocio 78.216.219-5: 26 2025-11-06 12:45:15 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-06 12:45:15 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-06 12:45:15 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-06 12:45:15 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-06 12:45:15 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-06 12:45:15 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-06 12:45:15 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-06 12:45:15 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-06 12:45:15 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-06 12:45:15 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-06 12:45:15 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-06 12:45:15 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-06 12:45:15 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-06 12:45:15 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-06 12:45:15 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-06 12:45:15 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-06 12:45:15 - --- Iniciando procesamiento para Prod0_ID97 --- 2025-11-06 12:45:15 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID97] Params: {"pid":97} 2025-11-06 12:45:15 - [Stock Check] Producto ID: 97, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-06 12:45:15 - [DEBUG PRODUCTO][Prod0_ID97] Datos recibidos: {"id":97,"codigo":"17623602264760","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":113,"codigo":"17623602264760","tipo_codigo":"manual","cantidad":"100.00","fecha_vencimiento":null}]} 2025-11-06 12:45:15 - [LOTE AUTO-DETECTADO][Prod0_ID97] Código escaneado 17623602264760 pertenece al LOTE1 (ID: 113) 2025-11-06 12:45:15 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID97] Params: cantidad=1, peso=, lote_id=113 2025-11-06 12:45:15 - [Stock Process][Prod0_ID97] Procesando stock con cantidad: 1 2025-11-06 12:45:15 - [Stock manual][Prod0_ID97] Aplicando lógica basada en cantidad. 2025-11-06 12:45:15 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID97] Params: {"pid":"97","codigo":"17623602264760"} 2025-11-06 12:45:15 - [Stock Manual][Prod0_ID97] Producto manual - código de barras específico: 113, numero_lote: LOTE1 2025-11-06 12:45:15 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID97_Esc] Params: {"cant":"1","id":113} 2025-11-06 12:45:15 - [Stock manual][Prod0_ID97] Actualizado código escaneado ID: 113. Descontado: 1 2025-11-06 12:45:15 - [Stock Strategy NORMAL][Prod0_ID97] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-06 12:45:15 - [Stock Update NORMAL][Prod0_ID97] codigos_barras ya actualizado en sección anterior 2025-11-06 12:45:15 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 97, Cantidad: 1, Venta ID: 85 2025-11-06 12:45:15 - [Movimiento Stock] Registrando movimiento para Producto ID: 97, Cantidad: 1 2025-11-06 12:45:15 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 97 2025-11-06 12:45:15 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-06 12:45:15 - [Stock Strategy NORMAL][Prod0_ID97] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-06 12:45:15 - [DTE Detalle][Prod0_ID97] Agregado a venta_detalles_para_api con formato original 2025-11-06 12:45:15 - --- Fin procesamiento para Prod0_ID97 --- 2025-11-06 12:45:15 - Detalles de venta insertados y stock actualizado. 2025-11-06 12:45:15 - No se intentó la emisión DTE para Venta ID: 85 (Modo API inactivo o condiciones no cumplidas). 2025-11-06 12:45:15 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 85 2025-11-06 12:45:15 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-06 12:45:15 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-06 12:45:15 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-06 12:45:15 - Transacción completada con éxito para Venta ID: 85 2025-11-06 12:45:15 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-06 12:45:15 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-12 00:04:09 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-12 00:04:09 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-12 00:04:09 - Datos recibidos: 2025-11-12 00:04:09 - Content-Type: No especificado 2025-11-12 00:04:09 - Error: No autorizado 2025-11-14 16:24:32 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-14 16:24:32 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-14 16:24:32 - Datos recibidos: {"productos":[{"id":413,"codigo":"17631482377690","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":true}],"metodo_pago":"2","total":2000,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"21"} 2025-11-14 16:24:32 - Content-Type: application/json 2025-11-14 16:24:32 - Resultado de json_decode: OK 2025-11-14 16:24:32 - ID sesión de caja recibido en JSON: 21 2025-11-14 16:24:32 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-14 16:24:32 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-14 16:24:32 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-14 16:24:32 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-14 16:24:32 - Modo API DTE está INACTIVO según configuración. 2025-11-14 16:24:32 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-14 16:24:32 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=21) 2025-11-14 16:24:32 - Venta insertada con ID: 86 2025-11-14 16:24:32 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-14 16:24:32 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 86) 2025-11-14 16:24:32 - Token de vista generado: 9ec12f122e17fd3e6261920f88ea974f 2025-11-14 16:24:32 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-14 16:24:32 - Número de venta real para negocio 78.216.219-5: 1 2025-11-14 16:24:32 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-14 16:24:32 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-14 16:24:32 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-14 16:24:32 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-14 16:24:32 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-14 16:24:32 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-14 16:24:32 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-14 16:24:32 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-14 16:24:32 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-14 16:24:32 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-14 16:24:32 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-14 16:24:32 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-14 16:24:32 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-14 16:24:32 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-14 16:24:32 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-14 16:24:32 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-14 16:24:32 - --- Iniciando procesamiento para Prod0_ID413 --- 2025-11-14 16:24:32 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID413] Params: {"pid":413} 2025-11-14 16:24:32 - [Stock Check] Producto ID: 413, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-14 16:24:32 - [DEBUG PRODUCTO][Prod0_ID413] Datos recibidos: {"id":413,"codigo":"17631482377690","cantidad":1,"precio":2380,"subtotal":2000,"es_busqueda_por_codigo":true} 2025-11-14 16:24:32 - [LOTE AUTO-DETECTADO][Prod0_ID413] Código escaneado 17631482377690 pertenece al LOTE1 (ID: 330) 2025-11-14 16:24:32 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID413] Params: cantidad=1, peso=, lote_id=330 2025-11-14 16:24:32 - [Stock Process][Prod0_ID413] Procesando stock con cantidad: 1 2025-11-14 16:24:32 - [Stock manual][Prod0_ID413] Aplicando lógica basada en cantidad. 2025-11-14 16:24:32 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID413] Params: {"pid":"413","codigo":"17631482377690"} 2025-11-14 16:24:32 - [Stock Manual][Prod0_ID413] Producto manual - código de barras específico: 330, numero_lote: LOTE1 2025-11-14 16:24:32 - [LOTE AGOTADO][Prod0_ID413] Guardando código específico: 17631482377690 antes de eliminar lote 2025-11-14 16:24:32 - [DB EXECUTE][ID: DeleteCodeManualLoop_Prod0_ID413_Esc] Params: {"id":330} 2025-11-14 16:24:32 - [Stock manual][Prod0_ID413] Eliminado código escaneado ID: 330 (Cantidad: 1.00) 2025-11-14 16:24:32 - [Stock manual][Prod0_ID413] No hay más lotes disponibles para este producto 2025-11-14 16:24:32 - [Stock Strategy NORMAL][Prod0_ID413] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-14 16:24:32 - [Stock Update NORMAL][Prod0_ID413] codigos_barras ya actualizado en sección anterior 2025-11-14 16:24:32 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 413, Cantidad: 1, Venta ID: 86 2025-11-14 16:24:32 - [Movimiento Stock] Registrando movimiento para Producto ID: 413, Cantidad: 1 2025-11-14 16:24:32 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 413 2025-11-14 16:24:32 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-14 16:24:32 - [Stock Strategy NORMAL][Prod0_ID413] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-14 16:24:32 - [DTE Detalle][Prod0_ID413] Agregado a venta_detalles_para_api con formato original 2025-11-14 16:24:32 - --- Fin procesamiento para Prod0_ID413 --- 2025-11-14 16:24:32 - Detalles de venta insertados y stock actualizado. 2025-11-14 16:24:32 - No se intentó la emisión DTE para Venta ID: 86 (Modo API inactivo o condiciones no cumplidas). 2025-11-14 16:24:32 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 86 2025-11-14 16:24:32 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-14 16:24:32 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-14 16:24:32 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-14 16:24:32 - Transacción completada con éxito para Venta ID: 86 2025-11-14 16:24:32 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-14 16:24:32 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-18 20:21:52 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-18 20:21:52 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-18 20:21:52 - Datos recibidos: {"productos":[{"id":446,"codigo":"17632604128051","cantidad":1,"precio":24,"subtotal":20,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":357,"codigo":"17632604128051","tipo_codigo":"manual","cantidad":"10.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":20,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"24"} 2025-11-18 20:21:52 - Content-Type: application/json 2025-11-18 20:21:52 - Resultado de json_decode: OK 2025-11-18 20:21:52 - ID sesión de caja recibido en JSON: 24 2025-11-18 20:21:52 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-18 20:21:52 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-18 20:21:52 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-18 20:21:52 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-18 20:21:52 - Modo API DTE está INACTIVO según configuración. 2025-11-18 20:21:52 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-18 20:21:52 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=24) 2025-11-18 20:21:52 - Venta insertada con ID: 87 2025-11-18 20:21:52 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-18 20:21:52 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 87) 2025-11-18 20:21:52 - Token de vista generado: d38d83db684ac22bf0ae210d9d844fd9 2025-11-18 20:21:52 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-18 20:21:52 - Número de venta real para negocio 78.216.219-5: 2 2025-11-18 20:21:52 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-18 20:21:52 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-18 20:21:52 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-18 20:21:52 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-18 20:21:52 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-18 20:21:52 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-18 20:21:52 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-18 20:21:52 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-18 20:21:52 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-18 20:21:52 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-18 20:21:52 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-18 20:21:52 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-18 20:21:52 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-18 20:21:52 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-18 20:21:52 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-18 20:21:52 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-18 20:21:52 - --- Iniciando procesamiento para Prod0_ID446 --- 2025-11-18 20:21:52 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID446] Params: {"pid":446} 2025-11-18 20:21:52 - [Stock Check] Producto ID: 446, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-18 20:21:52 - [DEBUG PRODUCTO][Prod0_ID446] Datos recibidos: {"id":446,"codigo":"17632604128051","cantidad":1,"precio":24,"subtotal":20,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":357,"codigo":"17632604128051","tipo_codigo":"manual","cantidad":"10.00","fecha_vencimiento":null}]} 2025-11-18 20:21:52 - [LOTE AUTO-DETECTADO][Prod0_ID446] Código escaneado 17632604128051 pertenece al LOTE1 (ID: 357) 2025-11-18 20:21:52 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID446] Params: cantidad=1, peso=, lote_id=357 2025-11-18 20:21:52 - [Stock Process][Prod0_ID446] Procesando stock con cantidad: 1 2025-11-18 20:21:52 - [Stock manual][Prod0_ID446] Aplicando lógica basada en cantidad. 2025-11-18 20:21:52 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID446] Params: {"pid":"446","codigo":"17632604128051"} 2025-11-18 20:21:52 - [Stock Manual][Prod0_ID446] Producto manual - código de barras específico: 357, numero_lote: LOTE1 2025-11-18 20:21:52 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID446_Esc] Params: {"cant":"1","id":357} 2025-11-18 20:21:52 - [Stock manual][Prod0_ID446] Actualizado código escaneado ID: 357. Descontado: 1 2025-11-18 20:21:52 - [Stock Strategy NORMAL][Prod0_ID446] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-18 20:21:52 - [Stock Update NORMAL][Prod0_ID446] codigos_barras ya actualizado en sección anterior 2025-11-18 20:21:52 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 446, Cantidad: 1, Venta ID: 87 2025-11-18 20:21:52 - [Movimiento Stock] Registrando movimiento para Producto ID: 446, Cantidad: 1 2025-11-18 20:21:52 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 446 2025-11-18 20:21:52 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-18 20:21:52 - [Stock Strategy NORMAL][Prod0_ID446] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-18 20:21:52 - [DTE Detalle][Prod0_ID446] Agregado a venta_detalles_para_api con formato original 2025-11-18 20:21:52 - --- Fin procesamiento para Prod0_ID446 --- 2025-11-18 20:21:52 - Detalles de venta insertados y stock actualizado. 2025-11-18 20:21:52 - No se intentó la emisión DTE para Venta ID: 87 (Modo API inactivo o condiciones no cumplidas). 2025-11-18 20:21:52 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 87 2025-11-18 20:21:52 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-18 20:21:52 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-18 20:21:52 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-18 20:21:52 - Transacción completada con éxito para Venta ID: 87 2025-11-18 20:21:52 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-18 20:21:52 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-18 20:23:09 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-18 20:23:09 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-18 20:23:09 - Datos recibidos: {"productos":[{"id":446,"codigo":"17632604128051","cantidad":1,"precio":24,"subtotal":20,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":357,"codigo":"17632604128051","tipo_codigo":"manual","cantidad":"9.00","fecha_vencimiento":null}]}],"metodo_pago":"2","total":20,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"24"} 2025-11-18 20:23:09 - Content-Type: application/json 2025-11-18 20:23:09 - Resultado de json_decode: OK 2025-11-18 20:23:09 - ID sesión de caja recibido en JSON: 24 2025-11-18 20:23:09 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-18 20:23:09 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-18 20:23:09 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-18 20:23:09 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-18 20:23:09 - Modo API DTE está INACTIVO según configuración. 2025-11-18 20:23:09 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-18 20:23:09 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=24) 2025-11-18 20:23:09 - Venta insertada con ID: 88 2025-11-18 20:23:09 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-18 20:23:09 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 88) 2025-11-18 20:23:09 - Token de vista generado: 5e4e92b76f90f5292b9c660e51309fe2 2025-11-18 20:23:09 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-18 20:23:09 - Número de venta real para negocio 78.216.219-5: 3 2025-11-18 20:23:09 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-18 20:23:09 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-18 20:23:09 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-18 20:23:09 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-18 20:23:09 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-18 20:23:09 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-18 20:23:09 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-18 20:23:09 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-18 20:23:09 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-18 20:23:09 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-18 20:23:09 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-18 20:23:09 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-18 20:23:09 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-18 20:23:09 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-18 20:23:09 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-18 20:23:09 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-18 20:23:09 - --- Iniciando procesamiento para Prod0_ID446 --- 2025-11-18 20:23:09 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID446] Params: {"pid":446} 2025-11-18 20:23:09 - [Stock Check] Producto ID: 446, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-18 20:23:09 - [DEBUG PRODUCTO][Prod0_ID446] Datos recibidos: {"id":446,"codigo":"17632604128051","cantidad":1,"precio":24,"subtotal":20,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":357,"codigo":"17632604128051","tipo_codigo":"manual","cantidad":"9.00","fecha_vencimiento":null}]} 2025-11-18 20:23:09 - [LOTE AUTO-DETECTADO][Prod0_ID446] Código escaneado 17632604128051 pertenece al LOTE1 (ID: 357) 2025-11-18 20:23:09 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID446] Params: cantidad=1, peso=, lote_id=357 2025-11-18 20:23:09 - [Stock Process][Prod0_ID446] Procesando stock con cantidad: 1 2025-11-18 20:23:09 - [Stock manual][Prod0_ID446] Aplicando lógica basada en cantidad. 2025-11-18 20:23:09 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID446] Params: {"pid":"446","codigo":"17632604128051"} 2025-11-18 20:23:09 - [Stock Manual][Prod0_ID446] Producto manual - código de barras específico: 357, numero_lote: LOTE1 2025-11-18 20:23:09 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID446_Esc] Params: {"cant":"1","id":357} 2025-11-18 20:23:09 - [Stock manual][Prod0_ID446] Actualizado código escaneado ID: 357. Descontado: 1 2025-11-18 20:23:09 - [Stock Strategy NORMAL][Prod0_ID446] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-18 20:23:09 - [Stock Update NORMAL][Prod0_ID446] codigos_barras ya actualizado en sección anterior 2025-11-18 20:23:09 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 446, Cantidad: 1, Venta ID: 88 2025-11-18 20:23:09 - [Movimiento Stock] Registrando movimiento para Producto ID: 446, Cantidad: 1 2025-11-18 20:23:09 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 446 2025-11-18 20:23:09 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-18 20:23:09 - [Stock Strategy NORMAL][Prod0_ID446] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-18 20:23:09 - [DTE Detalle][Prod0_ID446] Agregado a venta_detalles_para_api con formato original 2025-11-18 20:23:09 - --- Fin procesamiento para Prod0_ID446 --- 2025-11-18 20:23:09 - Detalles de venta insertados y stock actualizado. 2025-11-18 20:23:09 - No se intentó la emisión DTE para Venta ID: 88 (Modo API inactivo o condiciones no cumplidas). 2025-11-18 20:23:09 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 88 2025-11-18 20:23:09 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-18 20:23:09 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-18 20:23:09 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-18 20:23:09 - Transacción completada con éxito para Venta ID: 88 2025-11-18 20:23:09 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-18 20:23:09 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2025-11-18 20:28:12 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2025-11-18 20:28:12 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2025-11-18 20:28:12 - Datos recibidos: {"productos":[{"id":446,"codigo":"17632604128051","cantidad":1,"precio":24,"subtotal":20,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":357,"codigo":"17632604128051","tipo_codigo":"manual","cantidad":"8.00","fecha_vencimiento":null}]}],"metodo_pago":"1","total":20,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"24"} 2025-11-18 20:28:12 - Content-Type: application/json 2025-11-18 20:28:12 - Resultado de json_decode: OK 2025-11-18 20:28:12 - ID sesión de caja recibido en JSON: 24 2025-11-18 20:28:12 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2025-11-18 20:28:12 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2025-11-18 20:28:12 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2025-11-18 20:28:12 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2025-11-18 20:28:12 - Modo API DTE está INACTIVO según configuración. 2025-11-18 20:28:12 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2025-11-18 20:28:12 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=24) 2025-11-18 20:28:12 - Venta insertada con ID: 1 2025-11-18 20:28:12 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2025-11-18 20:28:12 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 1) 2025-11-18 20:28:12 - Token de vista generado: 90328a663764bc4a503be6c6ab593741 2025-11-18 20:28:12 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2025-11-18 20:28:12 - Número de venta real para negocio 78.216.219-5: 1 2025-11-18 20:28:12 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2025-11-18 20:28:12 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2025-11-18 20:28:12 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2025-11-18 20:28:12 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2025-11-18 20:28:12 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-18 20:28:12 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2025-11-18 20:28:12 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2025-11-18 20:28:12 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2025-11-18 20:28:12 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-18 20:28:12 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-18 20:28:12 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-18 20:28:12 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-18 20:28:12 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2025-11-18 20:28:12 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2025-11-18 20:28:12 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2025-11-18 20:28:12 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2025-11-18 20:28:12 - --- Iniciando procesamiento para Prod0_ID446 --- 2025-11-18 20:28:12 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID446] Params: {"pid":446} 2025-11-18 20:28:12 - [Stock Check] Producto ID: 446, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2025-11-18 20:28:12 - [DEBUG PRODUCTO][Prod0_ID446] Datos recibidos: {"id":446,"codigo":"17632604128051","cantidad":1,"precio":24,"subtotal":20,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":357,"codigo":"17632604128051","tipo_codigo":"manual","cantidad":"8.00","fecha_vencimiento":null}]} 2025-11-18 20:28:12 - [LOTE AUTO-DETECTADO][Prod0_ID446] Código escaneado 17632604128051 pertenece al LOTE1 (ID: 357) 2025-11-18 20:28:12 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID446] Params: cantidad=1, peso=, lote_id=357 2025-11-18 20:28:12 - [Stock Process][Prod0_ID446] Procesando stock con cantidad: 1 2025-11-18 20:28:12 - [Stock manual][Prod0_ID446] Aplicando lógica basada en cantidad. 2025-11-18 20:28:12 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID446] Params: {"pid":"446","codigo":"17632604128051"} 2025-11-18 20:28:12 - [Stock Manual][Prod0_ID446] Producto manual - código de barras específico: 357, numero_lote: LOTE1 2025-11-18 20:28:12 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID446_Esc] Params: {"cant":"1","id":357} 2025-11-18 20:28:12 - [Stock manual][Prod0_ID446] Actualizado código escaneado ID: 357. Descontado: 1 2025-11-18 20:28:12 - [Stock Strategy NORMAL][Prod0_ID446] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2025-11-18 20:28:12 - [Stock Update NORMAL][Prod0_ID446] codigos_barras ya actualizado en sección anterior 2025-11-18 20:28:12 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 446, Cantidad: 1, Venta ID: 1 2025-11-18 20:28:12 - [Movimiento Stock] Registrando movimiento para Producto ID: 446, Cantidad: 1 2025-11-18 20:28:12 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 446 2025-11-18 20:28:12 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2025-11-18 20:28:12 - [Stock Strategy NORMAL][Prod0_ID446] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2025-11-18 20:28:12 - [DTE Detalle][Prod0_ID446] Agregado a venta_detalles_para_api con formato original 2025-11-18 20:28:12 - --- Fin procesamiento para Prod0_ID446 --- 2025-11-18 20:28:12 - Detalles de venta insertados y stock actualizado. 2025-11-18 20:28:12 - No se intentó la emisión DTE para Venta ID: 1 (Modo API inactivo o condiciones no cumplidas). 2025-11-18 20:28:12 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 1 2025-11-18 20:28:12 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2025-11-18 20:28:12 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2025-11-18 20:28:12 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2025-11-18 20:28:12 - Transacción completada con éxito para Venta ID: 1 2025-11-18 20:28:12 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2025-11-18 20:28:12 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2026-03-17 12:09:25 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2026-03-17 12:09:25 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2026-03-17 12:09:25 - Datos recibidos: {"productos":[{"id":9,"codigo":"17682764263746","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":9,"codigo":"17682764263746","tipo_codigo":"manual","cantidad":"10.00","fecha_vencimiento":null}]}],"metodo_pago":"3","total":2101,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"3"} 2026-03-17 12:09:25 - Content-Type: application/json 2026-03-17 12:09:25 - Resultado de json_decode: OK 2026-03-17 12:09:25 - ID sesión de caja recibido en JSON: 3 2026-03-17 12:09:25 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2026-03-17 12:09:25 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2026-03-17 12:09:25 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2026-03-17 12:09:25 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2026-03-17 12:09:25 - Modo API DTE está INACTIVO según configuración. 2026-03-17 12:09:25 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2026-03-17 12:09:25 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=3) 2026-03-17 12:09:25 - Venta insertada con ID: 7 2026-03-17 12:09:25 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2026-03-17 12:09:25 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 7) 2026-03-17 12:09:25 - Token de vista generado: 7223e84e27a31a456106ed2cae74239c 2026-03-17 12:09:25 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2026-03-17 12:09:25 - Número de venta real para negocio 78.216.219-5: 7 2026-03-17 12:09:25 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2026-03-17 12:09:25 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2026-03-17 12:09:25 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2026-03-17 12:09:25 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2026-03-17 12:09:25 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2026-03-17 12:09:25 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2026-03-17 12:09:25 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2026-03-17 12:09:25 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2026-03-17 12:09:25 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2026-03-17 12:09:25 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2026-03-17 12:09:25 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2026-03-17 12:09:25 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2026-03-17 12:09:25 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2026-03-17 12:09:25 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2026-03-17 12:09:25 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2026-03-17 12:09:25 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2026-03-17 12:09:25 - --- Iniciando procesamiento para Prod0_ID9 --- 2026-03-17 12:09:25 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID9] Params: {"pid":9} 2026-03-17 12:09:25 - [Stock Check] Producto ID: 9, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2026-03-17 12:09:25 - [DEBUG PRODUCTO][Prod0_ID9] Datos recibidos: {"id":9,"codigo":"17682764263746","cantidad":1,"precio":2500,"subtotal":2101,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":9,"codigo":"17682764263746","tipo_codigo":"manual","cantidad":"10.00","fecha_vencimiento":null}]} 2026-03-17 12:09:25 - [LOTE AUTO-DETECTADO][Prod0_ID9] Código escaneado 17682764263746 pertenece al LOTE1 (ID: 9) 2026-03-17 12:09:25 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID9] Params: cantidad=1, peso=, lote_id=9 2026-03-17 12:09:25 - [Stock Process][Prod0_ID9] Procesando stock con cantidad: 1 2026-03-17 12:09:25 - [Stock manual][Prod0_ID9] Aplicando lógica basada en cantidad. 2026-03-17 12:09:25 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID9] Params: {"pid":"9","codigo":"17682764263746"} 2026-03-17 12:09:25 - [Stock Manual][Prod0_ID9] Producto manual - código de barras específico: 9, numero_lote: LOTE1 2026-03-17 12:09:25 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID9_Esc] Params: {"cant":"1","id":9} 2026-03-17 12:09:25 - [Stock manual][Prod0_ID9] Actualizado código escaneado ID: 9. Descontado: 1 2026-03-17 12:09:25 - [Stock Strategy NORMAL][Prod0_ID9] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 1 2026-03-17 12:09:25 - [Stock Update NORMAL][Prod0_ID9] codigos_barras ya actualizado en sección anterior 2026-03-17 12:09:25 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 9, Cantidad: 1, Venta ID: 7 2026-03-17 12:09:25 - [Movimiento Stock] Registrando movimiento para Producto ID: 9, Cantidad: 1 2026-03-17 12:09:25 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 9 2026-03-17 12:09:25 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2026-03-17 12:09:25 - [Stock Strategy NORMAL][Prod0_ID9] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2026-03-17 12:09:25 - [DTE Detalle][Prod0_ID9] Agregado a venta_detalles_para_api con formato original 2026-03-17 12:09:25 - --- Fin procesamiento para Prod0_ID9 --- 2026-03-17 12:09:25 - Detalles de venta insertados y stock actualizado. 2026-03-17 12:09:25 - No se intentó la emisión DTE para Venta ID: 7 (Modo API inactivo o condiciones no cumplidas). 2026-03-17 12:09:25 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 7 2026-03-17 12:09:25 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2026-03-17 12:09:25 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2026-03-17 12:09:25 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2026-03-17 12:09:25 - Transacción completada con éxito para Venta ID: 7 2026-03-17 12:09:25 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2026-03-17 12:09:25 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2026-03-17 14:06:32 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2026-03-17 14:06:32 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2026-03-17 14:06:32 - Datos recibidos: {"productos":[{"id":10,"codigo":"17737621147948","cantidad":15,"precio":250,"subtotal":3750,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":10,"codigo":"17737621147948","tipo_codigo":"manual","cantidad":"180.00","fecha_vencimiento":null}]}],"metodo_pago":"3","total":3151,"tipo_documento":"boleta","cliente_rut":"","cliente_nombre":"","id_sesion_caja":"3"} 2026-03-17 14:06:32 - Content-Type: application/json 2026-03-17 14:06:32 - Resultado de json_decode: OK 2026-03-17 14:06:32 - ID sesión de caja recibido en JSON: 3 2026-03-17 14:06:32 - [DB PREPARE][ID: ConfigDTE] SQL: SELECT * FROM config_boletas_electronicas WHERE negocio_rut = ? 2026-03-17 14:06:32 - [DB EXECUTE][ID: ConfigDTE] Params: ["78.216.219-5"] 2026-03-17 14:06:32 - [DB PREPARE][ID: DatosNegocio] SQL: SELECT n.razon_social, n.giro, n.direccion, c.nombre as comuna_nombre FROM negocios n LEFT JOIN comunas c ON n.comuna_id = c.id WHERE n.rut = ? 2026-03-17 14:06:32 - [DB EXECUTE][ID: DatosNegocio] Params: ["78.216.219-5"] 2026-03-17 14:06:32 - Modo API DTE está INACTIVO según configuración. 2026-03-17 14:06:32 - [DB PREPARE][ID: VentaInsert] SQL: INSERT INTO ventas (negocio_rut, cliente_rut, cliente_nombre, monto_neto, total, metodo_pago, fecha_venta, tiene_boleta_electronica, folio_documento, monto_iva, id_sesion_caja) VALUES (:negocio_rut, :cliente_rut, :cliente_nombre, :monto_neto, :total, :metodo_pago, NOW(), 0, NULL, :monto_iva, :id_sesion_caja) 2026-03-17 14:06:32 - [DB EXECUTE][ID: VentaInsert] Params: (Bound manually, id_sesion_caja=3) 2026-03-17 14:06:32 - Venta insertada con ID: 8 2026-03-17 14:06:32 - [DB PREPARE][ID: TokenUpdate] SQL: UPDATE ventas SET view_token = :token, token_created_at = CURRENT_TIMESTAMP WHERE id = :venta_id 2026-03-17 14:06:32 - [DB EXECUTE][ID: TokenUpdate] Params: (Token generado para venta ID: 8) 2026-03-17 14:06:32 - Token de vista generado: f195f320bbd0bd3b6e8d88d30d3d3ab4 2026-03-17 14:06:32 - [DB PREPARE][ID: NumeroVenta] SQL: SELECT COUNT(*) as numero_venta FROM ventas WHERE negocio_rut = :negocio_rut AND id <= :venta_id 2026-03-17 14:06:32 - Número de venta real para negocio 78.216.219-5: 8 2026-03-17 14:06:32 - [DB PREPARE][ID: DetalleInsertLoop] SQL: INSERT INTO detalle_ventas (venta_id, producto_id, cantidad, precio_unitario, subtotal, peso, lote_id, codigo_barras_id, lote_agotado, codigo_especifico) VALUES (:venta_id, :producto_id, :cantidad, :precio_unitario, :subtotal, :peso, :lote_id, :codigo_barras_id, :lote_agotado, :codigo_especifico) 2026-03-17 14:06:32 - [DB PREPARE][ID: StockUpdateLoop] SQL: UPDATE productos SET stock = stock - :cantidad WHERE id = :producto_id AND negocio_rut = :negocio_rut 2026-03-17 14:06:32 - [DB PREPARE][ID: TipoProdLoop] SQL: SELECT tipo_codigo FROM productos WHERE id = :pid 2026-03-17 14:06:32 - [DB PREPARE][ID: LoteDisponibleLoop] SQL: SELECT id, cantidad FROM lotes WHERE producto_id = :producto_id AND estado = 'activo' AND cantidad > 0 ORDER BY fecha_entrada ASC LIMIT 1 2026-03-17 14:06:32 - [DB PREPARE][ID: LoteDisponibleNormalLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2026-03-17 14:06:32 - [DB PREPARE][ID: SiguienteLoteLoop] SQL: SELECT id, cantidad, numero_lote FROM codigos_barras WHERE producto_id = :producto_id AND numero_lote IS NOT NULL AND cantidad > 0 ORDER BY id ASC LIMIT 1 2026-03-17 14:06:32 - [DB PREPARE][ID: UpdateLoteLoop] SQL: UPDATE lotes SET cantidad = cantidad - :cantidad WHERE id = :lote_id 2026-03-17 14:06:32 - [DB PREPARE][ID: FindCodeManualLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo AND cantidad > 0 2026-03-17 14:06:32 - [DB PREPARE][ID: DeleteCodeManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2026-03-17 14:06:32 - [DB PREPARE][ID: UpdateCodeManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2026-03-17 14:06:32 - [DB PREPARE][ID: DeleteOtroManualLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2026-03-17 14:06:32 - [DB PREPARE][ID: UpdateOtroManualLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2026-03-17 14:06:32 - [DB PREPARE][ID: CheckMasivoLoop] SQL: SELECT id, cantidad FROM codigos_barras WHERE producto_id = :pid LIMIT 1 2026-03-17 14:06:32 - [DB PREPARE][ID: UpdateMasivoLoop] SQL: UPDATE codigos_barras SET cantidad = cantidad - :cant WHERE id = :id 2026-03-17 14:06:32 - [DB PREPARE][ID: CheckDifLoop] SQL: SELECT id, es_principal FROM codigos_barras WHERE producto_id = :pid AND codigo = :codigo LIMIT 1 2026-03-17 14:06:32 - [DB PREPARE][ID: DeleteDifLoop] SQL: DELETE FROM codigos_barras WHERE id = :id 2026-03-17 14:06:32 - --- Iniciando procesamiento para Prod0_ID10 --- 2026-03-17 14:06:32 - [DB EXECUTE][ID: TipoProdLoop_Prod0_ID10] Params: {"pid":10} 2026-03-17 14:06:32 - [Stock Check] Producto ID: 10, Tipo Código: manual, Modo Venta: UNIDAD, Controla Stock: SI 2026-03-17 14:06:32 - [DEBUG PRODUCTO][Prod0_ID10] Datos recibidos: {"id":10,"codigo":"17737621147948","cantidad":15,"precio":250,"subtotal":3750,"es_busqueda_por_codigo":false,"tipo_codigo":"manual","codigos_disponibles":[{"id":10,"codigo":"17737621147948","tipo_codigo":"manual","cantidad":"180.00","fecha_vencimiento":null}]} 2026-03-17 14:06:32 - [LOTE AUTO-DETECTADO][Prod0_ID10] Código escaneado 17737621147948 pertenece al LOTE1 (ID: 10) 2026-03-17 14:06:32 - [DB EXECUTE][ID: DetalleInsertLoop_Prod0_ID10] Params: cantidad=15, peso=, lote_id=10 2026-03-17 14:06:32 - [Stock Process][Prod0_ID10] Procesando stock con cantidad: 15 2026-03-17 14:06:32 - [Stock manual][Prod0_ID10] Aplicando lógica basada en cantidad. 2026-03-17 14:06:32 - [DB EXECUTE][ID: FindCodeManualLoop_Prod0_ID10] Params: {"pid":"10","codigo":"17737621147948"} 2026-03-17 14:06:32 - [Stock Manual][Prod0_ID10] Producto manual - código de barras específico: 10, numero_lote: LOTE1 2026-03-17 14:06:32 - [DB EXECUTE][ID: UpdateCodeManualLoop_Prod0_ID10_Esc] Params: {"cant":"15","id":10} 2026-03-17 14:06:32 - [Stock manual][Prod0_ID10] Actualizado código escaneado ID: 10. Descontado: 15 2026-03-17 14:06:32 - [Stock Strategy NORMAL][Prod0_ID10] Usando estrategia de codigos_barras + triggers. Cantidad a restar: 15 2026-03-17 14:06:32 - [Stock Update NORMAL][Prod0_ID10] codigos_barras ya actualizado en sección anterior 2026-03-17 14:06:32 - [MOVIMIENTO NORMAL] Llamando a registrarMovimientoStock para Producto ID: 10, Cantidad: 15, Venta ID: 8 2026-03-17 14:06:32 - [Movimiento Stock] Registrando movimiento para Producto ID: 10, Cantidad: 15 2026-03-17 14:06:32 - [Movimiento Stock] ÉXITO: Movimiento registrado para Producto ID: 10 2026-03-17 14:06:32 - [MOVIMIENTO NORMAL] Resultado de registrarMovimientoStock: ÉXITO 2026-03-17 14:06:32 - [Stock Strategy NORMAL][Prod0_ID10] Triggers de codigos_barras sincronizan productos.stock e inventario.cantidad 2026-03-17 14:06:32 - [DTE Detalle][Prod0_ID10] Agregado a venta_detalles_para_api con formato original 2026-03-17 14:06:32 - --- Fin procesamiento para Prod0_ID10 --- 2026-03-17 14:06:32 - Detalles de venta insertados y stock actualizado. 2026-03-17 14:06:32 - No se intentó la emisión DTE para Venta ID: 8 (Modo API inactivo o condiciones no cumplidas). 2026-03-17 14:06:32 - [Transaction] Intentando confirmar transacción (commit) para Venta ID: 8 2026-03-17 14:06:32 - [Transaction Pre-Commit] Estado conexión->inTransaction(): true 2026-03-17 14:06:32 - [Transaction Post-Commit] Resultado de $conexion->commit(): true 2026-03-17 14:06:32 - [Transaction Post-Commit] Estado conexión->inTransaction() después: false 2026-03-17 14:06:32 - Transacción completada con éxito para Venta ID: 8 2026-03-17 14:06:32 - [POST-SYNC] Sincronización post-venta DESACTIVADA para evitar conflictos con productos especiales 2026-03-17 14:06:32 - ==== FIN SOLICITUD PROCESAR VENTA ====\n 2026-04-04 04:34:52 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2026-04-04 04:34:52 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2026-04-04 04:34:52 - Datos recibidos: 2026-04-04 04:34:52 - Content-Type: No especificado 2026-04-04 04:34:52 - Error: No autorizado 2026-04-10 15:45:33 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2026-04-10 15:45:33 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2026-04-10 15:45:33 - Datos recibidos: 2026-04-10 15:45:33 - Content-Type: No especificado 2026-04-10 15:45:33 - Error: No autorizado 2026-04-12 17:44:51 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2026-04-12 17:44:51 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2026-04-12 17:44:51 - Datos recibidos: 2026-04-12 17:44:51 - Content-Type: No especificado 2026-04-12 17:44:51 - Error: No autorizado 2026-04-16 20:09:11 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2026-04-16 20:09:11 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2026-04-16 20:09:11 - Datos recibidos: 2026-04-16 20:09:11 - Content-Type: No especificado 2026-04-16 20:09:11 - Error: No autorizado 2026-04-16 20:09:14 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2026-04-16 20:09:14 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2026-04-16 20:09:14 - Datos recibidos: 2026-04-16 20:09:14 - Content-Type: No especificado 2026-04-16 20:09:14 - Error: No autorizado 2026-04-16 20:09:23 - ADVERTENCIA: Había salida previa. Se ha limpiado. 2026-04-16 20:09:23 - ==== INICIO SOLICITUD PROCESAR VENTA ==== 2026-04-16 20:09:23 - Datos recibidos: 2026-04-16 20:09:23 - Content-Type: No especificado 2026-04-16 20:09:23 - Error: No autorizado