From 36bc341a42024e6e8dba0e4c730a6faa5fe3b410 Mon Sep 17 00:00:00 2001 From: lizandrogd <77708265+lizandrogd@users.noreply.github.com> Date: Mon, 19 Jan 2026 19:42:05 -0500 Subject: [PATCH] up --- app/Models/OrdenProduccion.php | 23 +++++++ .../OrdenProduccionTelaReservationTest.php | 61 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 tests/Feature/OrdenProduccionTelaReservationTest.php diff --git a/app/Models/OrdenProduccion.php b/app/Models/OrdenProduccion.php index 9be5c0a..96c926f 100644 --- a/app/Models/OrdenProduccion.php +++ b/app/Models/OrdenProduccion.php @@ -130,6 +130,29 @@ class OrdenProduccion extends Model if (! isset($orden->fecha_inicio) || ! $orden->fecha_inicio) { $orden->fecha_inicio = now()->toDateString(); } + + // Reserva de tela al crear cuando la OP ya nace en 'en_corte' + $estadoInicial = $orden->estado ?? 'en_corte'; + if ($estadoInicial === 'en_corte' && $orden->tela_id && ($orden->metros_requeridos ?? 0) > 0) { + $tela = \App\Models\Tela::find($orden->tela_id); + if (! $tela) { + throw \Illuminate\Validation\ValidationException::withMessages([ + 'tela_id' => 'No se encontrĂ³ la tela asociada.', + ]); + } + + if ($tela->metros_disponibles < $orden->metros_requeridos) { + throw \Illuminate\Validation\ValidationException::withMessages([ + 'metros_requeridos' => 'No hay suficientes metros disponibles para reservar (' . $tela->metros_disponibles . ').', + ]); + } + + // Reservar: restar metros y marcar orden + $tela->metros_disponibles = $tela->metros_disponibles - $orden->metros_requeridos; + $tela->save(); + + $orden->tela_reservada = true; + } }); // Validar y reservar tela al cambiar de estado a 'en_corte' diff --git a/tests/Feature/OrdenProduccionTelaReservationTest.php b/tests/Feature/OrdenProduccionTelaReservationTest.php new file mode 100644 index 0000000..a742ad5 --- /dev/null +++ b/tests/Feature/OrdenProduccionTelaReservationTest.php @@ -0,0 +1,61 @@ + 'Tela A', + 'metros_disponibles' => 100, + ]); + + $orden = OrdenProduccion::create([ + 'prenda_modelo' => 'Camisa X', + 'referencia' => 'REF-1', + 'cantidad_total' => 10, + 'tela_id' => $tela->id, + 'metros_requeridos' => 30, + 'estado' => 'en_corte', + 'fecha_inicio' => now()->toDateString(), + 'fecha_entrega_estimada' => now()->addDays(7)->toDateString(), + ]); + + $tela->refresh(); + $this->assertEquals(70, $tela->metros_disponibles); + + $orden->refresh(); + $this->assertTrue((bool) $orden->tela_reservada); + } + + /** @test */ + public function it_fails_if_not_enough_meters_on_create() + { + $this->expectException(\Illuminate\Validation\ValidationException::class); + + $tela = Tela::create([ + 'nombre' => 'Tela B', + 'metros_disponibles' => 20, + ]); + + OrdenProduccion::create([ + 'prenda_modelo' => 'Pantalon Y', + 'referencia' => 'REF-2', + 'cantidad_total' => 5, + 'tela_id' => $tela->id, + 'metros_requeridos' => 30, + 'estado' => 'en_corte', + 'fecha_inicio' => now()->toDateString(), + 'fecha_entrega_estimada' => now()->addDays(7)->toDateString(), + ]); + } +}