#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Script para probar la funcionalidad de cancelación en cascada """ import odoo import traceback from datetime import datetime def test_cancel_cascade(cr): """Probar la cancelación en cascada de órdenes""" env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {}) print("🧪 Probando cancelación en cascada de órdenes de laboratorio\n") try: # Buscar un paciente y doctor de prueba patient = env['res.partner'].search([('is_patient', '=', True)], limit=1) doctor = env['res.partner'].search([('is_doctor', '=', True)], limit=1) if not patient or not doctor: print("❌ No se encontraron pacientes o doctores de prueba") return # Buscar un análisis analysis = env['product.product'].search([ ('is_analysis', '=', True), ('required_sample_type_id', '!=', False) ], limit=1) if not analysis: print("❌ No se encontró un análisis con tipo de muestra requerido") return print(f"📋 Creando orden de laboratorio de prueba...") print(f" Paciente: {patient.name}") print(f" Doctor: {doctor.name}") print(f" Análisis: {analysis.name}") # Crear orden de laboratorio order = env['sale.order'].create({ 'partner_id': patient.id, 'doctor_id': doctor.id, 'is_lab_request': True, 'order_line': [(0, 0, { 'product_id': analysis.id, 'product_uom_qty': 1.0 })] }) print(f"\n✓ Orden creada: {order.name}") print(f" Estado inicial: {order.state}") # Confirmar la orden print("\n🔄 Confirmando orden...") order.action_confirm() print(f"✓ Orden confirmada") print(f" Estado: {order.state}") print(f" Muestras generadas: {len(order.generated_sample_ids)}") # Mostrar muestras generadas if order.generated_sample_ids: print("\n📦 Muestras generadas:") for sample in order.generated_sample_ids: print(f" - {sample.name}: {sample.sample_type_product_id.name} (Estado: {sample.state})") # Buscar pruebas generadas tests = env['lims.test'].search([ ('sale_order_line_id.order_id', '=', order.id) ]) print(f"\n🔬 Pruebas generadas: {len(tests)}") if tests: for test in tests: print(f" - {test.name}: {test.product_id.name} (Estado: {test.state})") # Iniciar proceso en una prueba para hacerlo más realista if tests and order.generated_sample_ids: print("\n🔄 Iniciando proceso en primera prueba...") test = tests[0] test.sample_id = order.generated_sample_ids[0] test.action_start_process() print(f" ✓ Prueba {test.name} en proceso") # CANCELAR LA ORDEN print("\n❌ Cancelando la orden de laboratorio...") order.action_cancel() print(f"\n✓ Orden cancelada") print(f" Estado de la orden: {order.state}") # Verificar estado de las muestras print("\n📦 Estado final de las muestras:") for sample in order.generated_sample_ids: print(f" - {sample.name}: {sample.state}") # Verificar si hay mensaje en el chatter last_msg = sample.message_ids[0] if sample.message_ids else None if last_msg and "cancelada automáticamente" in last_msg.body: print(f" ✓ Mensaje de cancelación registrado") # Verificar estado de las pruebas print("\n🔬 Estado final de las pruebas:") for test in tests: test_updated = env['lims.test'].browse(test.id) print(f" - {test_updated.name}: {test_updated.state}") # Verificar mensaje last_msg = test_updated.message_ids[0] if test_updated.message_ids else None if last_msg and "cancelada automáticamente" in last_msg.body: print(f" ✓ Mensaje de cancelación registrado") # Verificar mensaje en la orden print("\n📝 Mensajes en la orden:") for msg in order.message_ids[:3]: # Últimos 3 mensajes if "cancelaron automáticamente" in msg.body: print(f" ✓ Mensaje de resumen de cancelación encontrado") # Extraer números del mensaje import re samples_match = re.search(r'(\d+) muestras', msg.body) tests_match = re.search(r'(\d+) pruebas', msg.body) if samples_match: print(f" - Muestras canceladas: {samples_match.group(1)}") if tests_match: print(f" - Pruebas canceladas: {tests_match.group(1)}") break print("\n✅ Prueba completada exitosamente!") # Hacer rollback para no dejar datos de prueba cr.rollback() print("\n⚠️ Cambios revertidos (rollback)") except Exception as e: print(f"\n❌ Error durante la prueba: {str(e)}") traceback.print_exc() cr.rollback() if __name__ == '__main__': db_name = 'lims_demo' try: registry = odoo.modules.registry.Registry(db_name) with registry.cursor() as cr: test_cancel_cascade(cr) except Exception as e: print(f"Error general: {e}") traceback.print_exc()