Flujo: Creación de Proyecto
¿Quién lo usa?
| Rol | Permiso requerido |
|---|---|
BRAND_ADMIN | PROJECT_CREATOR |
COMPANY_ADMIN | PROJECT_CREATOR |
¿Por qué importa?
La creación de proyecto es el punto de entrada de todo el ciclo de vida de Rial. Aquí el cliente define qué imágenes necesita: tipo de servicio, prendas, SKUs y configuración. Un proyecto mal configurado genera retrabajo costoso en etapas posteriores.
Entrada en la plataforma
URL: /projects/create
El cliente navega a esta ruta desde el botón “Nuevo proyecto” en la barra lateral. La plataforma muestra tres tipos de proyecto disponibles:
Ruta del componente:
app/(private)/projects/create/page.tsx→ProjectTypeSelector
| Opción en UI | ProjectType | Componente | Pasos |
|---|---|---|---|
| Faceswap | FACESWAP | ExcelProjectFaceswap | Configuración → Excel → Fotos → Modelo → Resumen |
| Generación masiva | BATCH | ExcelProjectBatch | Configuración → Excel → Fotos → Modelo → Resumen |
| Producto | PRODUCT | ExcelProjectProduct | Configuración → Excel → Fotos → Resumen |
Nota: El paso de selección de modelo no existe en proyectos de tipo
PRODUCT.
Pasos del flujo
El flujo es manejado por ExcelProjectBase, un componente genérico que recibe la configuración específica de cada tipo de proyecto vía la prop config.
Paso 1 — Configuración (ExcelProjectStep.CONFIGURATION)
Componente: CreateExcelForm
El usuario completa los datos generales que se aplican a todos los proyectos creados desde este lote:
| Campo | Requerido | Descripción |
|---|---|---|
| Nombre base | ✅ | Se usa como prefijo en cada ProjectFolder |
| Temporada | ✅ | Ej: Primavera, Verano, etc. |
| Año | ✅ | Ej: 2025 |
| Formato de envío | ✅ | Imagen (default) o Video — afecta el mediaType |
| Descripción | ❌ | Campo libre, opcional |
Endpoints en este paso: ninguno — los datos se guardan en el estado del formulario.
Validación para continuar: name, season y year deben estar completos.
Paso 2 — Subir Excel (ExcelProjectStep.EXCEL_UPLOAD)
Componente: UploadExcelForm
El usuario arrastra o selecciona un archivo .xlsx con la estructura de SKUs del proyecto. El archivo se valida automáticamente al cargarlo.
Columnas requeridas por tipo:
Marca— debe existir en la plataforma (obligatorio)Genero—Hombre,MujeroUnisex(opcional)Edad— en años (25) o meses ("6m") (opcional)SKU— identificador único con formatoXXX.ext(obligatorio)Vista— solo Faceswap: formatoXXX_YY.extoXXX-YY.ext(obligatorio)
Endpoint utilizado:
POST /excel/projects/validate
Body: FormData { file, projectType, projectName }
Response: { isValid, error?, data: { excelData, duplicatedSkus } }El backend procesa el Excel y retorna:
excelData— estructura con proyectos agrupados por marca, lista de SKUs, modelos sugeridosduplicatedSkus— SKUs que ya existen en proyectos anteriores (se muestra una alerta de advertencia)
Validación para continuar: el Excel debe ser válido y contener al menos una fila por proyecto.
Paso 3 — Subir fotos (ExcelProjectStep.UPLOAD_IMAGES)
Componente: UploadImagesForm
El usuario carga las imágenes de las prendas. Todos los archivos se mantienen en memoria del navegador (File[]) y no se suben al servidor en este paso.
La interfaz muestra las imágenes paginadas de 20 en 20 (ordenadas alfabéticamente por nombre) y permite previsualizarlas con hover. Si se detectan imágenes con el mismo nombre de archivo (SKU duplicado), se muestra una alerta de advertencia y las imágenes duplicadas son rechazadas.
Endpoints en este paso: ninguno.
Validación para continuar: debe haber al menos una imagen seleccionada.
Paso 4 — Modelo (ExcelProjectStep.MODEL)
Componente: SelectModelForm → ProjectModelSelection → ModelSelectionGrid
Solo disponible para
FACESWAPyBATCH. El tipoPRODUCTomite este paso.
El usuario selecciona el modelo (o modelos) de IA que reemplazará a los modelos de las fotografías originales. La selección se hace por marca y género:
- Hombre → 1 slot de modelo
- Mujer → 1 slot de modelo
- Unisex → 1 slot femenino + 1 slot masculino
La validación comprueba que cada proyecto tenga al menos un modelo seleccionado acorde al género declarado en el Excel.
Endpoints en este paso: ninguno — la selección se guarda en el form state como modelIds[projectKey].
Paso 5 — Resumen (ExcelProjectStep.SUMMARY)
Componente: ProcessingResultsForm
Al avanzar al paso de Resumen, el sistema cruza automáticamente los nombres de las imágenes subidas con los SKUs del Excel. Este cruce determina qué imágenes corresponden a cada SKU y cuáles sobran o faltan.
Endpoint utilizado:
POST /excel/projects/match
Body: { projects: SkusByProjectKey, fileNames: string[], projectType }
Response: { result: { data: MatchedExcelResult, isValid, error? } }Para lotes grandes de imágenes (>
EXCEL_FILENAMES_CHUNK_SIZE), las llamadas se hacen en chunks y los resultados se combinan en el frontend conmergeMatchedExcelResults.
El resumen muestra:
| Métrica | Descripción |
|---|---|
| Marcas encontradas | Total de ProjectFolder que se crearán |
| SKUs totales | Filas únicas del Excel |
| Imágenes subidas | Total de archivos seleccionados |
| Matching exitoso | % de imágenes que coincidieron con un SKU |
Si hay imágenes con nombres que no corresponden a ningún SKU (extraImages) o SKUs sin imagen (unmatchedImages), el sistema bloquea la creación mostrando alertas de error.
El usuario puede descargar un reporte Excel del matching:
POST /excel/projects/report
Body: { matchedImages, unmatchedImages, extraImages }
Response: blob (.xlsx)Validación para crear: no deben existir unmatchedImages ni extraImages.
Creación de proyectos (submit)
Al presionar “Crear proyectos”, el proceso corre en background (useBackgroundProcessing) y el usuario es redirigido a /projects?creating=true mientras se completa.
El flujo se ejecuta secuencialmente por cada marca encontrada en el Excel:
Para cada (projectKey, projectResult) en processingResult.projects:
1. POST /uploads/request-signed-urls
Body: { fileNames, uploadType: CREATE_PROJECT, brandId, projectType, skus }
Response: { signedUrls: { [fileName]: string } }
2. PUT [signed-url] ← directo a Google Cloud Storage (concurrente, máx. 10 en paralelo)
Body: archivo de imagen
Headers: Content-Type: image/...
3. POST /projects/faceswap ← o /batch o /product según el tipo
Body: { name, brandId, season, description, fileNames, modelIds, skus, gender, age, mediaType, ... }
Response: { project: Project, projectFolder: ProjectFolder }Una vez que todos los proyectos se crean exitosamente:
4. PATCH /status/mark-as-in-progress/{projectFolderId}
— Cambia el estado del ProjectFolder a IN_PROGRESS
5. PATCH /generated-images/tag-faceswap/{projectFolderId} ← solo FACESWAP
— Etiqueta las imágenes de bypass (fotos originales que no se procesarán con AI)
Response: { jobId: string }Estado resultante
ProjectFolder.clientStatus = CREATING → IN_PROGRESS
ProjectFolder.adminStatus = CREATING → IN_PROGRESS
ProjectImage.adminStatus = IN_PROGRESS (listo para generar)El admin recibe una notificación (ADMIN_PROJECT_CREATED) cuando el caso queda creado.
Secuencia técnica
Resumen de endpoints
| Paso | Método | Endpoint | Descripción |
|---|---|---|---|
| 2 | POST | /excel/projects/validate | Valida el Excel subido y extrae SKUs |
| 5 | POST | /excel/projects/match | Cruza imágenes con SKUs del Excel |
| 5 | POST | /excel/projects/report | Descarga reporte Excel del matching |
| Submit | POST | /uploads/request-signed-urls | Obtiene URLs firmadas de GCS |
| Submit | PUT | [signed-url] | Sube imágenes directamente a GCS |
| Submit | POST | /projects/faceswap | Crea proyecto Faceswap |
| Submit | POST | /projects/batch | Crea proyecto Generación Masiva |
| Submit | POST | /projects/product | Crea proyecto Producto |
| Submit | PATCH | /status/mark-as-in-progress/{id} | Marca el ProjectFolder como IN_PROGRESS |
| Submit | PATCH | /generated-images/tag-faceswap/{id} | Etiqueta imágenes bypass (solo FACESWAP) |
Notas importantes
- El Excel es procesado y validado en el backend (
/excel/projects/validate) antes de avanzar al siguiente paso. Los errores de formato o columnas faltantes se detectan en este punto. - Si el cliente no tiene el permiso
PROJECT_CREATOR, el botón “Nuevo proyecto” no aparece en la UI. - Un
ProjectFoldercontiene múltiplesProject(uno por marca) si el Excel incluye varias marcas. - Las imágenes nunca pasan por el backend; se suben directamente a GCS usando signed URLs de corta duración.
- El proceso de creación corre en background: el usuario puede navegar a otra sección mientras los proyectos se crean. Al completarse exitosamente, se redirige a
/projects?created=true.