feat(variants): add minimum and maximum use dates to variants and update related logic

This commit is contained in:
2026-07-27 14:59:07 -03:00
parent 069867522a
commit aa4f3303fc
16 changed files with 391 additions and 28 deletions

View File

@@ -7,6 +7,7 @@ use App\Domains\Attachable\Models\Attachment;
use App\Domains\Auth\Models\User;
use App\Domains\Catalog\Enums\CatalogItemType;
use App\Domains\Catalog\Models\CatalogItem;
use App\Domains\Catalog\Models\Inventory;
use App\Domains\Notification\Events\TicketsAvailable;
use App\Domains\Purchase\Models\Purchase;
use App\Domains\Tenant\Models\Tenant;
@@ -93,6 +94,27 @@ class TicketGeneratorServiceTest extends TestCase
$this->service->generate($item, $this->user);
}
public function test_variant_dates_override_and_inherit_catalog_item_dates(): void
{
$item = $this->createTicketableItem(
'variant-dates',
now()->subDay(),
now()->addMonth(),
);
$inventory = Inventory::query()->create();
$variant = $item->variants()->create([
'inventory_id' => $inventory->id,
'maximum_use_date' => now()->addWeek(),
]);
$ticket = $this->service
->generate($item, $this->user, sourceVariantId: $variant->id)
->firstOrFail();
$this->assertTrue($ticket->starts_at->equalTo($item->minimum_use_date));
$this->assertTrue($ticket->expires_at->equalTo($variant->maximum_use_date));
}
public function test_it_generates_tickets_for_every_bundle_component_and_quantity(): void
{
$first = $this->createTicketableItem('first', maximumUseDate: now()->addDay());
@@ -111,6 +133,34 @@ class TicketGeneratorServiceTest extends TestCase
$this->assertCount(2, $tickets->where('name', $second->nombre));
}
public function test_bundle_component_uses_its_variant_dates(): void
{
$component = $this->createTicketableItem(
'variant-component',
now()->subDay(),
now()->addMonth(),
);
$inventory = Inventory::query()->create();
$variant = $component->variants()->create([
'inventory_id' => $inventory->id,
'minimum_use_date' => now()->addDay(),
'maximum_use_date' => now()->addWeek(),
]);
$bundle = $this->createBundle('variant-bundle');
$bundle->bundleComponents()->create([
'component_catalog_item_id' => $component->id,
'component_variant_id' => $variant->id,
'quantity' => 1,
]);
$ticket = $this->service
->generate($bundle, $this->user)
->firstOrFail();
$this->assertTrue($ticket->starts_at->equalTo($variant->minimum_use_date));
$this->assertTrue($ticket->expires_at->equalTo($variant->maximum_use_date));
}
public function test_bundle_generation_is_rolled_back_when_a_component_is_invalid(): void
{
$valid = $this->createTicketableItem('valid');
@@ -152,13 +202,15 @@ class TicketGeneratorServiceTest extends TestCase
public function test_a_ticket_generated_from_a_purchase_keeps_its_source_ids(): void
{
$item = $this->createTicketableItem('sourced-ticket');
$purchase = $this->createPurchase($item, 1, 1234);
$inventory = Inventory::query()->create();
$variant = $item->variants()->create(['inventory_id' => $inventory->id]);
$purchase = $this->createPurchase($item, 1, $variant->id);
$purchase->markAsPaid();
$this->assertDatabaseHas('tickets', [
'source_catalog_item_id' => $item->id,
'source_variant_id' => 1234,
'source_variant_id' => $variant->id,
]);
}