up
This commit is contained in:
@@ -0,0 +1,171 @@
|
||||
<?php
|
||||
|
||||
namespace App\Observers;
|
||||
|
||||
use App\Models\Compra;
|
||||
use App\Models\Producto;
|
||||
use App\Models\ProductVariant;
|
||||
use App\Models\Bodega;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class CompraObserver
|
||||
{
|
||||
/**
|
||||
* Handle the Compra "created" event.
|
||||
*/
|
||||
public function created(Compra $compra): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the Compra "updated" event.
|
||||
*/
|
||||
public function updated(Compra $compra): void
|
||||
{
|
||||
// Solo procesar cuando el estado cambie a 'Recibida'
|
||||
if ($compra->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
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user