diff --git a/app/Domains/Purchase/Models/PurchaseItem.php b/app/Domains/Purchase/Models/PurchaseItem.php index ee4e9f5..956b6dc 100644 --- a/app/Domains/Purchase/Models/PurchaseItem.php +++ b/app/Domains/Purchase/Models/PurchaseItem.php @@ -6,6 +6,7 @@ use App\Domains\Attachable\Models\Attachment; use App\Domains\Catalog\Models\CatalogItem; use App\Domains\Catalog\Models\Variant; use App\Domains\Ticket\Models\Ticket; +use App\Domains\Ticket\Models\TicketRefund; use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -66,6 +67,12 @@ class PurchaseItem extends Model return $this->hasMany(Ticket::class, 'source_purchase_item_id'); } + /** @return HasMany */ + public function ticketRefunds(): HasMany + { + return $this->hasMany(TicketRefund::class); + } + /** @return BelongsTo */ public function imageAttachment(): BelongsTo { diff --git a/app/Domains/Ticket/Models/Ticket.php b/app/Domains/Ticket/Models/Ticket.php index ee151aa..31041db 100644 --- a/app/Domains/Ticket/Models/Ticket.php +++ b/app/Domains/Ticket/Models/Ticket.php @@ -18,6 +18,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Support\Collection; use Illuminate\Validation\ValidationException; @@ -219,6 +220,12 @@ class Ticket extends Model return $this->belongsTo(PurchaseItem::class, 'source_purchase_item_id'); } + /** @return HasOne */ + public function refund(): HasOne + { + return $this->hasOne(TicketRefund::class); + } + /** @return BelongsTo */ public function sourceCatalogItem(): BelongsTo { @@ -284,6 +291,14 @@ class Ticket extends Model public function getStatusLabelAttribute(): string { + if ($this->status === self::STATUS_REFUNDED && $this->relationLoaded('refund')) { + $refund = $this->getRelation('refund'); + + if ($refund instanceof TicketRefund) { + return $refund->typeLabel(); + } + } + return self::statusLabel($this->status); } diff --git a/app/Domains/Ticket/Models/TicketRefund.php b/app/Domains/Ticket/Models/TicketRefund.php new file mode 100644 index 0000000..6af68f6 --- /dev/null +++ b/app/Domains/Ticket/Models/TicketRefund.php @@ -0,0 +1,66 @@ + 'integer', + 'purchase_item_id' => 'integer', + 'created_by_user_id' => 'integer', + 'amount' => 'decimal:2', + ]; + } + + /** @return list */ + public static function types(): array + { + return [self::TYPE_PARTIAL, self::TYPE_TOTAL]; + } + + public function typeLabel(): string + { + return match ($this->type) { + self::TYPE_PARTIAL => 'Reembolso parcial', + self::TYPE_TOTAL => 'Reembolso total', + default => 'Reembolsado', + }; + } + + /** @return BelongsTo */ + public function ticket(): BelongsTo + { + return $this->belongsTo(Ticket::class); + } + + /** @return BelongsTo */ + public function purchaseItem(): BelongsTo + { + return $this->belongsTo(PurchaseItem::class); + } + + /** @return BelongsTo */ + public function createdBy(): BelongsTo + { + return $this->belongsTo(User::class, 'created_by_user_id')->withTrashed(); + } +} diff --git a/database/migrations/2026_09_14_010000_create_ticket_refunds_table.php b/database/migrations/2026_09_14_010000_create_ticket_refunds_table.php new file mode 100644 index 0000000..e19a686 --- /dev/null +++ b/database/migrations/2026_09_14_010000_create_ticket_refunds_table.php @@ -0,0 +1,28 @@ +id(); + $table->foreignId('ticket_id')->unique()->constrained('tickets')->cascadeOnDelete(); + $table->foreignId('purchase_item_id')->constrained('compra_items')->restrictOnDelete(); + $table->foreignId('created_by_user_id')->nullable()->constrained('users')->nullOnDelete(); + $table->string('type', 16); + $table->decimal('amount', 10, 2); + $table->timestamps(); + + $table->index(['purchase_item_id', 'type']); + }); + } + + public function down(): void + { + Schema::dropIfExists('ticket_refunds'); + } +};