@extends('layouts.app-sub') @section('title', '디지털 티켓 - GLOBEAU') @section('header-title', '디지털 티켓 보관함') @push('styles') @endpush @section('content')

발급된 프리미엄 뷰티 프로그램 티켓 목록입니다.

@if(isset($tickets) && $tickets->count() > 0)
@foreach($tickets as $ticket) @php $program = $ticket->orderItem->program ?? null; $executionType = strtolower(trim($program->execution_type ?? ($ticket->execution_type ?? 'single'))); $isPackage = str_contains($executionType, 'package') || in_array($executionType, ['package_single', 'package_separate', 'separate', 'special']); $isSeparate = str_contains($executionType, 'separate') || str_contains($executionType, 'special') || $executionType === 'package_separate'; // 1. 카테고리 배지 매핑 if ($executionType === 'package_separate') { $typeName = '스페셜 패키지'; $typeBadgeClass = 'badge-soft-purple'; $packageDesc = '본 패키지는 각각의 구성 시술을 1회차씩 나누어 개별 예약·이용할 수 있는 분할 패키지입니다.'; } elseif ($executionType === 'package_single') { $typeName = '베이직 패키지'; $typeBadgeClass = 'badge-soft-blue'; $packageDesc = '본 패키지는 1회 방문 시 아래의 모든 구성 코스를 한 번에 통합하여 집중 케어받는 베이직 패키지입니다.'; } else { $typeName = '기본 프로그램'; $typeBadgeClass = 'badge-soft-primary'; $packageDesc = '본 프로그램의 시술 구성 안내입니다.'; } $ticketStatus = strtolower(trim($ticket->status ?? 'active')); $statusLabels = [ 'active' => '사용 가능', 'exhausted' => '사용 완료', 'expired' => '기간 만료', 'cancelled' => '취소됨', ]; $statusText = $statusLabels[$ticketStatus] ?? '사용 가능'; if (in_array($ticketStatus, ['exhausted', 'expired'])) { $badgeClass = 'badge-state-warning'; } elseif (in_array($ticketStatus, ['cancelled'])) { $badgeClass = 'badge-state-danger'; } else { $badgeClass = 'badge-state-success'; } $rawTicketCode = $ticket->ticket_code ?? $ticket->id; $formattedTicketCode = implode('-', str_split($rawTicketCode, 4)); // 티켓 아이템 조회 (스페셜 패키지 및 단일 예약용) $ticketItems = \Illuminate\Support\Facades\DB::table('user_ticket_items') ->where('user_ticket_id', $ticket->id) ->get(); $totalRemaining = $ticketItems->count() > 0 ? $ticketItems->sum(function($item) { return $item->remaining_count ?? ($item->remaining ?? 1); }) : ($ticket->remaining_count ?? 1); $totalCount = $ticketItems->count() > 0 ? $ticketItems->sum(function($item) { return $item->total_count ?? ($item->total ?? 1); }) : ($ticket->total_count ?? 1); $firstTicketItem = $ticketItems->first(); $targetReservationId = $firstTicketItem ? ($firstTicketItem->id ?? $ticket->id) : $ticket->id; // 베이직 패키지일 때 프로그램 번들 테이블에서 구성 목록 직접 조회 $bundleItems = collect(); if ($isPackage && !$isSeparate && $program) { if (\Illuminate\Support\Facades\Schema::hasTable('program_bundles')) { // ⭕ 실제 존재하는 parent_program_id 단일 컬럼으로 조회 $bundleItems = \Illuminate\Support\Facades\DB::table('program_bundles') ->where('parent_program_id', $program->id) ->orderBy('id', 'asc') ->get(); } } @endphp
{{ $typeName }} {{-- ? 원형 대신 [? 구성품] 라벨 버튼 적용 --}} @if($isPackage) @endif
{{ $statusText }}
{{ $program->name ?? ($ticket->orderItem->name ?? '프리미엄 뷰티 프로그램') }}
코드: {{ $formattedTicketCode }}
잔여: {{ $totalRemaining }}회 / 총 {{ $totalCount }}회
@if($program && $program->duration_minutes)
소요: {{ $program->duration_minutes }}분
@endif @if($ticket->expires_at)
만료: {{ \Carbon\Carbon::parse($ticket->expires_at)->format('Y.m.d') }}까지
@endif
{{ $ticket->created_at ? $ticket->created_at->format('Y.m.d') : '-' }} 발급
@if(!$isSeparate && $targetReservationId && $ticketStatus === 'active' && $totalRemaining > 0) 예약하기 티켓 및 QR 보기 @else 티켓 및 QR 보기 @endif
@if($isPackage) @endif @endforeach
@if(method_exists($tickets, 'links'))
{{ $tickets->links() }}
@endif @else
보유 중인 티켓이 없습니다.

다양한 뷰티 프로그램을 만나보고 예약해보세요!

프로그램 보러가기
@endif
@endsection