# Módulo: Team Members

> **Estado:** ✅ Production-ready (2026-04-28)
> **Doc técnica:** [`docs/backend3.0/team_members/README.md`](../../backend3.0/team_members/README.md)

---

## 1. Identidad

| Campo | Valor |
|-------|-------|
| **Nombre** | TeamMembers |
| **Slug** | `team` |
| **Cores que lo usan** | 5 (law-firm-digital, real-estate, financial-wealth, agency, foundations-ong) |
| **Productos a la venta** | 1 de 8 (law-firm-digital) |
| **Modelo principal** | `App\Modules\TeamMembers\Models\TeamMember` |
| **Tabla principal** | `team_members` |
| **Tabla categorías** | `team_categories` |
| **Vista standalone** | `/team` |
| **Vista detail** | `/team/{slug}` |
| **CRUD admin** | `/admin/team-members` |

---

## 2. Defaults JSON — `database/seeders/project-data/defaults/team.json`

| Campo | Cantidad | Notas |
|-------|---------:|-------|
| Items principales | 5 | Genéricos universales |
| Categorías | 1 | "Nuestro equipo" |

5 miembros genéricos con: Dirección General, Coordinación de Proyectos, Especialista Senior, Equipo Técnico, Atención al Cliente. Cada uno con `image` apuntando a `cd-project/img/defaults/team/team-{1..5}.jpg`.

---

## 3. Asset pack — `public/cd-project/img/defaults/team/`

| Archivo | Dimensión aprox | Peso | Origen |
|---------|----------------|------|--------|
| team-1.jpg | ~600×600 | 32KB | demo real-estate |
| team-2.jpg | ~600×600 | 44KB | demo real-estate |
| team-3.jpg | ~600×600 | 112KB | demo real-estate |
| team-4.jpg | ~600×600 | 48KB | demo real-estate |
| team-5.jpg | ~600×600 | 64KB | demo real-estate |
| team-6.jpg | ~600×600 | 52KB | demo real-estate |

---

## 4. Variables expuestas vía ViewComposer

| Variable | Origen | Dónde se usa |
|----------|--------|--------------|
| `$teamMembers` | módulo team (cuando is_module_active) | welcome, about, contact, frontend.* |

`ViewComposerServiceProvider` línea 60-67: `TeamMember::where('is_active', true)->orderBy('name')->get()`.

---

## 5. Vistas

### Frontend
| Archivo | Notas |
|---------|-------|
| `resources/views/modules/team-members/frontend/team.blade.php` | Listing universal con isotope filter por categoría |
| `resources/views/modules/team-members/frontend/team-profile.blade.php` | Detail page por miembro |

### Demo-specific (en welcome/about del demo)
| Demo | Bloque | Render |
|------|--------|--------|
| demo-law-firm-2 | welcome.blade L424-501 | Owl carousel con cards (custom-card-style-1, min-height 510px scoped) |
| demo-law-firm-2 | about.blade L184-220 | Grid 3 columnas con avatars circulares 120×120 |

### Admin
| Archivo | Notas |
|---------|-------|
| `resources/views/modules/team-members/admin/index.blade.php` | DataTable + actions |
| (modal create/edit dentro del index) | |

---

## 6. CRUD admin

- **Ruta**: `/admin/team-members`
- **Permisos**: `team.view`, `team.create`, `team.edit`, `team.delete`
- **Funcionalidades**: listing + create/edit (modal o page) + delete + toggle active + categorías

---

## 7. Comandos artisan

| Comando | Función |
|---------|---------|
| `bewpro:clean-team` | Limpia team_members y team_categories |
| `bewpro:refresh-team` | Re-seedea desde defaults JSON |

---

## 8. Bugs arreglados (2026-04-28)

| Archivo | Bug | Fix |
|---------|-----|-----|
| `team-members/frontend/team.blade.php:48` | Fallback a `cd-project/product-5/img/team/default-team-member-img.png` (path obsoleto inexistente) | Helper inline con fallback a `defaults/team/team-{1..6}.jpg` rotativo |
| `demos/demo-law-firm-2/about.blade.php:194` | Usaba `$member->photo` (campo inexistente — el modelo tiene `image`) | Cambiado a `$member->image` con fallback a defaults |
| `demos/demo-law-firm-2/welcome.blade.php:445` | Fallback a `demos/law-firm-2/team/team-X.jpg` (assets del template Porto, no del producto) | Cambiado a `defaults/team/team-{1..6}.jpg` |
| `seeds/team-law-firm-digital.json` | 5 miembros sin campo `image` → renderizaba sin foto o con placeholder del template | Agregado campo `image` apuntando a defaults/team/ |
| `defaults/team.json` | Solo 2 miembros esqueléticos, sin `image` | Mejorado a 5 miembros con `image` defaults |

---

## 9. Auditoría — 30 items

| Bloque | Items pasan | Items fallan | Estado |
|--------|-------------|--------------|--------|
| 1. Identidad y código (4) | 4/4 | 0 | ✅ |
| 2. Defaults JSON (6) | 6/6 | 0 | ✅ |
| 3. Asset pack (5) | 5/5 | 0 | ✅ |
| 4. Vistas (6) | 6/6 | 0 | ✅ (post-fix) |
| 5. Integración sistema (5) | 5/5 | 0 | ✅ |
| 6. CRUD admin (4) | 4/4 | 0 | ✅ |
| **TOTAL** | **30/30** | 0 | ✅ |

**Veredicto**: ✅ Production-ready

---

## 10. Bugs conocidos / fuera de scope

- `team-profile.blade.php` (vista detail) no auditada en profundidad — funcional pero podría tener fallback similar al listing.
- Comandos `bewpro:clean-team` y `bewpro:refresh-team` existen pero no testeados en esta sesión.

---

## 11. Referencias

- Doc técnica: [`docs/backend3.0/team_members/README.md`](../../backend3.0/team_members/README.md)
- Demo integration pattern: [`DEMO-INTEGRATION-PATTERN.md`](DEMO-INTEGRATION-PATTERN.md)
- Producto que lo usa: [`../products/law-firm-digital.md`](../products/law-firm-digital.md)
