refactor(inventory): enhance error reporting for negative stock validation

This commit is contained in:
2026-09-25 15:31:43 -03:00
parent a05d15d17f
commit ad054127aa
2 changed files with 37 additions and 3 deletions

View File

@@ -52,8 +52,38 @@ return new class extends Migration
private function assertNonNegative(string $expression, string $reason): void
{
if (DB::table('inventories')->whereRaw("({$expression}) < 0")->exists()) {
throw new RuntimeException("Hay inventarios inconsistentes: {$reason}.");
$invalidInventories = DB::table('inventories')
->select([
'id',
'real_stock',
'sold_units',
'refunded_units',
'reserved_stock',
'entry_reserved_stock',
])
->selectRaw("({$expression}) as calculated_stock")
->whereRaw("({$expression}) < 0")
->orderBy('id')
->limit(20)
->get();
if ($invalidInventories->isNotEmpty()) {
$details = $invalidInventories
->map(static fn (object $inventory): string => sprintf(
'id=%d [real=%d, vendidas=%d, reintegradas=%d, reservadas=%d, reservas_entradas=%d, resultado=%d]',
$inventory->id,
$inventory->real_stock,
$inventory->sold_units,
$inventory->refunded_units,
$inventory->reserved_stock,
$inventory->entry_reserved_stock,
$inventory->calculated_stock,
))
->implode('; ');
throw new RuntimeException(
"Hay inventarios inconsistentes: {$reason}. Inventarios detectados (máximo 20): {$details}."
);
}
}
};

View File

@@ -113,12 +113,16 @@ class InventoryStockMovementMigrationTest extends TestCase
public function test_migration_rejects_an_inventory_with_negative_available_stock(): void
{
DB::table('inventories')->insert([
'id' => 23,
'real_stock' => 1,
'reserved_stock' => 2,
]);
$this->expectException(\RuntimeException::class);
$this->expectExceptionMessage('stock disponible actual es negativo');
$this->expectExceptionMessage(
'stock disponible actual es negativo. Inventarios detectados (máximo 20): '
.'id=23 [real=1, vendidas=0, reintegradas=0, reservadas=2, reservas_entradas=0, resultado=-1]'
);
$this->stockMigration()->up();
}