-- Nueva actividad "Inventario de servicios de tecnologia" en Infraestructura y redes, con un -- checklist inicial de tareas (propuesto). Idempotente sin marcador: cada INSERT se protege con -- NOT EXISTS sobre su propio nombre. SET NAMES utf8mb4; INSERT INTO activities (project_id, code, name, priority_id, status_id, created_by) SELECT p.id, 'PENDING', 'Inventario de servicios de tecnologia', 2, 1, 1 FROM projects p WHERE p.name = 'Infraestructura y redes' AND NOT EXISTS ( SELECT 1 FROM activities a WHERE a.project_id = p.id AND a.name = 'Inventario de servicios de tecnologia' ); UPDATE activities a JOIN projects p ON p.id = a.project_id SET a.code = CONCAT('ACT-', LPAD(a.id, 4, '0')) WHERE p.name = 'Infraestructura y redes' AND a.name = 'Inventario de servicios de tecnologia' AND a.code = 'PENDING'; -- Tareas propuestas (checklist inicial del inventario). INSERT INTO tasks (activity_id, name) SELECT a.id, t.name FROM activities a JOIN projects p ON p.id = a.project_id JOIN ( SELECT 'Internet corporativo (proveedor, plan contratado, IP fija, costo)' AS name UNION ALL SELECT 'Paginas web y dominios (hosting, registrador, fechas de vencimiento)' UNION ALL SELECT 'Certificados SSL/TLS (dominio, vencimiento, renovacion automatica o manual)' UNION ALL SELECT 'Correo corporativo y SMTP (proveedor, plan, cantidad de cuentas)' UNION ALL SELECT 'Servicios en la nube (Microsoft 365 / Google Workspace u otro)' UNION ALL SELECT 'Software como servicio de terceros (facturacion electronica, firma electronica, etc.)' UNION ALL SELECT 'Telefonia / VoIP' UNION ALL SELECT 'Respaldos y almacenamiento en la nube' ) t ON 1=1 WHERE p.name = 'Infraestructura y redes' AND a.name = 'Inventario de servicios de tecnologia' AND NOT EXISTS (SELECT 1 FROM tasks x WHERE x.activity_id = a.id AND x.name = t.name);