From 826c5fce5e315d49dcfd146292414fcab9752d5f Mon Sep 17 00:00:00 2001 From: gitea Date: Thu, 27 Nov 2025 15:34:19 -0300 Subject: [PATCH] =?UTF-8?q?Backend=20v1.0.71:=20-=20Implementado=20soft=20?= =?UTF-8?q?delete=20para=20preguntas=20-=20Nuevas=20columnas:=20is=5Fdelet?= =?UTF-8?q?ed=20(boolean),=20updated=5Fat=20(timestamp)=20-=20Migraci?= =?UTF-8?q?=C3=B3n=20SQL:=20add=5Fsoft=5Fdelete=5Fto=5Fquestions.sql=20-?= =?UTF-8?q?=20Endpoint=20DELETE=20marca=20preguntas=20como=20eliminadas=20?= =?UTF-8?q?en=20lugar=20de=20borrarlas=20-=20GET=20/api/checklists/{id}=20?= =?UTF-8?q?filtra=20preguntas=20eliminadas=20(is=5Fdeleted=3Dfalse)=20-=20?= =?UTF-8?q?Validaci=C3=B3n=20de=20subpreguntas=20activas=20antes=20de=20el?= =?UTF-8?q?iminar=20-=20=C3=8Dndices=20agregados=20para=20optimizar=20quer?= =?UTF-8?q?ies=20-=20Mantiene=20integridad=20de=20respuestas=20hist=C3=B3r?= =?UTF-8?q?icas=20y=20PDFs=20generados=20-=20Permite=20limpiar=20checklist?= =?UTF-8?q?s=20sin=20afectar=20inspecciones=20completadas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/main.py | 49 ++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/backend/app/main.py b/backend/app/main.py index 59205cb..4c2ba16 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -204,7 +204,7 @@ def send_completed_inspection_to_n8n(inspection, db): # No lanzamos excepción para no interrumpir el flujo normal -BACKEND_VERSION = "1.0.71" +BACKEND_VERSION = "1.0.72" app = FastAPI(title="Checklist Inteligente API", version=BACKEND_VERSION) # S3/MinIO configuration @@ -1057,18 +1057,6 @@ def delete_question( if db_question.is_deleted: raise HTTPException(status_code=400, detail="La pregunta ya está eliminada") - # Verificar si tiene subpreguntas activas - active_subquestions = db.query(models.Question).filter( - models.Question.parent_question_id == question_id, - models.Question.is_deleted == False - ).count() - - if active_subquestions > 0: - raise HTTPException( - status_code=400, - detail=f"No se puede eliminar la pregunta porque tiene {active_subquestions} subpregunta(s) activa(s). Elimina primero las subpreguntas." - ) - # Registrar auditoría antes de eliminar audit_log = models.QuestionAuditLog( question_id=question_id, @@ -1080,15 +1068,44 @@ def delete_question( ) db.add(audit_log) - # SOFT DELETE: marcar como eliminada en lugar de borrar físicamente + # SOFT DELETE: marcar como eliminada db_question.is_deleted = True db_question.updated_at = datetime.utcnow() + # También marcar como eliminadas todas las subpreguntas (en cascada) + subquestions = db.query(models.Question).filter( + models.Question.parent_question_id == question_id, + models.Question.is_deleted == False + ).all() + + subquestion_count = 0 + for subq in subquestions: + subq.is_deleted = True + subq.updated_at = datetime.utcnow() + subquestion_count += 1 + + # Registrar auditoría de subpregunta + sub_audit_log = models.QuestionAuditLog( + question_id=subq.id, + checklist_id=subq.checklist_id, + user_id=current_user.id, + action="deleted", + old_value=f"Subpregunta eliminada en cascada: {subq.text}", + comment=f"Eliminada junto con pregunta padre #{question_id}" + ) + db.add(sub_audit_log) + db.commit() + message = "Pregunta eliminada exitosamente" + if subquestion_count > 0: + message += f" junto con {subquestion_count} subpregunta(s)" + return { - "message": "Pregunta eliminada exitosamente", - "note": "Las respuestas históricas se mantienen intactas. La pregunta no aparecerá en nuevas inspecciones." + "message": message, + "id": question_id, + "subquestions_deleted": subquestion_count, + "note": "Las respuestas históricas se mantienen intactas. Las preguntas no aparecerán en nuevas inspecciones." }