diff --git a/app/Models/InventarioPrendaDistribucion.php b/app/Models/InventarioPrendaDistribucion.php index 0def919..f1c6f5a 100644 --- a/app/Models/InventarioPrendaDistribucion.php +++ b/app/Models/InventarioPrendaDistribucion.php @@ -52,9 +52,10 @@ class InventarioPrendaDistribucion extends Model $cantidad = intval($dist->cantidad ?? 0); $sumExistentes = (int) self::where('inventario_prenda_id', $parentId)->sum('cantidad'); - if (($sumExistentes + $cantidad) > (int) $parent->cantidad_terminada) { + // Validar contra la cantidad disponible actual + if (($sumExistentes + $cantidad) > (int) $parent->cantidad_disponible) { throw \Illuminate\Validation\ValidationException::withMessages([ - 'cantidad' => 'La suma de las distribuciones excede la cantidad terminada disponible (' . $parent->cantidad_terminada . ').', + 'cantidad' => 'La suma de las distribuciones excede la cantidad disponible (' . $parent->cantidad_disponible . ').', ]); } }); @@ -71,9 +72,10 @@ class InventarioPrendaDistribucion extends Model ->where('id', '<>', $dist->id) ->sum('cantidad'); - if (($othersSum + $newCantidad) > (int) $parent->cantidad_terminada) { + // Validar contra la cantidad disponible actual (considerando otras distribuciones) + if (($othersSum + $newCantidad) > (int) $parent->cantidad_disponible) { throw \Illuminate\Validation\ValidationException::withMessages([ - 'cantidad' => 'La suma de las distribuciones excede la cantidad terminada disponible (' . $parent->cantidad_terminada . ').', + 'cantidad' => 'La suma de las distribuciones excede la cantidad disponible (' . $parent->cantidad_disponible . ').', ]); } }); @@ -108,6 +110,13 @@ class InventarioPrendaDistribucion extends Model } $variant->increment('stock', $cantidad); + + // Reducir disponibilidad en inventario_prenda + $parent = $dist->inventarioPrenda; + if ($parent) { + $parent->cantidad_disponible = max(0, $parent->cantidad_disponible - $cantidad); + $parent->save(); + } } else { // Producto $productoId = $dist->inventarioPrenda->producto_id ?? ($dist->inventarioPrenda->ordenProduccion->producto_id ?? null); @@ -123,6 +132,13 @@ class InventarioPrendaDistribucion extends Model if ($prod && ! $prod->variants()->exists()) { $prod->increment('stock', $cantidad); } + + // Reducir disponibilidad en inventario_prenda + $parent = $dist->inventarioPrenda; + if ($parent) { + $parent->cantidad_disponible = max(0, $parent->cantidad_disponible - $cantidad); + $parent->save(); + } } } }); @@ -152,6 +168,12 @@ class InventarioPrendaDistribucion extends Model } $variant->increment('stock', $delta); + + $parent = $dist->inventarioPrenda; + if ($parent) { + $parent->cantidad_disponible = max(0, min($parent->cantidad_terminada, $parent->cantidad_disponible - $delta)); + $parent->save(); + } } else { $productoId = $dist->inventarioPrenda->producto_id ?? ($dist->inventarioPrenda->ordenProduccion->producto_id ?? null); if ($productoId) { @@ -166,6 +188,12 @@ class InventarioPrendaDistribucion extends Model if ($prod && ! $prod->variants()->exists()) { $prod->increment('stock', $delta); } + + $parent = $dist->inventarioPrenda; + if ($parent) { + $parent->cantidad_disponible = max(0, min($parent->cantidad_terminada, $parent->cantidad_disponible - $delta)); + $parent->save(); + } } } }); @@ -187,6 +215,13 @@ class InventarioPrendaDistribucion extends Model } $variant->decrement('stock', $cantidad); + + // Restaurar disponibilidad en inventario_prenda + $parent = $dist->inventarioPrenda; + if ($parent) { + $parent->cantidad_disponible = min($parent->cantidad_terminada, $parent->cantidad_disponible + $cantidad); + $parent->save(); + } } } else { $productoId = $dist->inventarioPrenda->producto_id ?? ($dist->inventarioPrenda->ordenProduccion->producto_id ?? null); @@ -201,6 +236,13 @@ class InventarioPrendaDistribucion extends Model if ($prod && ! $prod->variants()->exists()) { $prod->decrement('stock', $cantidad); } + + // Restaurar disponibilidad en inventario_prenda + $parent = $dist->inventarioPrenda; + if ($parent) { + $parent->cantidad_disponible = min($parent->cantidad_terminada, $parent->cantidad_disponible + $cantidad); + $parent->save(); + } } } }); diff --git a/database/migrations/2025_10_21_194714_update_detalle_ventas_producto_id_foreign_key.php b/database/migrations/2025_10_21_194714_update_detalle_ventas_producto_id_foreign_key.php index 714031a..5c07889 100644 --- a/database/migrations/2025_10_21_194714_update_detalle_ventas_producto_id_foreign_key.php +++ b/database/migrations/2025_10_21_194714_update_detalle_ventas_producto_id_foreign_key.php @@ -15,8 +15,8 @@ return new class extends Migration // Primero hacer la columna nullable si no lo es $table->unsignedBigInteger('producto_id')->nullable()->change(); - // Eliminar la clave foránea existente usando el nombre exacto - $table->dropForeign('detalle_ventas_producto_id_foreign'); + // Eliminar la clave foránea existente (compatible con SQLite y MySQL) + $table->dropForeign(['producto_id']); // Recrear la clave foránea con SET NULL $table->foreign('producto_id')