@extends('admin.layout', [ 'title' => 'Neo Feeder', 'heading' => 'Integrasi Neo Feeder', 'subheading' => 'Sinkronisasi data SIAKAD dengan Neo Feeder PDDIKTI.', ]) @php $statusBadge = static function (string $status): string { return match ($status) { 'ready', 'agent_ready', 'dispatched' => 'badge badge-info', 'synced', 'reachable', 'completed', 'authenticated' => 'badge badge-success', 'failed', 'missing_url', 'disabled', 'unreachable', 'auth_failed' => 'badge badge-danger', default => 'badge badge-secondary', }; }; $statusIcon = static function (string $status): string { return match ($status) { 'ready', 'agent_ready' => 'fa-clock', 'dispatched' => 'fa-paper-plane', 'synced', 'reachable', 'completed', 'authenticated' => 'fa-check-circle', 'failed', 'missing_url', 'disabled', 'unreachable', 'auth_failed' => 'fa-times-circle', default => 'fa-question-circle', }; }; $statusColor = static function (string $status): string { return match ($status) { 'ready', 'agent_ready' => 'text-info', 'dispatched' => 'text-warning', 'synced', 'reachable', 'completed', 'authenticated' => 'text-success', 'failed', 'missing_url', 'disabled', 'unreachable', 'auth_failed' => 'text-danger', default => 'text-secondary', }; }; $isDirect = $config['mode'] === 'direct'; $isDryRun = $config['dry_run']; $isEnabled = $config['enabled'] ?? false; @endphp @section('admin-content') {{-- Alert Flash Messages --}} @if (session('success')) @endif @if (session('error')) @endif {{-- Mode Banner --}}
Mode {{ $isEnabled ? ucfirst($config['mode']) : 'Nonaktif' }} @if (! $isEnabled) — Integrasi Neo Feeder belum diaktifkan. Atur di halaman Integrasi. @elseif ($isDirect) aktif. Data akan langsung dikirim ke Neo Feeder tanpa melalui agent. @else aktif. Data disiapkan untuk diambil oleh agent lokal di PC Neo Feeder. @endif @if ($isDryRun && $isEnabled) Dry Run Aktif @endif
{{-- Visualisasi Arah Sinkronisasi --}}
Arah Sinkronisasi Data
{{-- Push: SIAKAD → Neo Feeder --}}
PUSH DATA
SIAKAD
Database Lokal
Neo Feeder
PDDIKTI

Mengirim data master (prodi, dosen, mahasiswa, kurikulum, mata kuliah, jadwal, KRS, nilai, AKM) dari SIAKAD ke Neo Feeder.

{{-- Separator --}}
DUA ARAH
{{-- Pull: Neo Feeder → SIAKAD --}}
TARIK DATA
Neo Feeder
PDDIKTI
SIAKAD
Database Lokal

Menarik data dari Neo Feeder PDDIKTI ke database SIAKAD lokal untuk sinkronisasi dan backup.

{{-- Statistik Dashboard --}}
Ringkasan Status Push (SIAKAD → Neo Feeder)
Mode
{{ $isEnabled ? ucfirst($config['mode']) : 'Off' }}
Pending
{{ $queueSummary['pending'] }}
Siap Agent
{{ $queueSummary['ready'] }}
Diproses
{{ $queueSummary['dispatched'] }}
Gagal
{{ $queueSummary['failed'] }}
Synced
{{ $queueSummary['synced'] }}
{{-- Import Stats --}}
Status Import dari Neo Feeder (Neo Feeder → SIAKAD)
Menunggu
{{ $importSummary['pending'] }}
Diproses
{{ $importSummary['dispatched'] }}
Selesai
{{ $importSummary['completed'] }}
Gagal
{{ $importSummary['failed'] }}
{{-- Konfigurasi & Agent Info --}}
Status Koneksi
{{ strtoupper(str_replace('_', ' ', $probe['status'])) }}

{{ $probe['message'] }}

Endpoint Neo Feeder
{{ $config['url'] !== '' ? $config['url'] : 'Belum diatur' }}
Dry Run
@if ($config['dry_run']) Aktif @else Nonaktif @endif
Credential
@if ($config['credentials_configured']) Siap @else Belum lengkap @endif
@if ($isDirect)
Mode direct aktif. SIAKAD akan langsung mengirim data ke Neo Feeder tanpa melalui agent.
@else
Mode agent aktif. SIAKAD menyiapkan payload, lalu agent lokal di PC Neo Feeder yang mengambil dan mengirimnya ke WS.
@endif
{{ $isDirect ? 'Direct Push' : 'Agent Lokal' }}
@if ($isDirect)
Mode Direct Push
Endpoint {{ $config['url'] }}
Timeout {{ $config['timeout'] }} detik
Data dikirim langsung dari server SIAKAD ke Neo Feeder. Pastikan server SIAKAD bisa mengakses IP Neo Feeder.
@else
Nama Agent {{ $agentConfig['name'] }}
Token @if ($agentConfig['token_configured']) Sudah dikonfigurasi @else Belum diatur @endif

Script PowerShell
{{ $agentConfig['push_script_path'] }}
Endpoint Agent
GET {{ $agentConfig['batch_endpoint'] }} POST {{ $agentConfig['complete_endpoint'] }}
Kalau request tarik data tetap pending, jalankan agent di PC Neo Feeder.
@endif
{{-- Entitas Cards --}}
Entitas Data
Pilih entitas untuk push ke Feeder atau tarik dari Feeder
@foreach ($entities as $entity)
{{-- Header --}}
{{ $entity['label'] }}

{{ $entity['description'] }}

@if ($entity['queueable']) Push @else Push Off @endif @if ($entity['importable']) Import @endif
{{-- Progress Stats --}} @php $total = max(1, $entity['total']); $linkedPct = round(($entity['linked'] / $total) * 100); @endphp
Tersinkron dengan Feeder {{ $entity['linked'] }} / {{ $entity['total'] }} ({{ $linkedPct }}%)
{{ $linkedPct }}%
{{-- Queue Stats --}}
Total
{{ $entity['total'] }}
Linked
{{ $entity['linked'] }}
Pending
{{ $entity['pending'] }}
Ready
{{ $entity['ready'] }}
Dispatch
{{ $entity['dispatched'] }}
Failed
{{ $entity['failed'] }}
{{-- Actions --}}
@if ($entity['queueable'])
@csrf
@csrf
@endif @if ($entity['importable'])
@csrf
@endif
@endforeach
{{-- Tables Row --}}
{{-- Request Import --}}
Request Tarik Data
Neo Feeder → SIAKAD
@forelse ($recentImportRequests as $importRequest) @empty @endforelse
Entitas Status Ringkasan
{{ $entityMap[$importRequest->entity_type] ?? $importRequest->entity_type }}
{{ $importRequest->created_at?->format('d M Y H:i') ?? '-' }}
{{ strtoupper($importRequest->status) }} @if (is_array($importRequest->summary)) +{{ $importRequest->summary['created'] ?? 0 }} ~{{ $importRequest->summary['updated'] ?? 0 }} -{{ $importRequest->summary['failed'] ?? 0 }} @else {{ Str::limit($importRequest->last_error ?: 'Menunggu agent...', 30) }} @endif

Belum ada request tarik data.
{{-- Antrean --}}
Antrean Terakhir
SIAKAD → Neo Feeder
@forelse ($recentQueues as $queue) @empty @endforelse
Entitas Status Pesan
{{ $entityMap[$queue->entity_type] ?? $queue->entity_type }}
ID: {{ $queue->entity_id }}
{{ strtoupper($queue->status) }} @if ($queue->last_error) {{ Str::limit($queue->last_error, 25) }} @else {{ $queue->dispatched_at?->format('d M H:i') ?? '-' }} @endif

Belum ada antrean.
{{-- Logs --}}
Log Sinkron
@forelse ($recentLogs as $log) @empty @endforelse
Entitas Status Pesan
{{ $entityMap[$log->entity_type] ?? $log->entity_type }}
{{ strtoupper($log->mode) }}
{{ strtoupper($log->status) }} {{ Str::limit($log->message ?? '-', 30) }}

Belum ada log sinkronisasi.
{{-- Agent Commands (hanya tampil jika mode agent) --}} @if (! $isDirect)
Perintah Agent (Jalankan di PC Neo Feeder)
Push Data ke Neo Feeder SIAKAD → Neo Feeder
powershell -ExecutionPolicy Bypass -File "{{ $agentConfig['push_script_path'] }}" ` -SiakadBaseUrl "{{ $agentConfig['siakad_base_url'] }}" ` -AgentToken "TOKEN_AGENT_DARI_ENV" ` -NeoFeederUrl "{{ $config['url'] }}" ` -NeoFeederUsername "USERNAME" ` -NeoFeederPassword "PASSWORD" ` -RunOnce
Tarik Data dari Neo Feeder Neo Feeder → SIAKAD
powershell -ExecutionPolicy Bypass -File "{{ $agentConfig['import_script_path'] }}" ` -SiakadBaseUrl "{{ $agentConfig['siakad_base_url'] }}" ` -AgentToken "TOKEN_AGENT_DARI_ENV" ` -NeoFeederUrl "{{ $config['url'] }}" ` -NeoFeederUsername "USERNAME" ` -NeoFeederPassword "PASSWORD" ` -RunOnce
@endif @endsection @push('styles') @endpush @push('scripts') @if (($importSummary['pending'] + $importSummary['dispatched'] + $queueSummary['ready'] + $queueSummary['dispatched']) > 0) @endif @endpush