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:
Preventivo
Predictivo
Correctivo
Tipo: preventivo
Scheduled maintenance to prevent failures:
- Regular inspections
- Scheduled component replacement
- Calibration and adjustment
- Cleaning and lubrication
Creating Work Orders
Identify the need
Work orders originate from scheduled maintenance, failure reports, or predictive analysis.
Assign personnel
Designate a supervisor and lead technician for the work.
Set work type
Classify as preventivo, predictivo, or correctivo.
Create the work order
Generate Mantenimiento record with estado “abierto”.
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
{
"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:
Session 1: Diagnosis
Session 2: Parts Arrival
Session 3: Testing
{
"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
{
"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
Create work order (abierto)
Supervisor creates Mantenimiento record with estado “abierto”.
Technician begins work (en_proceso)
Lead technician updates estado to “en_proceso” when starting.
Record work sessions
Technicians create SesionesMantenimiento entries for each work period.
Document parts used
Record RepuestoUsado entries for all parts consumed.
Complete work (completado)
Technician updates estado to “completado” when finished.
Supervisor validates
Supervisor inspects work and sets validado to true.
Close work order
Set fecha_cierre and calculate final costo_total.
Return asset to service
Update asset estado back to “operativo”.
Querying Work Orders
Get Open Work Orders
Get Work by Technician
Get Work by Asset
Get Completed Unvalidated Work
// 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
$mantenimiento = Mantenimiento :: find ( $id );
$activo = $mantenimiento -> activo ;
echo "Asset: { $activo -> articulo -> marca } { $activo -> articulo -> modelo }" ;
echo "Location: { $activo -> ubicacion -> edificio }, { $activo -> ubicacion -> salon }" ;
$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
Technician Performance
Cost Analysis
Completion Time
Parts Usage
// 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
Document work thoroughly
Write detailed descriptions in work sessions. Future technicians will rely on this history for troubleshooting.
Record time accurately
Log actual hours worked, not estimated time. Accurate labor tracking is essential for cost analysis and planning.
Track all parts used
Record every part consumed, even small items. Complete parts tracking prevents inventory discrepancies.
Update status promptly
Keep work order estado current so supervisors and team members have accurate visibility.
Include observations
Note anything unusual, recommendations for future work, or conditions that might affect asset performance.
Close work orders properly
Ensure validation is complete and costs are calculated before closing. Don’t leave work orders in limbo.
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
User reports HVAC failure (creates Reporte with prioridad “alta”)
Supervisor reviews report and creates Mantenimiento work order
Technician begins diagnosis (creates SesionesMantenimiento #1)
Technician identifies failed capacitor and orders part
Part arrives, technician installs (creates SesionesMantenimiento #2)
Technician records part usage (creates RepuestoUsado)
Technician tests system (creates SesionesMantenimiento #3)
Technician marks work order as “completado”
Supervisor inspects repair and validates work
System calculates total cost (labor + parts)
Supervisor closes work order and related report
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.