This commit is contained in:
Lizandro Guarnizo
2026-01-29 22:41:49 -05:00
parent 71239062ec
commit c624c571aa
3 changed files with 35 additions and 51 deletions
+20 -44
View File
@@ -104,7 +104,7 @@ class OrdenProduccion extends Model
$orden->referencia = '';
}
// Reserva de tela al crear cuando la OP usa una tela: restar metros_disponibles inmediatamente
// Reserva de tela al crear cuando la OP usa una tela: validar disponibilidad
if ($orden->tela_id && ($orden->metros_requeridos ?? 0) > 0) {
$tela = \App\Models\Tela::find($orden->tela_id);
if (! $tela) {
@@ -113,70 +113,46 @@ class OrdenProduccion extends Model
]);
}
if ($tela->metros_disponibles < $orden->metros_requeridos) {
// Calcular metros ya usados por otras OPs
$metrosUsados = \App\Models\OrdenProduccion::where('tela_id', $orden->tela_id)->sum('metros_requeridos');
$disponible = max(0, $tela->metros_comprados - $metrosUsados);
if ($disponible < $orden->metros_requeridos) {
throw \Illuminate\Validation\ValidationException::withMessages([
'metros_requeridos' => 'No hay suficientes metros disponibles para reservar (' . $tela->metros_disponibles . ').',
'metros_requeridos' => 'No hay suficientes metros disponibles para reservar (' . $disponible . ' disponibles).',
]);
}
// Reservar: restar metros y marcar orden
$tela->metros_disponibles = $tela->metros_disponibles - $orden->metros_requeridos;
$tela->save();
$orden->tela_reservada = true;
}
});
// Validar y reservar tela al cambiar de estado a 'en_corte'
// Validar disponibilidad de tela al actualizar
static::updating(function ($orden) {
// Validación: si se especifica tela y metros_requeridos, verificar disponibilidad
if ($orden->tela_id && $orden->metros_requeridos !== null) {
$tela = \App\Models\Tela::find($orden->tela_id);
$originalMetros = $orden->getOriginal('metros_requeridos') ?? 0;
$reservedAlready = $orden->tela_reservada ? $originalMetros : 0;
$available = $tela ? ($tela->metros_disponibles + $reservedAlready) : null;
// Calcular metros usados por otras OPs (excluyendo esta OP)
$metrosUsadosOtros = \App\Models\OrdenProduccion::where('tela_id', $orden->tela_id)
->where('id', '!=', $orden->id)
->sum('metros_requeridos');
$disponible = max(0, $tela->metros_comprados - $metrosUsadosOtros);
if ($available !== null && $orden->metros_requeridos > $available) {
if ($orden->metros_requeridos > $disponible) {
throw \Illuminate\Validation\ValidationException::withMessages([
'metros_requeridos' => 'No hay suficientes metros de tela disponibles. Disponibles: ' . ($available),
'metros_requeridos' => 'No hay suficientes metros de tela disponibles. Disponibles: ' . $disponible,
]);
}
}
// Ajustes automáticos de reserva cuando cambia la tela o los metros requeridos
$originalTelaId = $orden->getOriginal('tela_id');
$originalMetros = $orden->getOriginal('metros_requeridos') ?? 0;
$newTelaId = $orden->tela_id;
$newMetros = $orden->metros_requeridos ?? 0;
// Si cambió la tela en la OP, devolver los metros reservados en la tela anterior (si aplica)
if ($originalTelaId && $originalTelaId != $newTelaId && $originalMetros > 0) {
$oldTela = \App\Models\Tela::find($originalTelaId);
if ($oldTela) {
$oldTela->metros_disponibles = $oldTela->metros_disponibles + $originalMetros;
$oldTela->save();
}
}
// Reservar metros en la nueva tela si se cambió
if ($newTelaId && $originalTelaId != $newTelaId && $newMetros > 0) {
$newTela = \App\Models\Tela::find($newTelaId);
if (! $newTela) {
throw \Illuminate\Validation\ValidationException::withMessages([
'tela_id' => 'No se encontró la tela asociada.',
]);
}
if ($newTela->metros_disponibles < $newMetros) {
throw \Illuminate\Validation\ValidationException::withMessages([
'metros_requeridos' => 'No hay suficientes metros disponibles para reservar (' . $newTela->metros_disponibles . ').',
]);
}
$newTela->metros_disponibles = $newTela->metros_disponibles - $newMetros;
$newTela->save();
// Marcar como reservada si tiene tela y metros
if ($orden->tela_id && $orden->metros_requeridos > 0) {
$orden->tela_reservada = true;
}
});
// Si la misma tela y cambiaron los metros, ajustar la diferencia
if ($originalTelaId == $newTelaId && $originalMetros != $newMetros && $newTelaId) {