Proyectos
Sistema de gestión de proyectos en Floutic.
Características
- Creación de proyectos (requiere email verificado, perfil completo, perfil verificado y datos fiscales)
- Sistema de aplicaciones
- Selección de expertos
- Gestión de estados
- Sistema de hitos
Requisitos para Crear Proyectos
Para crear un proyecto, el usuario empresa debe cumplir con los siguientes requisitos (en orden de verificación):
- Email verificado: El email debe estar verificado (
email_verified = true) - Perfil completo: Debe existir un perfil de empresa completo
- Perfil verificado: El perfil debe estar verificado por un administrador (
is_verified = true) - Datos fiscales: Para el primer proyecto, se requieren datos fiscales completos (CIF, país, etc.). La validación se realiza tanto en frontend (Zod) como en backend (Pydantic).
- Formato de Fecha: El campo
deadlinedebe enviarse como ISO datetime (YYYY-MM-DDTHH:MM:SS). - Validación de Fecha Límite: La fecha límite no puede ser anterior a la fecha actual. Esta validación se aplica tanto en frontend (atributo
minen input de fecha y validación en formulario) como en backend (validación en endpoints de creación/actualización).
Estructura Modular
Los endpoints de proyectos están organizados en módulos especializados:
listing.py- Listado de proyectos (público y autenticado)crud.py- Operaciones CRUD básicas (crear, leer, actualizar, eliminar)applications.py- Gestión de aplicaciones de expertosselection.py- Selección de expertos y pagos inicialesworkflow.py- Flujo de validación y curación (admin)disputes.py- Gestión de disputas
Endpoints Principales
Listado
GET /api/projects/public- Listar proyectos públicosGET /api/projects/- Listar proyectos con filtrosGET /api/projects/my- Mis proyectosGET /api/projects/all- Todos los proyectos (admin)
CRUD
POST /api/projects/- Crear proyecto. Soporta campo opcionalstatus(draftopending_publication). Si espending_publication, el backend establece automáticamentevalidation_status="pending"ysubmitted_at=now().GET /api/projects/{id}- Ver proyectoPUT /api/projects/{id}- Actualizar proyectoPATCH /api/projects/{id}/status- Cambiar estadoDELETE /api/projects/{id}- Eliminar proyecto
Aplicaciones y Selección
POST /api/projects/{id}/apply- Aplicar a proyecto. Nota: La propuesta debe incluir una lista deproposed_milestonescon al menos 3 hitos que sumen el total delproposed_budget.GET /api/projects/{id}/my-application- Obtener mi propuesta para un proyecto (experto)GET /api/projects/{id}/applications- Listar aplicacionesPOST /api/projects/{id}/applications/{application_id}/request-revision- Solicitar cambios a una propuesta (empresa). Cambia el estado aneeds_revisiony guardafeedback.PUT /api/projects/{id}/applications/{application_id}- Re-enviar propuesta modificada (experto). Solo permitido si la propuesta está enneeds_revision.POST /api/projects/{id}/select/{expert_id}- Seleccionar expertoPOST /api/projects/{id}/selection/cancel- Cancelar selección
Estados de propuesta (negociación)
Las propuestas (ProjectApplication) soportan negociación antes de la selección:
pending: Propuesta enviada, pendiente de revisión por la empresa.needs_revision: La empresa solicita cambios. Incluyefeedbackyrevision_requested_at.accepted: Propuesta aceptada (selección realizada).rejected: Propuesta rechazada.
Campos relevantes:
attempt_number: Incrementa cada vez que el experto re-envía la propuesta.feedback: Texto de la empresa con los cambios solicitados (se limpia al re-enviar).
Validación y Curación
POST /api/projects/{id}/submit- Enviar para validaciónPOST /api/projects/{id}/validate- Validar proyecto (admin)POST /api/projects/{id}/curate- Curar expertos (admin)POST /api/projects/{id}/auto-curate- Auto-curación (admin)GET /api/projects/{id}/curation-suggestions- Sugerencias de curaciónPOST /api/projects/{id}/request-budget- Solicitar presupuesto
Disputas
POST /api/projects/{id}/dispute- Crear disputaGET /api/projects/{id}/dispute- Obtener disputa activa/reciente
Máquina de estados y transiciones (Disputas)
Estados de disputa (Dispute.status)
open: disputa recién creada por empresa o experto.in_review: disputa en mediación por admin.resolved: disputa cerrada con decisión administrativa.closed: estado de cierre final (reservado para flujos de cierre extendidos).
Transiciones válidas
open -> in_review (PUT /api/admin/disputes/{id}/mediate)
open -> resolved (PUT /api/admin/disputes/{id}/resolve)
in_review -> resolved (PUT /api/admin/disputes/{id}/resolve)
Reglas:
- Una disputa
resolvedoclosedno puede volver a mediación. - Solo puede existir una disputa activa (
openoin_review) por proyecto.
Side effects de estado (proyecto y pago)
-
Al crear disputa:
Project.statuscambia adisputed.- Si existe pago asociado en
pendingoheld, pasa adisputed.
-
Al resolver disputa:
Dispute.statuscambia aresolved.Project.statusvuelve ain_progresssi estabadisputed.- Según
resolution_action:resolve_favor_expert/release_to_expert->Payment.status = releasedypayout_status = transferred(si aplica).resolve_favor_company/refund_company->Payment.status = refundedypayout_status = pending.
-
Auditoría:
- Se agregan entradas en
project.admin_notescon prefijo[DISPUTE_EVENT].
- Se agregan entradas en
Más Información
Consulta la Documentación de la API para más detalles sobre cada endpoint.