This commit is contained in:
Lizandro Guarnizo
2026-02-04 16:52:07 -05:00
parent 580d908f93
commit 30b843b402
2 changed files with 35 additions and 57 deletions
@@ -13,71 +13,36 @@ class CreateOjalPresilla extends CreateRecord
protected function handleRecordCreation(array $data): \Illuminate\Database\Eloquent\Model protected function handleRecordCreation(array $data): \Illuminate\Database\Eloquent\Model
{ {
$distribuciones = $data['distribuciones'] ?? []; $tipo = $data['tipo'];
$tipo = $data['tipo'] ?? 'accesorio';
$ordenProduccionId = $data['orden_produccion_id'];
$cantidadTotal = $data['cantidad_enviada'];
$terminada = $data['terminada'] ?? false;
// Validar que haya al menos una distribución // Determinar en qué tabla guardar según el tipo
if (empty($distribuciones)) { if ($tipo === 'Ojal') {
throw \Illuminate\Validation\ValidationException::withMessages([
'distribuciones' => 'Debes agregar al menos un proveedor con su cantidad.'
]);
}
// Validar que las distribuciones no excedan la cantidad total
$sumaDistribucion = array_sum(array_column($distribuciones, 'cantidad'));
if ($sumaDistribucion > $cantidadTotal) {
throw \Illuminate\Validation\ValidationException::withMessages([
'distribuciones' => "La suma de las distribuciones ({$sumaDistribucion}) excede la cantidad total disponible ({$cantidadTotal})."
]);
}
// Advertir si no se distribuye todo (pero permitirlo)
if ($sumaDistribucion < $cantidadTotal) {
$diferencia = $cantidadTotal - $sumaDistribucion;
\Filament\Notifications\Notification::make()
->warning()
->title('Distribución parcial')
->body("Se distribuirán {$sumaDistribucion} de {$cantidadTotal} unidades. Quedarán {$diferencia} sin asignar.")
->send();
}
// Crear un registro por cada proveedor
$primerRegistro = null;
$cantidadRegistros = count($distribuciones);
try {
foreach ($distribuciones as $distribucion) {
$registro = \App\Models\Ojal::create([ $registro = \App\Models\Ojal::create([
'proveedor_id' => $distribucion['proveedor_id'], 'proveedor_id' => $data['proveedor_id'],
'orden_produccion_id' => $ordenProduccionId, 'orden_produccion_id' => $data['orden_produccion_id'],
'tipo' => $tipo, 'tipo' => $tipo,
'fecha_envio' => now(), 'fecha_envio' => now(),
'cantidad_enviada' => $distribucion['cantidad'], 'cantidad_enviada' => $data['cantidad_enviada'],
'terminada' => $terminada, 'terminada' => $data['terminada'] ?? false,
]); ]);
} else {
if (!$primerRegistro) { $registro = \App\Models\Prensilla::create([
$primerRegistro = $registro; 'proveedor_id' => $data['proveedor_id'],
} 'orden_produccion_id' => $data['orden_produccion_id'],
} 'tipo' => $tipo,
} catch (\Exception $e) { 'fecha_envio' => now(),
throw \Illuminate\Validation\ValidationException::withMessages([ 'cantidad_enviada' => $data['cantidad_enviada'],
'distribuciones' => 'Error al crear registros: ' . $e->getMessage() 'terminada' => $data['terminada'] ?? false,
]); ]);
} }
// Notificación de éxito
\Filament\Notifications\Notification::make() \Filament\Notifications\Notification::make()
->title('Registros creados exitosamente') ->title('Registro creado exitosamente')
->body("Se crearon {$cantidadRegistros} registro(s) de {$tipo} para {$sumaDistribucion} unidades.") ->body("Se creó el registro de {$tipo}")
->success() ->success()
->send(); ->send();
// Retornar el primer registro para que Filament no falle return $registro;
return $primerRegistro;
} }
protected function getRedirectUrl(): string protected function getRedirectUrl(): string
@@ -17,4 +17,17 @@ class ListOjalPresillas extends ListRecords
->label('Crear'), ->label('Crear'),
]; ];
} }
protected function getTableQuery(): ?\Illuminate\Database\Eloquent\Builder
{
// Combinar registros de ojales y prensillas
$ojales = \App\Models\Ojal::query()
->selectRaw("id, 'ojales' as table_name, proveedor_id, orden_produccion_id, tipo, fecha_envio, cantidad_enviada, fecha_recepcion, cantidad_recibida, terminada, created_at, updated_at");
$prensillas = \App\Models\Prensilla::query()
->selectRaw("id, 'prensillas' as table_name, proveedor_id, orden_produccion_id, tipo, fecha_envio, cantidad_enviada, fecha_recepcion, cantidad_recibida, terminada, created_at, updated_at");
// Unir ambas queries y ordenar por fecha de creación
return $ojales->union($prensillas)->orderByDesc('created_at');
}
} }