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(),
+12 -4
View File
@@ -4,6 +4,8 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
class Recepcion extends Model
{
@@ -14,6 +16,7 @@ class Recepcion extends Model
'referencia_type',
'referencia_id',
'user_id',
'proveedor_id',
'cantidad',
'prendas_defectuosas',
'fecha_recepcion',
@@ -36,6 +39,11 @@ class Recepcion extends Model
return $this->belongsTo(User::class, 'user_id');
}
public function proveedor()
{
return $this->belongsTo(Proveedor::class, 'proveedor_id');
}
protected static function booted()
{
static::creating(function ($rec) {
@@ -68,7 +76,7 @@ class Recepcion extends Model
// Ya recibido efectivo (cantidad - defectuosos)
$yaRecibido = (int) \App\Models\Recepcion::where('referencia_type', get_class($referencia))
->where('referencia_id', $referencia->id)
->sum(\DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)'));
->sum(DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)'));
// Los arreglos/reprocesos permiten re-recepción cuando regresen
$arreglos = 0;
@@ -105,8 +113,8 @@ class Recepcion extends Model
}
// Set user if available
if (! $rec->user_id && auth()->check()) {
$rec->user_id = auth()->id();
if (! $rec->user_id && Auth::check()) {
$rec->user_id = Auth::id();
}
});
@@ -161,7 +169,7 @@ class Recepcion extends Model
$sum = (int) static::where('referencia_type', get_class($referencia))
->where('referencia_id', $referencia->id)
->sum(\DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)'));
->sum(DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)'));
$referencia->cantidad_recibida = $sum;
$referencia->save();