up
This commit is contained in:
@@ -43,7 +43,7 @@ class OrdenProduccionResource extends Resource
|
|||||||
->required()
|
->required()
|
||||||
->maxLength(255),
|
->maxLength(255),
|
||||||
|
|
||||||
TextInput::make('referencia')
|
TextInput::make('referencia')
|
||||||
->required()
|
->required()
|
||||||
->maxLength(255),
|
->maxLength(255),
|
||||||
|
|
||||||
@@ -59,6 +59,15 @@ class OrdenProduccionResource extends Resource
|
|||||||
->preload()
|
->preload()
|
||||||
->nullable(),
|
->nullable(),
|
||||||
|
|
||||||
|
TextInput::make('metros_requeridos')
|
||||||
|
->label('Metros requeridos')
|
||||||
|
->numeric()
|
||||||
|
->required()
|
||||||
|
->minValue(0)
|
||||||
|
->reactive()
|
||||||
|
->helperText(fn ($get) => $get('tela_id') ? 'Máx. disponible: ' . (\App\Models\Tela::find($get('tela_id'))->metros_disponibles ?? 0) : 'Selecciona una tela')
|
||||||
|
->default(0),
|
||||||
|
|
||||||
DatePicker::make('fecha_inicio')
|
DatePicker::make('fecha_inicio')
|
||||||
->required(),
|
->required(),
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ class OrdenProduccion extends Model
|
|||||||
'fecha_inicio',
|
'fecha_inicio',
|
||||||
'fecha_entrega_estimada',
|
'fecha_entrega_estimada',
|
||||||
'estado',
|
'estado',
|
||||||
|
'metros_requeridos',
|
||||||
|
'tela_reservada',
|
||||||
];
|
];
|
||||||
|
|
||||||
public function tela()
|
public function tela()
|
||||||
@@ -97,5 +99,62 @@ class OrdenProduccion extends Model
|
|||||||
$orden->numero_orden = 'OP-' . str_pad($ultimoId, 6, '0', STR_PAD_LEFT);
|
$orden->numero_orden = 'OP-' . str_pad($ultimoId, 6, '0', STR_PAD_LEFT);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Validar y reservar tela al cambiar de estado a 'en_corte'
|
||||||
|
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;
|
||||||
|
|
||||||
|
if ($available !== null && $orden->metros_requeridos > $available) {
|
||||||
|
throw \Illuminate\Validation\ValidationException::withMessages([
|
||||||
|
'metros_requeridos' => 'No hay suficientes metros de tela disponibles. Disponibles: ' . ($available),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$originalEstado = $orden->getOriginal('estado');
|
||||||
|
$nuevoEstado = $orden->estado;
|
||||||
|
|
||||||
|
// Reservar cuando pasamos a en_corte y no estaba reservado
|
||||||
|
if ($originalEstado !== 'en_corte' && $nuevoEstado === 'en_corte' && ! $orden->tela_reservada) {
|
||||||
|
if ($orden->tela_id && $orden->metros_requeridos > 0) {
|
||||||
|
$tela = \App\Models\Tela::find($orden->tela_id);
|
||||||
|
if (! $tela) {
|
||||||
|
throw \Illuminate\Validation\ValidationException::withMessages([
|
||||||
|
'tela_id' => 'No se encontró la tela asociada.',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($tela->metros_disponibles < $orden->metros_requeridos) {
|
||||||
|
throw \Illuminate\Validation\ValidationException::withMessages([
|
||||||
|
'metros_requeridos' => 'No hay suficientes metros disponibles para reservar (' . $tela->metros_disponibles . ').',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reservar: restar metros y marcar orden
|
||||||
|
$tela->metros_disponibles = $tela->metros_disponibles - $orden->metros_requeridos;
|
||||||
|
$tela->save();
|
||||||
|
|
||||||
|
$orden->tela_reservada = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si retrocede desde en_corte y ya estaba reservado, devolver la tela
|
||||||
|
if ($originalEstado === 'en_corte' && $nuevoEstado !== 'en_corte' && $orden->tela_reservada) {
|
||||||
|
if ($orden->tela_id && $orden->metros_requeridos > 0) {
|
||||||
|
$tela = \App\Models\Tela::find($orden->tela_id);
|
||||||
|
if ($tela) {
|
||||||
|
$tela->metros_disponibles = $tela->metros_disponibles + $orden->metros_requeridos;
|
||||||
|
$tela->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$orden->tela_reservada = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('orden_produccions', function (Blueprint $table) {
|
||||||
|
$table->integer('metros_requeridos')->default(0);
|
||||||
|
$table->boolean('tela_reservada')->default(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('orden_produccions', function (Blueprint $table) {
|
||||||
|
$table->dropColumn(['metros_requeridos', 'tela_reservada']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user