From dc2fb553e55c53e860ca82e35619497c954e7789 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Mon, 9 Feb 2026 15:36:04 -0500 Subject: [PATCH] up --- .../RecepcionesRelationManager.php | 126 +++++++++++++++++- app/Models/Recepcion.php | 16 ++- 2 files changed, 136 insertions(+), 6 deletions(-) diff --git a/app/Filament/Resources/ProcesoAcabadoResource/RelationManagers/RecepcionesRelationManager.php b/app/Filament/Resources/ProcesoAcabadoResource/RelationManagers/RecepcionesRelationManager.php index daa16e9..71a38a2 100644 --- a/app/Filament/Resources/ProcesoAcabadoResource/RelationManagers/RecepcionesRelationManager.php +++ b/app/Filament/Resources/ProcesoAcabadoResource/RelationManagers/RecepcionesRelationManager.php @@ -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(), diff --git a/app/Models/Recepcion.php b/app/Models/Recepcion.php index 305ec57..155b195 100644 --- a/app/Models/Recepcion.php +++ b/app/Models/Recepcion.php @@ -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();