diff --git a/app/Filament/Resources/ConfeccionResource.php b/app/Filament/Resources/ConfeccionResource.php index 7e09d33..3257020 100644 --- a/app/Filament/Resources/ConfeccionResource.php +++ b/app/Filament/Resources/ConfeccionResource.php @@ -110,7 +110,7 @@ class ConfeccionResource extends Resource $total = \App\Models\Recepcion::where('referencia_type', \App\Models\Confeccion::class) ->where('referencia_id', $id) - ->sum('cantidad'); + ->sum(\DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)')); $enviada = (int) ($get('cantidad_enviada') ?? 0); $faltan = max(0, $enviada - $total); diff --git a/app/Filament/Resources/ConfeccionResource/RelationManagers/RecepcionesRelationManager.php b/app/Filament/Resources/ConfeccionResource/RelationManagers/RecepcionesRelationManager.php index f2218e5..dd12bfc 100644 --- a/app/Filament/Resources/ConfeccionResource/RelationManagers/RecepcionesRelationManager.php +++ b/app/Filament/Resources/ConfeccionResource/RelationManagers/RecepcionesRelationManager.php @@ -40,6 +40,7 @@ class RecepcionesRelationManager extends RelationManager TextColumn::make('id')->label('#'), TextColumn::make('fecha_recepcion')->dateTime()->label('Fecha'), TextColumn::make('cantidad')->label('Cantidad'), + TextColumn::make('prendas_defectuosas')->label('Defectos'), TextColumn::make('usuario.name')->label('Usuario'), TextColumn::make('notas')->limit(50)->wrap(), TextColumn::make('created_at')->dateTime()->label('Creado'), diff --git a/app/Filament/Resources/TintoreriaResource/RelationManagers/RecepcionesRelationManager.php b/app/Filament/Resources/TintoreriaResource/RelationManagers/RecepcionesRelationManager.php index 0f86e43..9991cea 100644 --- a/app/Filament/Resources/TintoreriaResource/RelationManagers/RecepcionesRelationManager.php +++ b/app/Filament/Resources/TintoreriaResource/RelationManagers/RecepcionesRelationManager.php @@ -40,6 +40,7 @@ class RecepcionesRelationManager extends RelationManager TextColumn::make('id')->label('#'), TextColumn::make('fecha_recepcion')->dateTime()->label('Fecha'), TextColumn::make('cantidad')->label('Cantidad'), + TextColumn::make('prendas_defectuosas')->label('Defectos'), TextColumn::make('usuario.name')->label('Usuario'), TextColumn::make('notas')->limit(50)->wrap(), TextColumn::make('created_at')->dateTime()->label('Creado'), diff --git a/app/Models/Confeccion.php b/app/Models/Confeccion.php index 2f0f83f..d72461d 100644 --- a/app/Models/Confeccion.php +++ b/app/Models/Confeccion.php @@ -81,7 +81,7 @@ class Confeccion extends Model // Total recibido calculado desde recepciones (fuente de la verdad) public function getRecibidoTotalAttribute() { - return (int) $this->recepciones()->sum('cantidad'); + return (int) $this->recepciones()->sum(\DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)')); } // Cuantas faltan por recibir (usa la suma real de recepciones) diff --git a/app/Models/Recepcion.php b/app/Models/Recepcion.php index d09c812..a3acd93 100644 --- a/app/Models/Recepcion.php +++ b/app/Models/Recepcion.php @@ -15,6 +15,7 @@ class Recepcion extends Model 'referencia_id', 'user_id', 'cantidad', + 'prendas_defectuosas', 'fecha_recepcion', 'notas', ]; @@ -22,6 +23,7 @@ class Recepcion extends Model protected $casts = [ 'fecha_recepcion' => 'datetime', 'cantidad' => 'integer', + 'prendas_defectuosas' => 'integer', ]; public function referencia() @@ -39,24 +41,38 @@ class Recepcion extends Model static::creating(function ($rec) { // Cantidad debe ser entero >= 1 $rec->cantidad = (int) $rec->cantidad; + $rec->prendas_defectuosas = (int) ($rec->prendas_defectuosas ?? 0); + if ($rec->cantidad <= 0) { throw ValidationException::withMessages(['cantidad' => 'La cantidad debe ser un entero mayor que 0.']); } + if ($rec->prendas_defectuosas < 0) { + throw ValidationException::withMessages(['prendas_defectuosas' => 'La cantidad de prendas defectuosas no puede ser negativa.']); + } + + if ($rec->prendas_defectuosas > $rec->cantidad) { + throw ValidationException::withMessages(['prendas_defectuosas' => 'Las prendas defectuosas no pueden superar la cantidad recibida.']); + } + // Fecha por defecto if (! $rec->fecha_recepcion) { $rec->fecha_recepcion = now(); } - // Validación: no permitir sobrepasar la cantidad enviada en la referencia + // Validación: no permitir sobrepasar la cantidad enviada en la referencia (considerando defectuosos) if ($rec->referencia) { $referencia = $rec->referencia; $enviada = (int) ($referencia->cantidad_enviada ?? 0); + + // ya recibido efectivo (cantidad - defectuosos) $yaRecibido = (int) \App\Models\Recepcion::where('referencia_type', get_class($referencia)) ->where('referencia_id', $referencia->id) - ->sum('cantidad'); + ->sum(\DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)')); - if (($yaRecibido + $rec->cantidad) > $enviada) { + $efectivo = $rec->cantidad - $rec->prendas_defectuosas; + + if (($yaRecibido + $efectivo) > $enviada) { throw ValidationException::withMessages(['cantidad' => "La recepción excede la cantidad pendiente (faltan: " . max(0, $enviada - $yaRecibido) . ")."]); } } @@ -73,11 +89,13 @@ class Recepcion extends Model // Crear un traslado parcial desde la referencia usando esta recepción if ($rec->referencia) { $referencia = $rec->referencia; + $efectivo = (int) ($rec->cantidad - ($rec->prendas_defectuosas ?? 0)); $payload = [ 'cantidad_enviada' => $rec->cantidad, - 'cantidad_recibida' => $rec->cantidad, + 'cantidad_recibida' => $efectivo, 'fecha_recepcion' => $rec->fecha_recepcion, 'notas' => 'Creado desde recepción #' . $rec->id . ($rec->notas ? (" - " . $rec->notas) : ''), + 'prendas_defectuosas' => $rec->prendas_defectuosas ?? 0, ]; // Map destino según tipo de referencia @@ -99,6 +117,7 @@ class Recepcion extends Model } }); + static::updated(function ($rec) { $rec->syncParentAggregates(); }); @@ -112,9 +131,10 @@ class Recepcion extends Model { if (! $this->referencia) return; $referencia = $this->referencia; + $sum = (int) static::where('referencia_type', get_class($referencia)) ->where('referencia_id', $referencia->id) - ->sum('cantidad'); + ->sum(\DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)')); $referencia->cantidad_recibida = $sum; $referencia->save(); diff --git a/app/Models/Tintoreria.php b/app/Models/Tintoreria.php index b951696..27ed359 100644 --- a/app/Models/Tintoreria.php +++ b/app/Models/Tintoreria.php @@ -72,7 +72,7 @@ class Tintoreria extends Model // Total recibido calculado desde recepciones (fuente de la verdad) public function getRecibidoTotalAttribute() { - return (int) $this->recepciones()->sum('cantidad'); + return (int) $this->recepciones()->sum(\DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)')); } // Cuantas faltan por recibir (usa la suma real de recepciones) diff --git a/tests/Unit/ConfeccionRecepcionesTest.php b/tests/Unit/ConfeccionRecepcionesTest.php index cd30da3..eebd9c3 100644 --- a/tests/Unit/ConfeccionRecepcionesTest.php +++ b/tests/Unit/ConfeccionRecepcionesTest.php @@ -25,13 +25,14 @@ class ConfeccionRecepcionesTest extends TestCase 'cantidad_enviada' => 100, ]); - // Crear recepciones 40 y 40 - Recepcion::create(['referencia_type' => Confeccion::class,'referencia_id' => $conf->id,'cantidad' => 40]); + // Crear recepciones 40 y 40 con defectos en la segunda (10) Recepcion::create(['referencia_type' => Confeccion::class,'referencia_id' => $conf->id,'cantidad' => 40]); + Recepcion::create(['referencia_type' => Confeccion::class,'referencia_id' => $conf->id,'cantidad' => 40, 'prendas_defectuosas' => 10]); $conf->refresh(); - $this->assertEquals(80, $conf->recibido_total); - $this->assertEquals(20, $conf->faltantes); + // recibido efectivo: 40 + (40 - 10) = 70 + $this->assertEquals(70, $conf->recibido_total); + $this->assertEquals(30, $conf->faltantes); } }