up
This commit is contained in:
+124
-2
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user