This commit is contained in:
Lizandro Guarnizo
2026-02-09 15:36:04 -05:00
parent 4b9d7a1f25
commit dc2fb553e5
2 changed files with 136 additions and 6 deletions
@@ -15,6 +15,7 @@ use Filament\Tables\Actions\DeleteAction;
use Filament\Tables\Actions\EditAction;
use Filament\Tables\Actions\CreateAction;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class RecepcionesRelationManager extends RelationManager
{
@@ -30,13 +31,129 @@ class RecepcionesRelationManager extends RelationManager
->required()
->default(now()),
Forms\Components\Select::make('proveedor_id')
->label('Proveedor')
->options(function () {
$proceso = $this->getOwnerRecord();
if (!$proceso || !$proceso->distribucion_proveedores) {
return [];
}
$opciones = [];
foreach ($proceso->distribucion_proveedores as $dist) {
$proveedorId = $dist['proveedor_id'] ?? null;
if ($proveedorId) {
$proveedor = \App\Models\Proveedor::find($proveedorId);
if ($proveedor) {
$opciones[$proveedorId] = $proveedor->nombre;
}
}
}
return $opciones;
})
->reactive()
->required()
->afterStateUpdated(function ($state, $set, $get) {
// Calcular cantidad disponible para este proveedor
$proceso = $this->getOwnerRecord();
if (!$proceso || !$state) return;
// Buscar la cantidad asignada a este proveedor
$cantidadAsignada = 0;
foreach ($proceso->distribucion_proveedores ?? [] as $dist) {
if (($dist['proveedor_id'] ?? null) == $state) {
$cantidadAsignada = (int) ($dist['cantidad'] ?? 0);
break;
}
}
// Calcular cuánto ya se ha recibido de este proveedor
$yaRecibido = (int) $proceso->recepciones()
->where('proveedor_id', $state)
->sum(DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)'));
$disponible = max(0, $cantidadAsignada - $yaRecibido);
$set('_max_cantidad', $disponible);
})
->helperText(function ($get) {
$proveedorId = $get('proveedor_id');
if (!$proveedorId) return 'Selecciona un proveedor para ver la cantidad disponible';
$proceso = $this->getOwnerRecord();
if (!$proceso) return '';
// Buscar cantidad asignada
$cantidadAsignada = 0;
foreach ($proceso->distribucion_proveedores ?? [] as $dist) {
if (($dist['proveedor_id'] ?? null) == $proveedorId) {
$cantidadAsignada = (int) ($dist['cantidad'] ?? 0);
break;
}
}
// Calcular ya recibido
$yaRecibido = (int) $proceso->recepciones()
->where('proveedor_id', $proveedorId)
->sum(DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)'));
$disponible = max(0, $cantidadAsignada - $yaRecibido);
return "Asignado: {$cantidadAsignada} | Ya recibido: {$yaRecibido} | Disponible: {$disponible}";
}),
TextInput::make('cantidad')
->label('Cantidad Recibida')
->numeric()
->required()
->minValue(1)
->maxValue(fn () => $this->getOwnerRecord()?->faltantes ?? 0)
->helperText(fn () => 'Disponible para recibir: ' . ($this->getOwnerRecord()?->faltantes ?? 0)),
->maxValue(function ($get) {
$proveedorId = $get('proveedor_id');
if (!$proveedorId) return 0;
$proceso = $this->getOwnerRecord();
if (!$proceso) return 0;
// Buscar cantidad asignada
$cantidadAsignada = 0;
foreach ($proceso->distribucion_proveedores ?? [] as $dist) {
if (($dist['proveedor_id'] ?? null) == $proveedorId) {
$cantidadAsignada = (int) ($dist['cantidad'] ?? 0);
break;
}
}
// Calcular ya recibido
$yaRecibido = (int) $proceso->recepciones()
->where('proveedor_id', $proveedorId)
->sum(DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)'));
return max(0, $cantidadAsignada - $yaRecibido);
})
->helperText(function ($get) {
$proveedorId = $get('proveedor_id');
if (!$proveedorId) return 'Primero selecciona un proveedor';
$proceso = $this->getOwnerRecord();
if (!$proceso) return '';
// Buscar cantidad asignada
$cantidadAsignada = 0;
foreach ($proceso->distribucion_proveedores ?? [] as $dist) {
if (($dist['proveedor_id'] ?? null) == $proveedorId) {
$cantidadAsignada = (int) ($dist['cantidad'] ?? 0);
break;
}
}
// Calcular ya recibido
$yaRecibido = (int) $proceso->recepciones()
->where('proveedor_id', $proveedorId)
->sum(DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)'));
$disponible = max(0, $cantidadAsignada - $yaRecibido);
return 'Máximo disponible de este proveedor: ' . $disponible;
}),
TextInput::make('prendas_defectuosas')
->label('Prendas Defectuosas')
@@ -65,6 +182,11 @@ class RecepcionesRelationManager extends RelationManager
->dateTime('d/m/Y H:i')
->sortable(),
TextColumn::make('proveedor.nombre')
->label('Proveedor')
->searchable()
->toggleable(),
TextColumn::make('cantidad')
->label('Cantidad')
->sortable(),