ApitiendasBackend,
apitiendas admin, apitiendas-front storefront). Cada tarea incluye descripción,
alcance técnico con evidencia (archivo:línea) y valor a pagar al desarrollador.
Valores en pesos colombianos (COP).
Bloqueante: sin esto la plataforma no debe operar con clientes.
Rotar todas las credenciales expuestas, sacar los secretos del repositorio y dejar la configuración de producción segura.
Rotar AWS (S3/SES), BD y claves base de JWT/Django; purgar .local.env del historial (git filter-repo) y agregar a .gitignore (.local.env:1-11). Mover secretos a variables de entorno de Elastic Beanstalk / Secrets Manager. Endurecer config/settings.py:22-24: ALLOWED_HOSTS por entorno, CORS_ALLOWED_ORIGINS whitelist, DEBUG=False. Reemplazar derivación de clave SHA-256 simple (config/keys/key.py) por clave aleatoria de alta entropía.
Cerrar la escalada de privilegios y la falsificación de sesiones.
Quitar user.is_staff = True del signup público y separar roles (signup.py:102-104; permiso en permissions_manager.py:4-7). En SessionJWTAuthentication cambiar verify=False → verify=True con issuer/audience, validar session_obj no nula y expiración, atar el claim supplier a la sesión (session_jwt.py:33-52). Cookie de sesión del storefront a httpOnly:true + secure (apitiendas-front/src/middleware.ts:94-103,142).
Evitar accesos cruzados entre clientes/proveedores y endpoints sin autenticación.
Webhooks con verificación de firma HMAC + restringir CRUD (app/webhooks/views.py:11-19). DownloadOrdersXlsx con auth + scope por proveedor (app/orders/views/orders.py:62-73). Scoping por sesión/tenant en líneas de carrito (app/orders/views/cart.py:56-71), retrieve de pedidos y FK de producto cross-supplier. No enviar contraseñas en texto plano por SMS (webhooks/serializers.py:105-106).
Lo que evita el desborde de soporte (readiness operativa).
Flujo completo de recuperación por código (email/SMS) en los tres frentes.
Cablear vista + URL para los serializers ya existentes (password_recovery.py) y corregir la validación de expiración invertida (password_recovery.py:203-204). Conectar send_recovery_email/send_recovery_sms. UI "Olvidé mi contraseña" en admin (LoginModal) y flujo de recuperación en storefront para cliente que cambió de teléfono.
Que el usuario edite su perfil y cambie su contraseña sin soporte.
Convertir UpdateUserApiView de RetrieveAPIView a RetrieveUpdateAPIView (hoy un PATCH da 405; fetch_user.py:16-23). Habilitar edición de nombre/teléfono y cambio de contraseña; UI de cuenta en el admin y verificación del paso update_profile del signup (SignupModal.tsx:109-114).
Verificar el teléfono antes de crear la cuenta y dar feedback real del envío del código.
Agregar paso OTP antes de submitSignUpDirect en el storefront (SignupForm.tsx:32-56). Leer sms_sent y mostrar estado real; botón "Reenviar código" con cooldown y fallback a email (PhoneConfirmation.tsx:46-47).
Eliminar deslogueos "sin razón", pantallas colgadas y enlaces muertos.
Corregir interceptor de refresh: URL /auth/tokens/refresh, body refresh_token, parseo access.token (apitiendas/src/lib/axios.ts:91-106). Logout que llame POST /auth/logout (admin) y logout en storefront. Eliminar spinner infinito en ProtectedRoute.tsx:20-33; reemplazar alert()/errores tragados por toasts; arreglar enlace muerto /categories (SiteFooter.tsx:138).
Estabilidad y prevención de regresiones.
Que el checkout no se bloquee enviando correos y que los errores queden registrados.
Mover send_order_email (render PDF + 2 SES) a tarea Celery .delay() tras commit; corregir DJANGO_SETTINGS_MODULE a config.settings y arranque de workers en EB. Logging estructurado en lugar de print.
Cobertura mínima de los flujos críticos y un pipeline que no deje pasar errores.
Tests de auth/JWT y carrito (backend), auth store/interceptor (admin), flujo de pedido (storefront). CI con lint + manage.py test + tsc --noEmit + build; corregir buildspec.yml (hoy no instala ni prueba).
Fuera del diagnóstico, solicitada aparte.
Subir un xlsx para crear/actualizar productos en lote, con plantilla, validación previa y reporte de resultado.
Plantilla descargable; endpoint de previsualización que parsea y valida sin persistir (campos requeridos, tipos, categoría/proveedor, presentaciones/precios) y devuelve filas válidas + errores; endpoint de confirmación que inserta en lote con transaction.atomic() y respeto del scoping por proveedor (tarea 3). Parseo con openpyxl (ya en requirements.txt). UI en admin: descargar plantilla, dropzone, tabla de revisión con errores resaltados y resumen (creados/actualizados/rechazados). Tope de filas y manejo de duplicados por SKU/nombre.