- Updated the FeaturedGroupService to include 'variants.eventDates' in the items query. - Introduced a BelongsToMany relationship in EventDate for selected variants. - Modified PurchaseItemResource and PurchaseItemSnapshotFactory to handle multiple event dates for variants. - Enhanced StartCheckoutService to load event dates for variants. - Updated TicketGeneratorService to accommodate event dates in ticket generation. - Created migrations to support multi-value event dates and allow multiple variant values per attribute. - Adjusted seeders to reflect new event date handling and added new attributes. - Added tests to ensure correct functionality for multi-date variants and their integration with ticket generation.
143 lines
3.8 KiB
PHP
143 lines
3.8 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Catalog\Models;
|
|
|
|
use App\Domains\Attachable\Models\Attachment;
|
|
use App\Domains\Event\Models\EventDate;
|
|
use App\Domains\Ticket\Models\Ticket;
|
|
use Illuminate\Database\Eloquent\Attributes\Fillable;
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Illuminate\Support\Collection;
|
|
|
|
#[Fillable([
|
|
'catalog_item_id',
|
|
'event_date_id',
|
|
'inventory_id',
|
|
])]
|
|
class Variant extends Model
|
|
{
|
|
use HasFactory;
|
|
|
|
public $timestamps = false;
|
|
|
|
protected $table = 'variantes';
|
|
|
|
protected function casts(): array
|
|
{
|
|
return [
|
|
'catalog_item_id' => 'integer',
|
|
'event_date_id' => 'integer',
|
|
'inventory_id' => 'integer',
|
|
];
|
|
}
|
|
|
|
/** @return BelongsTo<CatalogItem, $this> */
|
|
public function catalogItem(): BelongsTo
|
|
{
|
|
return $this->belongsTo(CatalogItem::class);
|
|
}
|
|
|
|
/** @return BelongsTo<EventDate, $this> */
|
|
public function eventDate(): BelongsTo
|
|
{
|
|
return $this->belongsTo(EventDate::class);
|
|
}
|
|
|
|
/** @return BelongsToMany<EventDate, $this> */
|
|
public function eventDates(): BelongsToMany
|
|
{
|
|
return $this->belongsToMany(
|
|
EventDate::class,
|
|
'variant_event_dates',
|
|
'variant_id',
|
|
'event_date_id',
|
|
)->orderBy('date')->orderBy('time_start');
|
|
}
|
|
|
|
/** @return HasMany<Ticket, $this> */
|
|
public function sourceTickets(): HasMany
|
|
{
|
|
return $this->hasMany(Ticket::class, 'source_variant_id');
|
|
}
|
|
|
|
/** @return BelongsTo<Inventory, $this> */
|
|
public function inventory(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Inventory::class);
|
|
}
|
|
|
|
/** @return HasMany<VariantDefinition, $this> */
|
|
public function definitions(): HasMany
|
|
{
|
|
return $this->hasMany(VariantDefinition::class);
|
|
}
|
|
|
|
/** @return BelongsToMany<Attachment, $this> */
|
|
public function attachments(): BelongsToMany
|
|
{
|
|
$relation = $this->belongsToMany(
|
|
Attachment::class,
|
|
'catalog_items_attachments',
|
|
'variant_id',
|
|
'attachment_id'
|
|
)
|
|
->withPivot('orden')
|
|
->orderByPivot('orden');
|
|
|
|
if ($this->catalog_item_id !== null) {
|
|
$relation->withPivotValue('catalog_item_id', $this->catalog_item_id);
|
|
}
|
|
|
|
return $relation;
|
|
}
|
|
|
|
public function getPrice(): float
|
|
{
|
|
return $this->catalogItem->getPrice();
|
|
}
|
|
|
|
public function getName(): string
|
|
{
|
|
return $this->catalogItem->nombre;
|
|
}
|
|
|
|
/** @return Collection<string, string|array<int, string>> */
|
|
public function selectionValues(): Collection
|
|
{
|
|
$values = $this->definitions
|
|
->mapWithKeys(fn ($definition) => [
|
|
$definition->itemAttribute?->attribute?->codigo => $definition->value,
|
|
])
|
|
->filter(fn ($value, $key): bool => $key !== null);
|
|
|
|
$eventDateIds = $this->selectedEventDates()
|
|
->pluck('id')
|
|
->map(fn ($id): string => (string) $id)
|
|
->values();
|
|
|
|
if ($eventDateIds->count() === 1) {
|
|
$values->put('event_date', $eventDateIds->first());
|
|
} elseif ($eventDateIds->isNotEmpty()) {
|
|
$values->put('event_date', $eventDateIds->all());
|
|
}
|
|
|
|
return $values;
|
|
}
|
|
|
|
/** @return Collection<int, EventDate> */
|
|
public function selectedEventDates(): Collection
|
|
{
|
|
$eventDates = $this->eventDates;
|
|
|
|
if ($eventDates->isEmpty() && $this->event_date_id !== null && $this->eventDate !== null) {
|
|
return collect([$this->eventDate]);
|
|
}
|
|
|
|
return $eventDates;
|
|
}
|
|
}
|