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(),
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user