feat(variants): implement inventory cloning for historical stock updates and adjust related tests
This commit is contained in:
@@ -8,6 +8,8 @@ use App\Domains\Auth\Models\User;
|
||||
use App\Domains\Authorization\Enums\RoleCode;
|
||||
use App\Domains\Catalog\Models\CatalogItem;
|
||||
use App\Domains\Catalog\Models\Inventory;
|
||||
use App\Domains\Catalog\Models\StockReservation;
|
||||
use App\Domains\Catalog\Models\StockReservationLine;
|
||||
use App\Domains\Catalog\Models\Variant;
|
||||
use App\Domains\Event\Events\EventDateRescheduled;
|
||||
use App\Domains\Event\Events\EventDateSuspended;
|
||||
@@ -249,7 +251,17 @@ class AdminAppEventControllerTest extends TestCase
|
||||
'time_end' => '20:00',
|
||||
]);
|
||||
$variant = $this->createVariant($tenant, $original->id);
|
||||
$variant->inventory()->update(['real_stock' => 5]);
|
||||
$variant->inventory()->update(['real_stock' => 5, 'reserved_stock' => 2]);
|
||||
$reservation = StockReservation::query()->create([
|
||||
'status' => StockReservation::STATUS_ACTIVE,
|
||||
'expires_at' => now()->addHour(),
|
||||
]);
|
||||
$reservationLine = StockReservationLine::query()->create([
|
||||
'stock_reservation_id' => $reservation->id,
|
||||
'inventory_id' => $variant->inventory_id,
|
||||
'quantity' => 2,
|
||||
'tracks_inventory' => true,
|
||||
]);
|
||||
$ticket = $this->createTicket($tenant, $admin, $variant);
|
||||
Sanctum::actingAs($admin);
|
||||
|
||||
@@ -283,7 +295,12 @@ class AdminAppEventControllerTest extends TestCase
|
||||
$replacement = $variant->replacement()->firstOrFail();
|
||||
$this->assertSame($original->id, $variant->event_date_id);
|
||||
$this->assertSame($destination->id, $replacement->event_date_id);
|
||||
$this->assertSame($variant->inventory_id, $replacement->inventory_id);
|
||||
$this->assertNotSame($variant->inventory_id, $replacement->inventory_id);
|
||||
$this->assertSame(5, $variant->inventory->fresh()->real_stock);
|
||||
$this->assertSame(0, $variant->inventory->fresh()->reserved_stock);
|
||||
$this->assertSame(5, $replacement->inventory->real_stock);
|
||||
$this->assertSame(2, $replacement->inventory->reserved_stock);
|
||||
$this->assertSame($replacement->inventory_id, $reservationLine->fresh()->inventory_id);
|
||||
$this->assertNotNull($variant->sales_disabled_at);
|
||||
$this->assertSame($replacement->id, $variant->replaced_by_variant_id);
|
||||
$this->assertSame(
|
||||
@@ -350,7 +367,8 @@ class AdminAppEventControllerTest extends TestCase
|
||||
]);
|
||||
$replacement->refresh();
|
||||
$latestReplacement = $replacement->replacement()->firstOrFail();
|
||||
$this->assertSame($replacement->inventory_id, $latestReplacement->inventory_id);
|
||||
$this->assertNotSame($replacement->inventory_id, $latestReplacement->inventory_id);
|
||||
$this->assertSame(5, $latestReplacement->inventory->real_stock);
|
||||
$this->assertSame('2027-10-25', $latestReplacement->eventDate->date->format('Y-m-d'));
|
||||
$this->assertFalse($replacement->isSellable());
|
||||
$this->assertTrue($latestReplacement->isSellable());
|
||||
|
||||
@@ -7,6 +7,7 @@ use App\Domains\Authorization\Enums\RoleCode;
|
||||
use App\Domains\Catalog\Models\Attribute;
|
||||
use App\Domains\Catalog\Models\CatalogItem;
|
||||
use App\Domains\Catalog\Models\Category;
|
||||
use App\Domains\Catalog\Models\Inventory;
|
||||
use App\Domains\Catalog\Models\Variant;
|
||||
use App\Domains\Event\Services\EventService;
|
||||
use App\Domains\Menu\Models\Menu;
|
||||
@@ -224,16 +225,33 @@ class FoodControllerTest extends TestCase
|
||||
$historicalVariantId = $created->json('data.variants.0.id');
|
||||
$activeVariantId = $created->json('data.variants.1.id');
|
||||
|
||||
app(EventService::class)->suspendDateForTenant($tenant, $historicalDate, $admin);
|
||||
app(EventService::class)->rescheduleDateForTenant(
|
||||
$tenant,
|
||||
$historicalDate,
|
||||
['date' => $activeDate->date->format('Y-m-d')],
|
||||
$admin,
|
||||
);
|
||||
$historicalVariant = Variant::query()->findOrFail($historicalVariantId);
|
||||
$replacementVariant = $historicalVariant->replacement()->firstOrFail();
|
||||
$replacementInventoryId = $replacementVariant->inventory_id;
|
||||
|
||||
$this->patchJson('/api/v1/adminapp/tenant/foods/history-stock', [
|
||||
// Simula variantes creadas antes de que la reprogramación separara sus inventarios.
|
||||
$replacementVariant->update(['inventory_id' => $historicalVariant->inventory_id]);
|
||||
Inventory::query()->whereKey($replacementInventoryId)->delete();
|
||||
|
||||
$updated = $this->patchJson('/api/v1/adminapp/tenant/foods/history-stock', [
|
||||
'variants' => [['id' => $historicalVariantId, 'stock' => 45]],
|
||||
])
|
||||
->assertOk()
|
||||
->assertJsonPath('data.history.0.variants.0.id', $historicalVariantId)
|
||||
->assertJsonPath('data.history.0.variants.0.stock', 45);
|
||||
$replacement = collect($updated->json('data.variants'))
|
||||
->firstWhere('schedule', 'Almuerzo');
|
||||
$this->assertSame(100, $replacement['stock']);
|
||||
|
||||
$historicalInventoryId = Variant::query()->findOrFail($historicalVariantId)->inventory_id;
|
||||
$currentInventoryId = $replacementVariant->fresh()->inventory_id;
|
||||
$this->assertNotSame($historicalInventoryId, $currentInventoryId);
|
||||
$this->assertDatabaseHas('inventories', [
|
||||
'id' => $historicalInventoryId,
|
||||
'real_stock' => 45,
|
||||
|
||||
Reference in New Issue
Block a user