# REPORTE-MANUFACTURING-E1B — Sweet Works ERP
**Módulo:** Manufacturing MES  
**Etapa:** 1B — Corrección Arquitectónica Work Center vs Resource  
**Fecha:** 30/08/2026  
**Estado:** Completo

---

## Problema detectado

En Etapa 1, los `mfg_work_centers` fueron diseñados como máquinas individuales (capacidad/hora, eficiencia%, turnos). Esto es incorrecto según el estándar ERP (SAP, Dynamics, SyteLine):

| Concepto ERP estándar | Descripción | Ejemplo El Rosal |
|---|---|---|
| **Work Center** | Unidad organizacional: planta o área | Planta Caramelo, Planta Bombón |
| **Resource** | Máquina/línea dentro de la planta | Mezcladora, Cocinador, Línea 1-Figura |

---

## Cambios realizados

### Migraciones (4 nuevas)

| Archivo | Descripción |
|---|---|
| `2026_08_30_000007_update_mfg_work_centers_for_plants.php` | Quita columnas de máquina; agrega `location`, `manager`, `shifts_count` |
| `2026_08_30_000008_create_mfg_resources_table.php` | Tabla `mfg_resources` con FK a `mfg_work_centers` |
| `2026_08_30_000009_update_routing_operations_resource.php` | Renombra `work_center_id` → `resource_id` en `mfg_routing_operations`; FK → `mfg_resources` |
| `2026_08_30_000010_update_planning_parameters_resource.php` | Renombra `primary_work_center_id` → `primary_resource_id`; FK → `mfg_resources` |

### Modelos

| Modelo | Versión | Cambios |
|---|---|---|
| `MfgWorkCenter.php` | v1.1 | Fillable: `location`, `manager`, `shifts_count`. Relación `resources()` hasMany. Sin accessor `effectiveCapacityPerShift`. |
| `MfgResource.php` | v1.0 | **Nuevo.** Todos los campos de capacidad. Accessor `effectiveCapacityPerShift`. Relaciones `workCenter()` y `routingOperations()`. |
| `MfgRoutingOperation.php` | v1.1 | `resource_id` en fillable. Relación `resource()` belongsTo MfgResource. |
| `MfgPlanningParameter.php` | v1.1 | `primary_resource_id` en fillable. Relación `primaryResource()` belongsTo MfgResource. |

### Seeders

| Seeder | Versión | Cambios |
|---|---|---|
| `MfgWorkCenterSeeder.php` | v1.1 | Seeds 3 plantas: WC-01 Planta Caramelo (Nave A), WC-02 Planta Bombón (Nave B), WC-03 Planta Mazapán/Cacahuate (Nave C). |
| `MfgResourceSeeder.php` | v1.0 | **Nuevo.** Seeds RES-01…RES-10 bajo WC-01 (Mezcladora, Olla, Cocinador, Mesa, Líneas 1-4, Bombos, Envolvedoras). |
| `ManufacturingPermissionsSeeder.php` | v1.1 | Agrega: `manufacturing.resource.create`, `manufacturing.resource.edit`, `manufacturing.resource.delete`. Total: 18 permisos. |
| `MfgRoutingSeeder.php` | v1.1 | Usa `resource_id` (RES-01…RES-04) en lugar de `work_center_id`. |

### Controladores

| Controlador | Versión | Cambios |
|---|---|---|
| `WorkCenterController.php` | v1.1 | Validación: `location`, `manager`, `shifts_count`. Sin `capacity_*`. `show()` carga `resources()`. |
| `RoutingController.php` | v1.1 | Usa `MfgResource` en lugar de `MfgWorkCenter`. Pasa `$resources` con `->with('workCenter')`. Valida `operations.*.resource_id`. |
| `PlanningParameterController.php` | v1.1 | Usa `MfgResource`. Pasa `$resources`. Valida `primary_resource_id`. Alias `$param`. |
| `ResourceController.php` | v1.0 | **Nuevo.** CRUD completo: index (filtros por planta/status/search), create, store, show, edit, update, toggleActive. |

### Rutas

**`Manufacturing/Routes/web.php` v1.1** — Grupo `/resources` añadido:
```
GET    /manufacturing/resources              → resources.index
GET    /manufacturing/resources/create      → resources.create
POST   /manufacturing/resources             → resources.store
POST   /manufacturing/resources/toggle/{r}  → resources.toggle
GET    /manufacturing/resources/{r}         → resources.show
GET    /manufacturing/resources/{r}/edit    → resources.edit
PUT    /manufacturing/resources/{r}         → resources.update
```
Middleware: `manufacturing.resource.create` en create/store, `manufacturing.resource.edit` en edit/update/toggle.

### Vistas actualizadas

| Vista | Versión | Cambios clave |
|---|---|---|
| `work-centers/index.blade.php` | v1.1 | Columnas: Ubicación, Responsable, Turnos, Recursos (badge-link) |
| `work-centers/create.blade.php` | v1.1 | Campos de planta. Nota informativa sobre Recursos. |
| `work-centers/edit.blade.php` | v1.1 | Campos de planta. |
| `work-centers/show.blade.php` | v1.1 | Tab Recursos: tabla de `mfg_resources` de la planta. |
| `routings/create.blade.php` | v1.1 | `$resources` con `wc_code`; campo `resource_id`. |
| `routings/edit.blade.php` | v1.1 | Igual que create; pre-carga operaciones con `resource_id`. |
| `routings/show.blade.php` | v1.1 | Muestra columna Recurso y Planta. `$op->resource->code`. |
| `planning-parameters/create.blade.php` | v1.1 | Select `primary_resource_id`. |
| `planning-parameters/edit.blade.php` | v1.1 | Variable `$param`; `primary_resource_id`. |
| `planning-parameters/show.blade.php` | v1.1 | `$param->primaryResource->workCenter`. |

### Vistas nuevas (Resources CRUD)

| Vista | Descripción |
|---|---|
| `resources/index.blade.php` | Tabla con filtros por planta/status. Columna Cap. Efectiva/turno. |
| `resources/create.blade.php` | Form: código, nombre, tipo, planta (select), capacidad. |
| `resources/edit.blade.php` | Pre-carga todos los campos. |
| `resources/show.blade.php` | DL datos + tabla operaciones de routing que usan el recurso. |

### Navegación

**`unity-navigation.blade.php` v3.1** — Ítem "Recursos (Máq. y Líneas)" bajo Manufacturing:
```blade
@can('manufacturing.resource.create')
<li class="{{ request()->routeIs('manufacturing.resources.*') ? 'active' : '' }}">
    <a href="{{ route('manufacturing.resources.index') }}">
        <i class="bi bi-cpu me-1"></i>
        <span class="nav-link-text">Recursos (Máq. y Líneas)</span>
    </a>
</li>
@endcan
```

---

## Arquitectura final del módulo

```
mfg_work_centers (Plantas)
└── mfg_resources (Máquinas/Líneas)
    └── mfg_routing_operations.resource_id FK
    └── mfg_planning_parameters.primary_resource_id FK
```

**Plantas El Rosal (seeded):**
- WC-01 Planta Caramelo / Nave A
- WC-02 Planta Bombón / Nave B  
- WC-03 Planta Mazapán y Cacahuate / Nave C

**Recursos seeded (todos bajo WC-01):**
RES-01 Mezcladora, RES-02 Olla Reposo, RES-03 Cocinador, RES-04 Mesa Enfriamiento,  
RES-05 Línea 1-Figura, RES-06 Línea 2-Bola 19g, RES-07 Línea 3-Caramelo 5g,  
RES-08 Línea 4-Bola 10g, RES-09 Bombos, RES-10 Envolvedoras

---

## Instrucciones de instalación

```bash
php artisan migrate
php artisan db:seed --class="App\Modules\Manufacturing\Database\Seeders\ManufacturingPermissionsSeeder"
php artisan db:seed --class="App\Modules\Manufacturing\Database\Seeders\MfgWorkCenterSeeder"
php artisan db:seed --class="App\Modules\Manufacturing\Database\Seeders\MfgResourceSeeder"
php artisan permission:cache-reset
# Opcional (requiere producto SFG-CARAMELO-BASE en BD):
php artisan db:seed --class="App\Modules\Manufacturing\Database\Seeders\MfgRoutingSeeder"
```

O usar: `instalar_manufacturing_etapa1b.bat`

---

## Permisos (18 total)

```
manufacturing.access
manufacturing.workcenter.create / .edit / .delete
manufacturing.bom.create / .edit / .delete
manufacturing.routing.create / .edit / .delete
manufacturing.planning.create / .edit / .delete (was planning_params)
manufacturing.resource.create / .edit / .delete  ← NUEVOS en v1.1
```
