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\EditAction;
|
||||||
use Filament\Tables\Actions\CreateAction;
|
use Filament\Tables\Actions\CreateAction;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
class RecepcionesRelationManager extends RelationManager
|
class RecepcionesRelationManager extends RelationManager
|
||||||
{
|
{
|
||||||
@@ -30,13 +31,129 @@ class RecepcionesRelationManager extends RelationManager
|
|||||||
->required()
|
->required()
|
||||||
->default(now()),
|
->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')
|
TextInput::make('cantidad')
|
||||||
->label('Cantidad Recibida')
|
->label('Cantidad Recibida')
|
||||||
->numeric()
|
->numeric()
|
||||||
->required()
|
->required()
|
||||||
->minValue(1)
|
->minValue(1)
|
||||||
->maxValue(fn () => $this->getOwnerRecord()?->faltantes ?? 0)
|
->maxValue(function ($get) {
|
||||||
->helperText(fn () => 'Disponible para recibir: ' . ($this->getOwnerRecord()?->faltantes ?? 0)),
|
$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')
|
TextInput::make('prendas_defectuosas')
|
||||||
->label('Prendas Defectuosas')
|
->label('Prendas Defectuosas')
|
||||||
@@ -65,6 +182,11 @@ class RecepcionesRelationManager extends RelationManager
|
|||||||
->dateTime('d/m/Y H:i')
|
->dateTime('d/m/Y H:i')
|
||||||
->sortable(),
|
->sortable(),
|
||||||
|
|
||||||
|
TextColumn::make('proveedor.nombre')
|
||||||
|
->label('Proveedor')
|
||||||
|
->searchable()
|
||||||
|
->toggleable(),
|
||||||
|
|
||||||
TextColumn::make('cantidad')
|
TextColumn::make('cantidad')
|
||||||
->label('Cantidad')
|
->label('Cantidad')
|
||||||
->sortable(),
|
->sortable(),
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ namespace App\Models;
|
|||||||
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Validation\ValidationException;
|
use Illuminate\Validation\ValidationException;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
|
||||||
class Recepcion extends Model
|
class Recepcion extends Model
|
||||||
{
|
{
|
||||||
@@ -14,6 +16,7 @@ class Recepcion extends Model
|
|||||||
'referencia_type',
|
'referencia_type',
|
||||||
'referencia_id',
|
'referencia_id',
|
||||||
'user_id',
|
'user_id',
|
||||||
|
'proveedor_id',
|
||||||
'cantidad',
|
'cantidad',
|
||||||
'prendas_defectuosas',
|
'prendas_defectuosas',
|
||||||
'fecha_recepcion',
|
'fecha_recepcion',
|
||||||
@@ -36,6 +39,11 @@ class Recepcion extends Model
|
|||||||
return $this->belongsTo(User::class, 'user_id');
|
return $this->belongsTo(User::class, 'user_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function proveedor()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Proveedor::class, 'proveedor_id');
|
||||||
|
}
|
||||||
|
|
||||||
protected static function booted()
|
protected static function booted()
|
||||||
{
|
{
|
||||||
static::creating(function ($rec) {
|
static::creating(function ($rec) {
|
||||||
@@ -68,7 +76,7 @@ class Recepcion extends Model
|
|||||||
// Ya recibido efectivo (cantidad - defectuosos)
|
// Ya recibido efectivo (cantidad - defectuosos)
|
||||||
$yaRecibido = (int) \App\Models\Recepcion::where('referencia_type', get_class($referencia))
|
$yaRecibido = (int) \App\Models\Recepcion::where('referencia_type', get_class($referencia))
|
||||||
->where('referencia_id', $referencia->id)
|
->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
|
// Los arreglos/reprocesos permiten re-recepción cuando regresen
|
||||||
$arreglos = 0;
|
$arreglos = 0;
|
||||||
@@ -105,8 +113,8 @@ class Recepcion extends Model
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set user if available
|
// Set user if available
|
||||||
if (! $rec->user_id && auth()->check()) {
|
if (! $rec->user_id && Auth::check()) {
|
||||||
$rec->user_id = auth()->id();
|
$rec->user_id = Auth::id();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -161,7 +169,7 @@ class Recepcion extends Model
|
|||||||
|
|
||||||
$sum = (int) static::where('referencia_type', get_class($referencia))
|
$sum = (int) static::where('referencia_type', get_class($referencia))
|
||||||
->where('referencia_id', $referencia->id)
|
->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->cantidad_recibida = $sum;
|
||||||
$referencia->save();
|
$referencia->save();
|
||||||
|
|||||||
Reference in New Issue
Block a user