From 5a91d9689799bfa41a4d46a9de956ba15aff0b41 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Thu, 29 Jan 2026 21:42:53 -0500 Subject: [PATCH] up --- app/Filament/Resources/ConfeccionResource.php | 5 +- .../CobrosRelationManager.php | 2 +- app/Filament/Resources/TintoreriaResource.php | 5 +- .../CobrosRelationManager.php | 2 +- app/Models/Confeccion.php | 62 +++++++++++-------- app/Models/Tintoreria.php | 62 +++++++++++-------- 6 files changed, 80 insertions(+), 58 deletions(-) diff --git a/app/Filament/Resources/ConfeccionResource.php b/app/Filament/Resources/ConfeccionResource.php index f800a95..0a7a07b 100644 --- a/app/Filament/Resources/ConfeccionResource.php +++ b/app/Filament/Resources/ConfeccionResource.php @@ -128,8 +128,7 @@ class ConfeccionResource extends Resource $cobrosValor = (float) $confeccion->cobros()->sum('valor'); $recibidoNeto = $recepciones - $arreglos; - $totalContabilizado = $recibidoNeto + $cobros; - $faltantes = max(0, $enviada - $totalContabilizado); + $faltantes = max(0, $enviada - $recibidoNeto); $valorPorPrenda = (float) ($confeccion->valor_por_prenda ?? 0); $cantidadBase = $confeccion->cantidad_recibida ?? $enviada; @@ -143,7 +142,7 @@ class ConfeccionResource extends Resource 🔧 En arreglo: {$arreglos} 📊 Neto recibido: {$recibidoNeto} -💰 Cobradas: {$cobros} prendas +💰 Con problemas (cobradas): {$cobros} prendas ⚠️ Pendientes: {$faltantes} ━━━ PAGO ━━━ diff --git a/app/Filament/Resources/ConfeccionResource/RelationManagers/CobrosRelationManager.php b/app/Filament/Resources/ConfeccionResource/RelationManagers/CobrosRelationManager.php index 540755e..a38222e 100644 --- a/app/Filament/Resources/ConfeccionResource/RelationManagers/CobrosRelationManager.php +++ b/app/Filament/Resources/ConfeccionResource/RelationManagers/CobrosRelationManager.php @@ -32,7 +32,7 @@ class CobrosRelationManager extends RelationManager ->numeric() ->required() ->minValue(1) - ->helperText('Prendas a descontar del inventario'), + ->helperText('Prendas que llegaron con errores y se cobran al confeccionista'), \Filament\Forms\Components\TextInput::make('valor') ->label('Valor del Cobro') ->numeric() diff --git a/app/Filament/Resources/TintoreriaResource.php b/app/Filament/Resources/TintoreriaResource.php index 2559bcd..239ce4c 100644 --- a/app/Filament/Resources/TintoreriaResource.php +++ b/app/Filament/Resources/TintoreriaResource.php @@ -145,8 +145,7 @@ class TintoreriaResource extends Resource $cobrosValor = (float) $tintoreria->cobros()->sum('valor'); $recibidoNeto = $recepciones - $reprocesos; - $totalContabilizado = $recibidoNeto + $cobros; - $faltantes = max(0, $enviada - $totalContabilizado); + $faltantes = max(0, $enviada - $recibidoNeto); $valorPorPrenda = (float) ($tintoreria->valor_por_prenda ?? 0); $cantidadBase = $tintoreria->cantidad_recibida ?? $enviada; @@ -160,7 +159,7 @@ class TintoreriaResource extends Resource 🔧 En reproceso: {$reprocesos} 📊 Neto recibido: {$recibidoNeto} -💰 Cobradas: {$cobros} prendas +💰 Con problemas (cobradas): {$cobros} prendas ⚠️ Pendientes: {$faltantes} ━━━ PAGO ━━━ diff --git a/app/Filament/Resources/TintoreriaResource/RelationManagers/CobrosRelationManager.php b/app/Filament/Resources/TintoreriaResource/RelationManagers/CobrosRelationManager.php index 0d06b61..cf70605 100644 --- a/app/Filament/Resources/TintoreriaResource/RelationManagers/CobrosRelationManager.php +++ b/app/Filament/Resources/TintoreriaResource/RelationManagers/CobrosRelationManager.php @@ -31,7 +31,7 @@ class CobrosRelationManager extends RelationManager ->numeric() ->required() ->minValue(1) - ->helperText('Prendas que NO llegaron y se cobran a la tintorería'), + ->helperText('Prendas que llegaron con problemas y se cobran a la tintorería'), \Filament\Forms\Components\TextInput::make('valor') ->numeric() ->required() diff --git a/app/Models/Confeccion.php b/app/Models/Confeccion.php index 275db7d..3797063 100644 --- a/app/Models/Confeccion.php +++ b/app/Models/Confeccion.php @@ -105,15 +105,14 @@ class Confeccion extends Model return max(0, $recepciones - $ajustes); } - // Cuantas faltan por recibir (considera cobros porque ya están contabilizados) + // Cuantas faltan por recibir (NO considera cobros porque cobros son sobre prendas ya recibidas) public function getFaltantesAttribute() { $enviada = (int)($this->cantidad_enviada ?? 0); $recibidoNeto = $this->recibido_total; - $cobros = (int) $this->cobros()->sum('cantidad'); - // Lo que puede recibir = enviadas - cobros - recibido_neto - return max(0, $enviada - $cobros - $recibidoNeto); + // Lo que puede recibir = enviadas - recibido_neto (sin considerar cobros) + return max(0, $enviada - $recibidoNeto); } // Total de cobros aplicados @@ -167,8 +166,9 @@ class Confeccion extends Model } /** - * Registrar un cobro: solo registra el cobro sin descontar inventario - * Los cobros son prendas que NO llegaron - se cobran al confeccionista + * Registrar un cobro: prendas que llegaron con problemas y se cobran al confeccionista + * Los cobros son sobre prendas YA RECIBIDAS que tienen errores + * Se descontarán del inventario porque no quedan disponibles para venta */ public function registerCobro(int $cantidad, float $valor, ?string $notas = null, ?int $userId = null) { @@ -176,38 +176,50 @@ class Confeccion extends Model throw \Illuminate\Validation\ValidationException::withMessages(['cantidad' => 'La cantidad debe ser mayor que 0.']); } - // Validar que no se exceda lo enviado - $enviada = (int) ($this->cantidad_enviada ?? 0); - if ($enviada <= 0) { - throw \Illuminate\Validation\ValidationException::withMessages(['cantidad' => 'La confección no tiene cantidad_enviada registrada.']); - } - - // Calcular lo que ya se ha contabilizado + // Validar que no exceda las recepciones efectivas (solo puedes cobrar lo que YA recibiste) $recepcionesEfectivas = (int) $this->recepciones()->sum(\DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)')); - $arreglos = (int) $this->ajustes()->where('tipo', 'arreglo')->sum('cantidad'); - $recibidoNeto = $recepcionesEfectivas - $arreglos; // Los arreglos permiten re-recepción - $cobrosActuales = (int) $this->cobros()->sum('cantidad'); - $totalContabilizado = $recibidoNeto + $cobrosActuales; - $disponible = $enviada - $totalContabilizado; + $disponibleParaCobros = $recepcionesEfectivas - $cobrosActuales; - if ($cantidad > $disponible) { + if ($cantidad > $disponibleParaCobros) { throw \Illuminate\Validation\ValidationException::withMessages([ 'cantidad' => "No puedes registrar {$cantidad} prendas como cobro. 📊 Resumen: - • Enviadas: {$enviada} • Recepciones efectivas: {$recepcionesEfectivas} - • Arreglos (permiten re-recepción): {$arreglos} - • Recibido neto: {$recibidoNeto} - • Cobros registrados: {$cobrosActuales} - • Disponible para cobros: {$disponible} + • Cobros ya registrados: {$cobrosActuales} + • Disponible para cobrar: {$disponibleParaCobros} - ➡️ Solo puedes registrar máximo {$disponible} prendas más como cobros." + ➡️ Solo puedes registrar máximo {$disponibleParaCobros} prendas como cobro. + + 💡 Los cobros deben ser de prendas YA recibidas que tienen errores." ]); } + // Descontar del inventario + $inventario = \App\Models\InventarioPrenda::where('orden_produccion_id', $this->orden_produccion_id) + ->where('cantidad_disponible', '>=', $cantidad) + ->first(); + + if (!$inventario) { + throw \Illuminate\Validation\ValidationException::withMessages([ + 'cantidad' => 'No hay inventario disponible suficiente para descontar.' + ]); + } + + // Descontar del inventario + $inventario->cantidad_disponible = $inventario->cantidad_disponible - $cantidad; + $inventario->save(); + + // Si está asociado a producto, decrementar stock + if ($inventario->producto_id) { + $producto = \App\Models\Producto::find($inventario->producto_id); + if ($producto) { + $producto->decrement('stock', $cantidad); + } + } + // Crear registro de cobro $c = \App\Models\Cobro::create([ 'referencia_type' => self::class, diff --git a/app/Models/Tintoreria.php b/app/Models/Tintoreria.php index 4f1e4a1..75ea0e5 100644 --- a/app/Models/Tintoreria.php +++ b/app/Models/Tintoreria.php @@ -123,8 +123,9 @@ class Tintoreria extends Model } /** - * Registrar un cobro: solo registra el cobro sin descontar inventario - * Los cobros son prendas que NO llegaron - se cobran a la tintorería + * Registrar un cobro: prendas que llegaron con problemas y se cobran a la tintorería + * Los cobros en tintorería son sobre prendas YA RECIBIDAS que tienen problemas + * Se descontarán del inventario porque no quedan disponibles para venta */ public function registerCobro(int $cantidad, float $valor, ?string $notas = null, ?int $userId = null) { @@ -132,38 +133,50 @@ class Tintoreria extends Model throw \Illuminate\Validation\ValidationException::withMessages(['cantidad' => 'La cantidad debe ser mayor que 0.']); } - // Validar que no se exceda lo enviado - $enviada = (int) ($this->cantidad_enviada ?? 0); - if ($enviada <= 0) { - throw \Illuminate\Validation\ValidationException::withMessages(['cantidad' => 'La tintorería no tiene cantidad_enviada registrada.']); - } - - // Calcular lo que ya se ha contabilizado + // Validar que no exceda las recepciones efectivas (solo puedes cobrar lo que YA recibiste) $recepcionesEfectivas = (int) $this->recepciones()->sum(\DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)')); - $reprocesos = (int) $this->ajustes()->where('tipo', 'reproceso')->sum('cantidad'); - $recibidoNeto = $recepcionesEfectivas - $reprocesos; // Los reprocesos permiten re-recepción - $cobrosActuales = (int) $this->cobros()->sum('cantidad'); - $totalContabilizado = $recibidoNeto + $cobrosActuales; - $disponible = $enviada - $totalContabilizado; + $disponibleParaCobros = $recepcionesEfectivas - $cobrosActuales; - if ($cantidad > $disponible) { + if ($cantidad > $disponibleParaCobros) { throw \Illuminate\Validation\ValidationException::withMessages([ 'cantidad' => "No puedes registrar {$cantidad} prendas como cobro. 📊 Resumen: - • Enviadas: {$enviada} • Recepciones efectivas: {$recepcionesEfectivas} - • Reprocesos (permiten re-recepción): {$reprocesos} - • Recibido neto: {$recibidoNeto} - • Cobros registrados: {$cobrosActuales} - • Disponible para cobros: {$disponible} + • Cobros ya registrados: {$cobrosActuales} + • Disponible para cobrar: {$disponibleParaCobros} - ➡️ Solo puedes registrar máximo {$disponible} prendas más como cobros." + ➡️ Solo puedes registrar máximo {$disponibleParaCobros} prendas como cobro. + + 💡 Los cobros deben ser de prendas YA recibidas que tienen problemas." ]); } + // Descontar del inventario + $inventario = \App\Models\InventarioPrenda::where('orden_produccion_id', $this->orden_produccion_id) + ->where('cantidad_disponible', '>=', $cantidad) + ->first(); + + if (!$inventario) { + throw \Illuminate\Validation\ValidationException::withMessages([ + 'cantidad' => 'No hay inventario disponible suficiente para descontar.' + ]); + } + + // Descontar del inventario + $inventario->cantidad_disponible = $inventario->cantidad_disponible - $cantidad; + $inventario->save(); + + // Si está asociado a producto, decrementar stock + if ($inventario->producto_id) { + $producto = \App\Models\Producto::find($inventario->producto_id); + if ($producto) { + $producto->decrement('stock', $cantidad); + } + } + // Crear registro de cobro $c = \App\Models\Cobro::create([ 'referencia_type' => self::class, @@ -217,15 +230,14 @@ class Tintoreria extends Model return (float) $this->cobros()->sum('valor'); } - // Cuantas faltan por recibir (considera cobros porque ya están contabilizados) + // Cuantas faltan por recibir (NO considera cobros porque cobros son sobre prendas ya recibidas) public function getFaltantesAttribute() { $enviada = (int)($this->cantidad_enviada ?? 0); $recibidoNeto = $this->recibido_total; - $cobros = (int) $this->cobros()->sum('cantidad'); - // Lo que puede recibir = enviadas - cobros - recibido_neto - return max(0, $enviada - $cobros - $recibidoNeto); + // Lo que puede recibir = enviadas - recibido_neto (sin considerar cobros) + return max(0, $enviada - $recibidoNeto); } // Estado de recepción (Parcial / Completado)