isDirty('estado') && $compra->estado === 'Recibida') { Log::info("Procesando compra recibida", [ 'compra_id' => $compra->id, 'detalles_count' => $compra->detalles->count() ]); DB::beginTransaction(); try { foreach ($compra->detalles as $detalle) { Log::info("Procesando detalle de compra", [ 'detalle_id' => $detalle->id, 'producto_id' => $detalle->producto_id, 'variante_id' => $detalle->variante_id, 'bodega_id' => $detalle->bodega_id, 'cantidad' => $detalle->cantidad ]); if ($detalle->variante_id) { // Manejo para variantes $variante = ProductVariant::find($detalle->variante_id); if ($variante && $detalle->bodega_id) { // Actualizar stock en bodega para la variante $existeRelacion = $variante->bodegas() ->where('bodega_id', $detalle->bodega_id) ->exists(); if ($existeRelacion) { // Incrementar stock existente $pivotData = $variante->bodegas() ->where('bodega_id', $detalle->bodega_id) ->first(); $nuevoStock = $pivotData->pivot->stock + $detalle->cantidad; $variante->bodegas()->updateExistingPivot($detalle->bodega_id, [ 'stock' => $nuevoStock ]); } else { // Crear nueva relación con stock $variante->bodegas()->attach($detalle->bodega_id, [ 'stock' => $detalle->cantidad ]); } Log::info("Stock actualizado para variante en bodega", [ 'variante_id' => $variante->id, 'bodega_id' => $detalle->bodega_id, 'cantidad_agregada' => $detalle->cantidad ]); } else { // Fallback: incrementar stock directo de la variante si no hay bodega especificada ProductVariant::where('id', $detalle->variante_id) ->increment('stock', $detalle->cantidad); Log::info("Stock incrementado directamente en variante (sin bodega)", [ 'variante_id' => $detalle->variante_id, 'cantidad' => $detalle->cantidad ]); } } else { // Manejo para productos sin variantes $producto = Producto::find($detalle->producto_id); if ($producto && $detalle->bodega_id) { // Actualizar stock en bodega para el producto $existeRelacion = $producto->bodegas() ->where('bodega_id', $detalle->bodega_id) ->exists(); if ($existeRelacion) { // Incrementar stock existente $pivotData = $producto->bodegas() ->where('bodega_id', $detalle->bodega_id) ->first(); $nuevoStock = $pivotData->pivot->stock + $detalle->cantidad; $producto->bodegas()->updateExistingPivot($detalle->bodega_id, [ 'stock' => $nuevoStock ]); } else { // Crear nueva relación con stock $producto->bodegas()->attach($detalle->bodega_id, [ 'stock' => $detalle->cantidad ]); } Log::info("Stock actualizado para producto en bodega", [ 'producto_id' => $producto->id, 'bodega_id' => $detalle->bodega_id, 'cantidad_agregada' => $detalle->cantidad ]); } else { // Fallback: incrementar stock directo del producto si no hay bodega especificada Producto::where('id', $detalle->producto_id) ->increment('stock', $detalle->cantidad); Log::info("Stock incrementado directamente en producto (sin bodega)", [ 'producto_id' => $detalle->producto_id, 'cantidad' => $detalle->cantidad ]); } } } DB::commit(); Log::info("Compra procesada exitosamente", ['compra_id' => $compra->id]); } catch (\Exception $e) { DB::rollback(); Log::error("Error al procesar compra recibida", [ 'compra_id' => $compra->id, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); throw $e; } } } /** * Handle the Compra "deleted" event. */ public function deleted(Compra $compra): void { // } /** * Handle the Compra "restored" event. */ public function restored(Compra $compra): void { // } /** * Handle the Compra "force deleted" event. */ public function forceDeleted(Compra $compra): void { // } }