salesforce_admin

πŸ“‹ SDLC: Salesforce Admin Learning Platform

Proyecto: Salesforce Admin Learning Platform (Plataforma Integral)
Equipo: VISIONARY ADMINS
VersiΓ³n: 0.30.0 (Web Platform MVP)
Fecha: 17 Enero 2026
Tipo: AplicaciΓ³n Web Full-Stack con Contenido DinΓ‘mico


πŸ“‘ Tabla de Contenidos

  1. Fase 1: PlanificaciΓ³n
  2. Fase 2: AnΓ‘lisis de Requerimientos
  3. Fase 3: DiseΓ±o
  4. Fase 4: Desarrollo
  5. Fase 5: Pruebas
  6. Fase 6: ImplementaciΓ³n
  7. Fase 7: Mantenimiento

Fase 1: PlanificaciΓ³n

1.1 VisiΓ³n del Proyecto

EvoluciΓ³n del Proyecto:

Problema a Resolver: Crear una plataforma web integral que combine:

Objetivo del MVP (v0.30.0): Migrar la documentaciΓ³n estΓ‘tica a una aplicaciΓ³n web que:

1.2 Alcance del MVP

βœ… In Scope (VersiΓ³n 0.30.0)

Core Features:

Contenido:

Infraestructura:

❌ Out of Scope (Futuras versiones)

1.3 Stakeholders

Rol Responsabilidad Persona
Product Owner VisiΓ³n del producto, priorizaciΓ³n, validaciΓ³n Wilmer (Usuario ΓΊnico)
AI Agent Asume mΓΊltiples roles segΓΊn fase (Tech Lead, Backend Dev, Frontend Dev, QA, DevOps, Code Reviewer) Gemini AI
Developer/Implementador Ejecuta cΓ³digo, prueba, reporta errores, valida funcionalidad Wilmer (Usuario ΓΊnico)
Content Manager ActualizaciΓ³n de Markdown Wilmer (Usuario ΓΊnico)
End Users Estudiantes del curso 5-10 miembros VISIONARY ADMINS

1.4 Cronograma Estimado

Fase DuraciΓ³n Entregables
PlanificaciΓ³n 1 dΓ­a SDLC, Roadmap, Task List, AI Role Framework
AnΓ‘lisis 1 dΓ­a Requerimientos, User Stories
DiseΓ±o 2 dΓ­as Arquitectura, DB Schema
RefactorizaciΓ³n 1 dΓ­a Nueva estructura de carpetas
Desarrollo Backend 6 dΓ­as API, Auth, DB, Markdown Renderer
Desarrollo Frontend 5 dΓ­as Templates, CSS, JavaScript
IntegraciΓ³n 2 dΓ­as Backend + Frontend + Contenido
Pruebas 3 dΓ­as Unit, Integration, Manual
Deploy 1 dΓ­a Render setup, migrations
DocumentaciΓ³n 1 dΓ­a API docs, User guide
TOTAL ~24 dΓ­as (4 semanas) v0.30.0 en producciΓ³n

Nota: Timeline para desarrollo solo con AI Agent. Desarrollo paralelo de mΓΊltiples features no es posible.

1.5 Presupuesto

Costo Total: $0 USD

Recurso Proveedor Costo
Hosting Web Render Free Tier $0
Database PostgreSQL (Render) $0
Domain Render subdomain $0
Git Hosting GitHub $0
Desarrollo Equipo (voluntario) $0

Limitaciones Free Tier:


Fase 2: AnΓ‘lisis de Requerimientos

2.1 Requerimientos Funcionales

RF-001: Renderizado DinΓ‘mico de Markdown

RF-002: AutenticaciΓ³n de Usuarios

RF-003: Dashboard Personal

RF-004: Tracking de Progreso

RF-005: Vista de Equipo

RF-006: NavegaciΓ³n JerΓ‘rquica

RF-007: GestiΓ³n de Contenido

2.2 Requerimientos No Funcionales

RNF-001: Performance

RNF-002: Seguridad

RNF-003: Usabilidad

RNF-004: Mantenibilidad

RNF-005: Escalabilidad

RNF-006: Disponibilidad

2.3 User Stories

US-001: Como estudiante, quiero ver el contenido del curso renderizado

Given que estoy autenticado
When navego a "Curriculum β†’ Sprint 1 β†’ Semana 1 β†’ Clase 1 TeorΓ­a"
Then veo el contenido Markdown renderizado como HTML
And veo un sidebar con el Γ­ndice de la clase
And veo breadcrumbs de navegaciΓ³n
And veo botones "Anterior" y "Siguiente"

US-002: Como estudiante, quiero marcar una clase como completada

Given que estoy viendo una clase
When marco el checkbox "Clase completada"
Then el sistema guarda mi progreso en la base de datos
And mi % de progreso del Sprint se actualiza
And el checkbox permanece marcado al recargar la pΓ‘gina

US-003: Como estudiante, quiero ver mi progreso general

Given que estoy en el dashboard
When veo la secciΓ³n "Mi Progreso"
Then veo mi % de completitud del Sprint 1
And veo cuΓ‘ntas clases he completado
And veo cuΓ‘ntos Superbadges he terminado
And veo cuΓ‘ntos dΓ­as quedan para el deadline

US-004: Como estudiante, quiero comparar mi progreso con el equipo

Given que estoy en el dashboard
When navego a la pestaΓ±a "Equipo"
Then veo una tabla con todos los miembros
And veo el % de progreso de cada uno
And veo mi posiciΓ³n en el ranking
And la tabla se actualiza automΓ‘ticamente cada 30 segundos

US-005: Como instructor, quiero actualizar el contenido

Given que tengo acceso al repositorio
When edito un archivo Markdown y hago git push
Then la plataforma detecta el cambio (webhook o polling)
And actualiza el contenido automΓ‘ticamente
And los usuarios ven el nuevo contenido sin necesidad de redeploy

Fase 3: DiseΓ±o

3.1 Arquitectura del Sistema

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    USUARIOS (Web Browser)               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚ HTTPS
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  RENDER WEB SERVICE                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚           FASTAPI APPLICATION                     β”‚  β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚  β”‚
β”‚  β”‚  β”‚  Routers                                    β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β”œβ”€ /auth (login, register, logout)        β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β”œβ”€ /docs (render markdown)                β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β”œβ”€ /progress (track user progress)        β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  └─ /api (REST endpoints)                  β”‚  β”‚  β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚  β”‚
β”‚  β”‚  β”‚  Services (Business Logic)                  β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β”œβ”€ MarkdownRenderer                        β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β”œβ”€ AuthService                             β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  └─ ProgressService                         β”‚  β”‚  β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚  β”‚
β”‚  β”‚  β”‚  Models (SQLAlchemy ORM)                    β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β”œβ”€ User                                    β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β”œβ”€ Sprint                                  β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β”œβ”€ Task                                    β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  └─ UserProgress                            β”‚  β”‚  β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚  β”‚
β”‚  β”‚  β”‚  Templates (Jinja2)                         β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β”œβ”€ base.html                               β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β”œβ”€ dashboard.html                          β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β”œβ”€ doc_viewer.html                         β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  └─ team.html                               β”‚  β”‚  β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚ SQL
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              RENDER POSTGRESQL DATABASE                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  Tables:                                          β”‚  β”‚
β”‚  β”‚  β”œβ”€ users                                         β”‚  β”‚
β”‚  β”‚  β”œβ”€ sprints                                       β”‚  β”‚
β”‚  β”‚  β”œβ”€ tasks                                         β”‚  β”‚
β”‚  β”‚  └─ user_progress                                 β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  GITHUB REPOSITORY                      β”‚
β”‚  (Contenido Markdown - Source of Truth)                β”‚
β”‚  β”œβ”€ curriculum/                                         β”‚
β”‚  β”œβ”€ Superbadges/                                        β”‚
β”‚  β”œβ”€ Practica_Financiera/                                β”‚
β”‚  └─ Gestor_de_Versiones/                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚ Git Pull / Webhook
                         β–Ό
                   [FastAPI App]

3.2 Modelo de Datos (Database Schema)

-- users table
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    team VARCHAR(50) DEFAULT 'VISIONARY ADMINS',
    role VARCHAR(20) DEFAULT 'student', -- 'student', 'instructor', 'admin'
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    last_login TIMESTAMP
);

-- sprints table
CREATE TABLE sprints (
    id SERIAL PRIMARY KEY,
    number INTEGER NOT NULL UNIQUE,
    name VARCHAR(100) NOT NULL,
    description TEXT,
    start_date DATE NOT NULL,
    end_date DATE NOT NULL,
    is_active BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- tasks table (auto-generated from Markdown structure)
CREATE TABLE tasks (
    id SERIAL PRIMARY KEY,
    sprint_id INTEGER REFERENCES sprints(id) ON DELETE CASCADE,
    category VARCHAR(50) NOT NULL, -- 'Clase', 'Superbadge', 'Practica'
    title VARCHAR(200) NOT NULL,
    description TEXT,
    markdown_path VARCHAR(500) NOT NULL, -- Path relativo al repo
    order_index INTEGER DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE(sprint_id, markdown_path)
);

-- user_progress table
CREATE TABLE user_progress (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
    task_id INTEGER REFERENCES tasks(id) ON DELETE CASCADE,
    status VARCHAR(20) DEFAULT 'not_started', -- 'not_started', 'in_progress', 'completed'
    started_at TIMESTAMP,
    completed_at TIMESTAMP,
    notes TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE(user_id, task_id)
);

-- indexes for performance
CREATE INDEX idx_user_progress_user_id ON user_progress(user_id);
CREATE INDEX idx_user_progress_task_id ON user_progress(task_id);
CREATE INDEX idx_user_progress_status ON user_progress(status);
CREATE INDEX idx_tasks_sprint_id ON tasks(sprint_id);
CREATE INDEX idx_tasks_markdown_path ON tasks(markdown_path);
CREATE INDEX idx_users_email ON users(email);

3.3 API Endpoints

AutenticaciΓ³n

POST   /api/auth/register          - Registrar nuevo usuario
POST   /api/auth/login             - Iniciar sesiΓ³n (retorna JWT)
POST   /api/auth/logout            - Cerrar sesiΓ³n
GET    /api/auth/me                - Obtener usuario actual

Renderizado de Documentos

GET    /docs/{path:path}           - Renderizar Markdown dinΓ‘micamente
                                     Ejemplo: /docs/curriculum/sprint_01/semana_01/01-clase_1_teoria

Progreso

GET    /api/progress/me            - Progreso del usuario actual
GET    /api/progress/team          - Progreso de todo el equipo
POST   /api/progress/task/{task_id}/mark - Marcar tarea (toggle status)
PATCH  /api/progress/{id}          - Actualizar notas de tarea

Sprints y Tareas

GET    /api/sprints                - Listar todos los sprints
GET    /api/sprints/{id}           - Obtener sprint especΓ­fico
GET    /api/sprints/{id}/tasks     - Obtener tareas del sprint
GET    /api/tasks/{id}             - Obtener tarea especΓ­fica

Usuarios (Admin only)

GET    /api/users                  - Listar todos los usuarios
GET    /api/users/{id}             - Obtener usuario especΓ­fico
PATCH  /api/users/{id}             - Actualizar usuario
DELETE /api/users/{id}             - Desactivar usuario

3.4 Estructura del Proyecto (Refactorizada)

salesforce_admin/
β”œβ”€β”€ app/                           # AplicaciΓ³n FastAPI
β”‚   β”œβ”€β”€ __init__.py
β”‚   β”œβ”€β”€ main.py                    # Entry point
β”‚   β”œβ”€β”€ config.py                  # ConfiguraciΓ³n (env vars)
β”‚   β”œβ”€β”€ database.py                # DB connection
β”‚   β”œβ”€β”€ dependencies.py            # Dependency injection
β”‚   β”œβ”€β”€ models/                    # SQLAlchemy models
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   β”œβ”€β”€ user.py
β”‚   β”‚   β”œβ”€β”€ sprint.py
β”‚   β”‚   β”œβ”€β”€ task.py
β”‚   β”‚   └── progress.py
β”‚   β”œβ”€β”€ schemas/                   # Pydantic schemas
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   β”œβ”€β”€ user.py
β”‚   β”‚   β”œβ”€β”€ sprint.py
β”‚   β”‚   β”œβ”€β”€ task.py
β”‚   β”‚   └── progress.py
β”‚   β”œβ”€β”€ routers/                   # API routes
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   β”œβ”€β”€ auth.py
β”‚   β”‚   β”œβ”€β”€ docs.py                # Markdown rendering
β”‚   β”‚   β”œβ”€β”€ progress.py
β”‚   β”‚   β”œβ”€β”€ sprints.py
β”‚   β”‚   └── users.py
β”‚   β”œβ”€β”€ services/                  # Business logic
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   β”œβ”€β”€ auth_service.py
β”‚   β”‚   β”œβ”€β”€ markdown_service.py    # Markdown β†’ HTML
β”‚   β”‚   β”œβ”€β”€ progress_service.py
β”‚   β”‚   └── task_service.py
β”‚   β”œβ”€β”€ middleware/
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   β”œβ”€β”€ auth.py
β”‚   β”‚   β”œβ”€β”€ cors.py
β”‚   β”‚   └── logging.py
β”‚   β”œβ”€β”€ templates/                 # Jinja2 templates
β”‚   β”‚   β”œβ”€β”€ base.html
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”œβ”€β”€ navbar.html
β”‚   β”‚   β”‚   β”œβ”€β”€ sidebar.html
β”‚   β”‚   β”‚   └── breadcrumbs.html
β”‚   β”‚   β”œβ”€β”€ auth/
β”‚   β”‚   β”‚   β”œβ”€β”€ login.html
β”‚   β”‚   β”‚   └── register.html
β”‚   β”‚   β”œβ”€β”€ dashboard.html
β”‚   β”‚   β”œβ”€β”€ doc_viewer.html        # Renderiza Markdown
β”‚   β”‚   └── team.html
β”‚   └── static/                    # Assets estΓ‘ticos
β”‚       β”œβ”€β”€ css/
β”‚       β”‚   β”œβ”€β”€ tailwind.css
β”‚       β”‚   └── custom.css
β”‚       β”œβ”€β”€ js/
β”‚       β”‚   β”œβ”€β”€ alpine.js
β”‚       β”‚   └── app.js
β”‚       └── images/
β”œβ”€β”€ content/                       # Contenido Markdown (sin cambios)
β”‚   β”œβ”€β”€ curriculum/
β”‚   β”œβ”€β”€ Superbadges/
β”‚   β”œβ”€β”€ Practica_Financiera/
β”‚   └── Gestor_de_Versiones/
β”œβ”€β”€ tests/                         # Tests
β”‚   β”œβ”€β”€ __init__.py
β”‚   β”œβ”€β”€ conftest.py
β”‚   β”œβ”€β”€ test_auth.py
β”‚   β”œβ”€β”€ test_markdown.py
β”‚   β”œβ”€β”€ test_progress.py
β”‚   └── test_api.py
β”œβ”€β”€ alembic/                       # DB migrations
β”‚   β”œβ”€β”€ versions/
β”‚   └── env.py
β”œβ”€β”€ docs/                          # DocumentaciΓ³n del proyecto
β”‚   β”œβ”€β”€ SDLC.md                    # Este documento
β”‚   β”œβ”€β”€ DEVELOPMENT_RULES.md       # Reglas de desarrollo
β”‚   β”œβ”€β”€ ROADMAP.md                 # Roadmap del proyecto
β”‚   β”œβ”€β”€ TASK_LIST.md               # Lista de tareas
β”‚   β”œβ”€β”€ IMPLEMENTATION_PLAN.md     # Plan de implementaciΓ³n
β”‚   β”œβ”€β”€ API.md                     # DocumentaciΓ³n de API
β”‚   └── DEPLOYMENT.md              # GuΓ­a de deploy
β”œβ”€β”€ scripts/                       # Scripts de utilidad
β”‚   β”œβ”€β”€ seed_data.py               # Cargar datos iniciales
β”‚   β”œβ”€β”€ sync_tasks.py              # Sincronizar tareas desde Markdown
β”‚   └── backup_db.py               # Backup de base de datos
β”œβ”€β”€ .env.example                   # Ejemplo de variables de entorno
β”œβ”€β”€ .gitignore
β”œβ”€β”€ requirements.txt               # Dependencias Python
β”œβ”€β”€ docker-compose.yml             # Para desarrollo local
β”œβ”€β”€ render.yaml                    # ConfiguraciΓ³n de Render
└── README.md                      # README principal


Fase 4: Desarrollo

4.1 Stack TecnolΓ³gico

Capa TecnologΓ­a VersiΓ³n JustificaciΓ³n
Backend FastAPI 0.109+ Async, rΓ‘pido, autodocumentaciΓ³n
ORM SQLAlchemy 2.0+ ORM maduro, async support
Database PostgreSQL 15+ Relacional, robusto
Auth python-jose 3.3+ JWT tokens
Password passlib[bcrypt] 1.7+ Bcrypt hashing
Markdown python-markdown 3.5+ Markdown β†’ HTML
Templates Jinja2 3.1+ Server-side rendering
JS Framework Alpine.js 3.13+ Interactividad (3KB)
CSS TailwindCSS 3.4+ Utility-first
Testing pytest 7.4+ Unit & integration tests
Migrations Alembic 1.13+ DB schema versioning
Deploy Render - Free tier, auto-deploy

4.2 Convenciones de CΓ³digo

Python (PEP 8 + Black + isort)

# Imports ordenados (isort)
from typing import List, Optional

from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session

from app.models.user import User
from app.schemas.user import UserCreate
from app.services.auth_service import AuthService

# Naming conventions
class UserService:                    # PascalCase para clases
    def get_user_by_email(self):      # snake_case para mΓ©todos
        user_email = "test@example.com"  # snake_case para variables

# Type hints obligatorios
def create_user(
    user_data: UserCreate,
    db: Session = Depends(get_db)
) -> User:
    """
    Crea un nuevo usuario en el sistema.
    
    Args:
        user_data: Datos del usuario a crear
        db: SesiΓ³n de base de datos
        
    Returns:
        User: Usuario creado
        
    Raises:
        ValueError: Si el email ya existe
    """
    pass

# Constants en UPPER_CASE
MAX_LOGIN_ATTEMPTS = 5
DEFAULT_PAGE_SIZE = 20

Git Commits (Conventional Commits)

feat(auth): add JWT token refresh endpoint
fix(markdown): correct relative link resolution
docs(api): update progress endpoints documentation
test(users): add unit tests for user service
refactor(models): simplify user_progress relationship
style(frontend): format templates with prettier
chore(deps): update fastapi to 0.109.0

4.3 Proceso de Desarrollo

Workflow de Git

main (production)
  ↑
develop (staging)
  ↑
feature/add-markdown-renderer
feature/implement-auth
hotfix/fix-login-error

Pull Request Template

## DescripciΓ³n
[DescripciΓ³n clara de los cambios]

## Tipo de cambio
- [ ] Bug fix
- [ ] Nueva feature
- [ ] Breaking change
- [ ] DocumentaciΓ³n

## Checklist
- [ ] Tests agregados/actualizados
- [ ] DocumentaciΓ³n actualizada
- [ ] Code review solicitado
- [ ] CI/CD pasa

Fase 5: Pruebas

5.1 Estrategia de Testing

        /\
       /  \      E2E Tests (5%)
      /────\     - Playwright
     /      \    - User flows crΓ­ticos
    /────────\   
   /          \  Integration Tests (20%)
  /────────────\ - API endpoints
 /              \- DB queries
/────────────────\
  Unit Tests (75%)
  - Services
  - Models
  - Utilities

5.2 Coverage Goal

MΓ­nimo aceptable: 75% coverage
Objetivo: 85% coverage

pytest --cov=app --cov-report=html --cov-report=term

Fase 6: ImplementaciΓ³n (Deployment)

6.1 Proceso de Deploy en Render

render.yaml

services:
  - type: web
    name: salesforce-admin-platform
    env: python
    buildCommand: |
      pip install -r requirements.txt
      alembic upgrade head
      python scripts/seed_data.py
    startCommand: uvicorn app.main:app --host 0.0.0.0 --port $PORT
    envVars:
      - key: DATABASE_URL
        fromDatabase:
          name: salesforce-admin-db
          property: connectionString
      - key: SECRET_KEY
        generateValue: true
      - key: ENVIRONMENT
        value: production

databases:
  - name: salesforce-admin-db
    databaseName: salesforce_admin
    user: admin

6.2 Checklist Pre-Deploy


Fase 7: Mantenimiento

7.1 Monitoreo

MΓ©tricas:

Herramientas:

7.2 Backup Strategy


πŸ“Š MΓ©tricas de Γ‰xito

MΓ©trica Objetivo v0.30.0
AdopciΓ³n 90% del equipo usa la plataforma
Engagement Usuarios activos 4+ veces/semana
Performance 95% requests < 500ms
Bugs < 3 bugs crΓ­ticos en primer mes
SatisfacciΓ³n NPS > 8/10

Documento creado por: Equipo VISIONARY ADMINS
Última actualización: 17 Enero 2026
VersiΓ³n: 1.0