@if(data_get($titleStyle, 'visible', true))
@php
$titleTop = (int) round((float) data_get($titleStyle, 'top', 20) * $scaleY);
$titleLeft = (int) round((float) data_get($titleStyle, 'marginLeft', data_get($titleStyle, 'left', 0)) * $scaleX);
@endphp
{{ str_replace(["\r\n","\n"], ' ', ($activity->name ?? 'Sertifikat PESERTA')) }}
@endif
@if(data_get($certificateSetting, 'name.visible', true))
@php
$nameFont = data_get($certificateSetting, 'name.font');
if (empty($nameFont) || $nameFont === 'undefined') { $nameFont = 'DejaVu Sans'; }
$nameAlignRaw = strtolower((string) data_get($certificateSetting, 'name.align', 'center'));
$nameAlignCss = in_array($nameAlignRaw, ['kiri','left']) ? 'left' : (in_array($nameAlignRaw, ['kanan','right']) ? 'right' : 'center');
$nameTop = (int) round((float) data_get($certificateSetting, 'name.top', 190) * $scaleY);
$nameLeft = (int) round((float) data_get($certificateSetting, 'name.left', 30) * $scaleX);
$nameWidth = (int) round((float) data_get($certificateSetting, 'name.width', 180) * $scaleX);
@endphp
{{ $userParticipant->name ?? '-' }}
@endif
@if(data_get($certificateSetting, 'email.visible', false))
@php
$emailTop = (int) round((float) data_get($certificateSetting, 'email.top', 220) * $scaleY);
$emailLeft = (int) round((float) data_get($certificateSetting, 'email.left', 30) * $scaleX);
$emailWidth = (int) round((float) data_get($certificateSetting, 'email.width', 180) * $scaleX);
@endphp
{{ $userParticipant->email ?? '-' }}
@endif
@if(data_get($certificateSetting, 'no_hp.visible', false))
{{ $profileParticipant->no_hp ?? '-' }}
@endif
@if(data_get($certificateSetting, 'jenis_kelamin.visible', false))
@php
$genderTop = (int) round((float) data_get($certificateSetting, 'jenis_kelamin.top', 260) * $scaleY);
$genderLeft = (int) round((float) data_get($certificateSetting, 'jenis_kelamin.left', 30) * $scaleX);
$genderWidth = (int) round((float) data_get($certificateSetting, 'jenis_kelamin.width', 180) * $scaleX);
@endphp
{{ $profileParticipant->jenis_kelamin ?? '-' }}
@endif
@if(data_get($certificateSetting, 'pekerjaan.visible', false))
@php
$jobTop = (int) round((float) data_get($certificateSetting, 'pekerjaan.top', 280) * $scaleY);
$jobLeft = (int) round((float) data_get($certificateSetting, 'pekerjaan.left', 30) * $scaleX);
$jobWidth = (int) round((float) data_get($certificateSetting, 'pekerjaan.width', 180) * $scaleX);
@endphp
{{ $profileParticipant->pekerjaan ?? '-' }}
@endif
@if(data_get($certificateSetting, 'instansi.visible', false))
@php
$instTop = (int) round((float) data_get($certificateSetting, 'instansi.top', 290) * $scaleY);
$instLeft = (int) round((float) data_get($certificateSetting, 'instansi.left', 30) * $scaleX);
$instWidth = (int) round((float) data_get($certificateSetting, 'instansi.width', 180) * $scaleX);
@endphp
{{ $profileParticipant->instansi ?? '-' }}
@endif
@if(data_get($certificateSetting, 'jabatan.visible', false))
@php
$roleTop = (int) round((float) data_get($certificateSetting, 'jabatan.top', 300) * $scaleY);
$roleLeft = (int) round((float) data_get($certificateSetting, 'jabatan.left', 30) * $scaleX);
$roleWidth = (int) round((float) data_get($certificateSetting, 'jabatan.width', 180) * $scaleX);
@endphp
{{ $profileParticipant->jabatan ?? '-' }}
@endif
@if(data_get($certificateSetting, 'alamat.visible', false))
@php
$addrTop = (int) round((float) data_get($certificateSetting, 'alamat.top', 320) * $scaleY);
$addrLeft = (int) round((float) data_get($certificateSetting, 'alamat.left', 30) * $scaleX);
$addrWidth = (int) round((float) data_get($certificateSetting, 'alamat.width', 180) * $scaleX);
@endphp
{{ $profileParticipant->alamat ?? '-' }}
@endif
@if(data_get($certificateSetting, 'province.visible', false))
@php
$provTop = (int) round((float) data_get($certificateSetting, 'province.top', 340) * $scaleY);
$provLeft = (int) round((float) data_get($certificateSetting, 'province.left', 30) * $scaleX);
$provWidth = (int) round((float) data_get($certificateSetting, 'province.width', 180) * $scaleX);
@endphp
{{ $provinceParticipant ?? '-' }}
@endif
@if(data_get($certificateSetting, 'regency.visible', false))
@php
$regTop = (int) round((float) data_get($certificateSetting, 'regency.top', 360) * $scaleY);
$regLeft = (int) round((float) data_get($certificateSetting, 'regency.left', 30) * $scaleX);
$regWidth = (int) round((float) data_get($certificateSetting, 'regency.width', 180) * $scaleX);
@endphp
{{ $regencyParticipant ?? '-' }}
@endif
@if(data_get($certificateSetting, 'district.visible', false))
@php
$distTop = (int) round((float) data_get($certificateSetting, 'district.top', 380) * $scaleY);
$distLeft = (int) round((float) data_get($certificateSetting, 'district.left', 30) * $scaleX);
$distWidth = (int) round((float) data_get($certificateSetting, 'district.width', 180) * $scaleX);
@endphp
{{ $districtParticipant ?? '-' }}
@endif
@if(data_get($certificateSetting, 'certificate_id.visible', false))
@php
$certTop = (int) round((int) data_get($certificateSetting, 'certificate_id.top', 360) * $scaleY);
$certLeft = (int) round((int) data_get($certificateSetting, 'certificate_id.left', 30) * $scaleX);
$certWidth = (int) round((int) data_get($certificateSetting, 'certificate_id.width', 180) * $scaleX);
@endphp
{{ $peserta->certificate_id ?? '-' }}
@endif
@if($photoBase64 && data_get($photoStyle, 'visible', true))
@php $photoScaled = (int) round((float) data_get($photoStyle, 'size', 90) * $scaleX); @endphp
@endif
@php
// Mengambil posisi dan ukuran QR code
// PENTING: Di setting page, QR di-scale oleh JavaScript berdasarkan getCardScale()
// getCardScale() menghitung: scale = currentCardSize (yang di-render) / baseCardSize (defaultValue)
// actual_size adalah ukuran QR yang sudah di-scale untuk preview di setting page
// Di print, card menggunakan ukuran PENUH dari database dalam cm
// Untuk menyamakan ukuran QR di print dengan yang terlihat di setting:
// - Gunakan actual_size jika ada (ukuran yang benar-benar terlihat di setting)
// - Tapi actual_size adalah untuk card yang di-scale di preview, sedangkan di print card adalah ukuran penuh
// - Jadi perlu hitung balik: actual_size / scale_preview = size_input, lalu size_input * scale_print = ukuran di print
// - Tapi lebih mudah: gunakan actual_size dan kalikan dengan inverse scale preview
// - Atau lebih sederhana: jika card di print adalah baseCardSize, QR = actual_size * (baseCardSize / currentCardSize_preview)
// SOLUSI SEDERHANA: Gunakan size input langsung karena di print, card adalah ukuran penuh (100%)
// actual_size adalah untuk card yang di-scale di preview, jadi tidak relevan untuk print
$qrTop = (int) round(((float) data_get($qrStyle, 'top', 320) * $scaleY));
$qrLeft = (int) round((float) data_get($qrStyle, 'left', 90) * $scaleX);
$qrSizeInput = (float) data_get($qrStyle, 'size', 80);
$qrSizeActual = (float) data_get($qrStyle, 'actual_size', 0);
$qrSize = max((int) round($qrSizeInput * $scaleX), 0);
// DEBUG: Output nilai setting QR code
$debugQr = [
'top' => $qrTop,
'left' => $qrLeft,
'size_input' => $qrSizeInput,
'size_actual' => $qrSizeActual,
'size_used' => $qrSize,
'width_cm' => $widthCm,
'height_cm' => $heightCm,
'qrStyle_raw' => $qrStyle,
'certificateSetting_qr' => data_get($certificateSetting, 'qr', []),
];
@endphp
QR Debug:
Top: {{ $qrTop }}px
Left: {{ $qrLeft }}px
Size Input: {{ $qrSizeInput }}px
Size Actual: {{ $qrSizeActual ?? 'N/A' }}px
Size Used: {{ $qrSize }}px
Raw: {{ json_encode($qrStyle) }}
@php
$qrDataVal = route('activity.verify-certificate', ['id' => $activity->id]) . '?certificate_id=' . urlencode((string) ($peserta->certificate_id ?? ''));
try {
$qrBinary = \SimpleSoftwareIO\QrCode\Facades\QrCode::format('png')->size(max($qrSize, 40))->generate((string) $qrDataVal);
$qrBase64 = base64_encode($qrBinary);
$qrSrc = 'data:image/png;base64,'.$qrBase64;
} catch (\Throwable $e) {
$qrSrc = 'https://api.qrserver.com/v1/create-qr-code/?size='.max($qrSize,40).'x'.max($qrSize,40).'&data='.urlencode((string) $qrDataVal);
}
@endphp