Skip to main content

Overview

GIMA provides comprehensive work tracking through maintenance work orders (Mantenimiento) and detailed work sessions (SesionesMantenimiento). This system captures labor hours, parts used, costs, and work performed.

Work Order Model

Mantenimiento Structure

Work orders represent complete maintenance activities:
class Mantenimiento extends Model
{
    protected $table = 'mantenimientos';
    
    protected $fillable = [
        'activo_id',              // Asset being maintained
        'supervisor_id',          // Supervising user
        'tecnico_principal_id',   // Lead technician
        'tipo',                   // Maintenance type
        'reporte_id',             // Associated failure report (if any)
        'fecha_apertura',         // Start date
        'fecha_cierre',           // Completion date
        'estado',                 // Current status
        'descripcion',            // Work description
        'validado',               // Supervisor validation
        'costo_total',            // Total cost
    ];
    
    protected $casts = [
        'estado' => 'string',
        'tipo' => 'string',
        'fecha_apertura' => 'datetime',
        'fecha_cierre' => 'datetime',
        'validado' => 'boolean',
        'costo_total' => 'decimal:2',
    ];
}

Work Session Model

SesionesMantenimiento Structure

Work sessions track individual work periods within a maintenance order:
class SesionesMantenimiento extends Model
{
    protected $table = 'sesiones_mantenimiento';
    
    protected $fillable = [
        'mantenimiento_id',       // Parent work order
        'tecnico_id',             // Technician who worked
        'fecha',                  // Session date
        'horas_trabajadas',       // Hours worked
        'observaciones',          // Session notes
        'descripcion_trabajo',    // Work performed
        'costo_hora',             // Hourly rate
    ];
    
    protected $casts = [
        'fecha' => 'datetime',
        'horas_trabajadas' => 'decimal:2',
        'costo_hora' => 'decimal:2',
    ];
}

Maintenance Types

Work orders are classified by maintenance type:
Tipo: preventivo

Scheduled maintenance to prevent failures:
- Regular inspections
- Scheduled component replacement
- Calibration and adjustment
- Cleaning and lubrication

Creating Work Orders

1

Identify the need

Work orders originate from scheduled maintenance, failure reports, or predictive analysis.
2

Assign personnel

Designate a supervisor and lead technician for the work.
3

Set work type

Classify as preventivo, predictivo, or correctivo.
4

Create the work order

Generate Mantenimiento record with estado “abierto”.
5

Track work sessions

Technicians create SesionesMantenimiento entries as work progresses.

Example Work Order Creation

Creating work orders typically requires supervisor or admin roles.

From Failure Report

Create Corrective Maintenance
{
  "activo_id": 12,
  "supervisor_id": 3,
  "tecnico_principal_id": 5,
  "tipo": "correctivo",
  "reporte_id": 47,
  "fecha_apertura": "2024-03-06 10:30:00",
  "estado": "abierto",
  "descripcion": "Reparar aire acondicionado que no arranca. Reportado por usuario. Posible falla en compresor o capacitor.",
  "validado": false
}

From Scheduled Maintenance

Create Preventive Maintenance
{
  "activo_id": 8,
  "supervisor_id": 3,
  "tecnico_principal_id": 7,
  "tipo": "preventivo",
  "fecha_apertura": "2024-03-15 08:00:00",
  "estado": "abierto",
  "descripcion": "Mantenimiento trimestral de bomba de agua. Incluye cambio de aceite, inspección de sellos, y verificación de alineación.",
  "validado": false
}

From Predictive Analysis

Create Predictive Maintenance
{
  "activo_id": 15,
  "supervisor_id": 4,
  "tecnico_principal_id": 6,
  "tipo": "predictivo",
  "fecha_apertura": "2024-03-10 09:00:00",
  "estado": "abierto",
  "descripcion": "Análisis de vibración detectó desbalanceo en motor. Realizar balanceo dinámico y verificar rodamientos.",
  "validado": false
}

Recording Work Sessions

Technicians create session records to track time and work performed:

Example Work Session

Session Record
{
  "mantenimiento_id": 125,
  "tecnico_id": 5,
  "fecha": "2024-03-06 11:00:00",
  "horas_trabajadas": 3.5,
  "descripcion_trabajo": "Diagnóstico inicial: Capacitor de arranque del compresor falló. Removido panel de acceso, medido voltaje (OK), probado capacitor (0 µF, debe ser 45 µF). Ordenado repuesto #CAP-45MFD. Limpiado serpentines durante espera.",
  "observaciones": "Capacitor original tiene 8 años. Recomendar reemplazo preventivo en otras unidades del mismo año.",
  "costo_hora": 25.00
}

Multiple Sessions

Complex work often requires multiple sessions:
{
  "mantenimiento_id": 125,
  "tecnico_id": 5,
  "fecha": "2024-03-06 11:00:00",
  "horas_trabajadas": 2.0,
  "descripcion_trabajo": "Diagnóstico: Capacitor de arranque falló. Ordenado repuesto.",
  "observaciones": "Necesita parte #CAP-45MFD",
  "costo_hora": 25.00
}

Tracking Parts Used

RepuestoUsado Model

Parts consumed during maintenance are tracked:
class RepuestoUsado extends Model
{
    protected $fillable = [
        'sesion_id',      // Work session
        'repuesto_id',    // Part used
        'cantidad',       // Quantity
        'costo_unitario', // Unit cost
    ];
}

Recording Part Usage

Part Used Record
{
  "sesion_id": 342,
  "repuesto_id": 28,
  "cantidad": 1,
  "costo_unitario": 45.50
}
This automatically:
  • Reduces repuesto stock by cantidad
  • Adds part cost to session total
  • Triggers reorder notification if stock falls below minimum

Calculating Costs

Labor Costs

// Calculate labor cost for a session
$sesion = SesionesMantenimiento::find($id);
$laborCost = $sesion->horas_trabajadas * $sesion->costo_hora;

// Example: 3.5 hours * $25/hour = $87.50

Parts Costs

// Calculate parts cost for a session
$sesion = SesionesMantenimiento::find($id);
$partsCost = $sesion->repuestosUtilizados()->sum(
    DB::raw('cantidad * costo_unitario')
);

Total Work Order Cost

// Calculate total maintenance order cost
$mantenimiento = Mantenimiento::find($id);

$totalLaborCost = $mantenimiento->sesiones->sum(function($sesion) {
    return $sesion->horas_trabajadas * $sesion->costo_hora;
});

$totalPartsCost = $mantenimiento->sesiones->sum(function($sesion) {
    return $sesion->repuestosUtilizados->sum(function($repuesto) {
        return $repuesto->cantidad * $repuesto->costo_unitario;
    });
});

$mantenimiento->costo_total = $totalLaborCost + $totalPartsCost;
$mantenimiento->save();

Work Order Workflow

1

Create work order (abierto)

Supervisor creates Mantenimiento record with estado “abierto”.
2

Technician begins work (en_proceso)

Lead technician updates estado to “en_proceso” when starting.
3

Record work sessions

Technicians create SesionesMantenimiento entries for each work period.
4

Document parts used

Record RepuestoUsado entries for all parts consumed.
5

Complete work (completado)

Technician updates estado to “completado” when finished.
6

Supervisor validates

Supervisor inspects work and sets validado to true.
7

Close work order

Set fecha_cierre and calculate final costo_total.
8

Return asset to service

Update asset estado back to “operativo”.

Querying Work Orders

// Get all open maintenance orders
$abiertos = Mantenimiento::whereIn('estado', ['abierto', 'en_proceso'])
    ->with(['activo.articulo', 'tecnicoPrincipal', 'supervisor'])
    ->orderBy('fecha_apertura', 'asc')
    ->get();

Work Order Relationships

Asset Information

$mantenimiento = Mantenimiento::find($id);
$activo = $mantenimiento->activo;

echo "Asset: {$activo->articulo->marca} {$activo->articulo->modelo}";
echo "Location: {$activo->ubicacion->edificio}, {$activo->ubicacion->salon}";

Personnel Information

$mantenimiento = Mantenimiento::find($id);

echo "Supervisor: {$mantenimiento->supervisor->name}";
echo "Lead Tech: {$mantenimiento->tecnicoPrincipal->name}";
$mantenimiento = Mantenimiento::find($id);

if ($mantenimiento->reporte_id) {
    $reporte = $mantenimiento->reporte;
    echo "Original Report: {$reporte->descripcion}";
    echo "Priority: {$reporte->prioridad}";
}

Work Sessions

$mantenimiento = Mantenimiento::find($id);
$sesiones = $mantenimiento->sesiones;

echo "Total sessions: {$sesiones->count()}";
echo "Total hours: {$sesiones->sum('horas_trabajadas')}";

Work Session Details

Session with Parts

$sesion = SesionesMantenimiento::with('repuestosUtilizados.repuesto')
    ->find($id);

echo "Technician: {$sesion->tecnico->name}";
echo "Hours: {$sesion->horas_trabajadas}";
echo "Labor cost: $" . ($sesion->horas_trabajadas * $sesion->costo_hora);

echo "Parts used:";
foreach ($sesion->repuestosUtilizados as $uso) {
    echo "- {$uso->repuesto->descripcion}: {$uso->cantidad} @ ${$uso->costo_unitario}";
}

Supervisor Validation

Only supervisors should be able to validate completed work. Validation is essential for quality control and cost approval.

Validation Process

// Supervisor validates completed work
$mantenimiento = Mantenimiento::find($id);

if ($mantenimiento->estado === 'completado') {
    // Inspect work quality
    // Verify parts usage
    // Confirm asset operation
    
    $mantenimiento->validado = true;
    $mantenimiento->fecha_cierre = now();
    $mantenimiento->save();
    
    // Update related report if exists
    if ($mantenimiento->reporte_id) {
        $reporte = $mantenimiento->reporte;
        $reporte->estado = 'cerrado';
        $reporte->save();
    }
    
    // Return asset to service
    $mantenimiento->activo->estado = EstadoActivo::OPERATIVO;
    $mantenimiento->activo->save();
}

Work Analytics

// Average work time by technician
$technicianStats = SesionesMantenimiento::selectRaw('
    tecnico_id,
    COUNT(*) as session_count,
    SUM(horas_trabajadas) as total_hours,
    AVG(horas_trabajadas) as avg_hours_per_session
')
->groupBy('tecnico_id')
->with('tecnico')
->get();

Best Practices

1

Document work thoroughly

Write detailed descriptions in work sessions. Future technicians will rely on this history for troubleshooting.
2

Record time accurately

Log actual hours worked, not estimated time. Accurate labor tracking is essential for cost analysis and planning.
3

Track all parts used

Record every part consumed, even small items. Complete parts tracking prevents inventory discrepancies.
4

Update status promptly

Keep work order estado current so supervisors and team members have accurate visibility.
5

Include observations

Note anything unusual, recommendations for future work, or conditions that might affect asset performance.
6

Close work orders properly

Ensure validation is complete and costs are calculated before closing. Don’t leave work orders in limbo.
7

Review historical data

Analyze past maintenance records when planning new work. Learn from previous experiences with the same asset.

Example Complete Workflow

Scenario: Air Conditioner Failure

  1. User reports HVAC failure (creates Reporte with prioridad “alta”)
  2. Supervisor reviews report and creates Mantenimiento work order
  3. Technician begins diagnosis (creates SesionesMantenimiento #1)
  4. Technician identifies failed capacitor and orders part
  5. Part arrives, technician installs (creates SesionesMantenimiento #2)
  6. Technician records part usage (creates RepuestoUsado)
  7. Technician tests system (creates SesionesMantenimiento #3)
  8. Technician marks work order as “completado”
  9. Supervisor inspects repair and validates work
  10. System calculates total cost (labor + parts)
  11. Supervisor closes work order and related report
  12. Asset status returns to “operativo”
The complete audit trail from initial failure report through work completion provides valuable data for reliability analysis, cost tracking, and continuous improvement initiatives.

Build docs developers (and LLMs) love