{{-- Task #33864 — 有効接続率(他社乗り換え)— SCR-04 (read-only analytics, System Admin / 売上データ). EP-04: GET /admin/revenue/connection-rate/data (daily | monthly). 2 view (toggle FN-3/FN-7): 日次 = month picker + 4 thẻ KPI + danh sách theo ngày; 月次 = year picker (4月始まり) + bảng 12 tháng + ranking 乗り換え先 (Top 5). Nút「他社webhook 管理」(góc phải) → SCR-05 (phụ thuộc task #33865). ⏳ Pending — KHÔNG codify (D-03): 有効接続率 / 有効% / 無効% / paid_plan_rate / free_to_paid / valid_rate / 前月比 (QA-spec-033/006) → giá trị null → render「-」(BR-G4). switch_dest = 管理名 join-on-read (QD-05, own #33865) → null → URL/「-」. main_owner name+email (⏳ QA-spec-031). UI compose lme-ui (date-picker/button/icon). Thẻ KPI + bảng analytics tự dựng (không có component lme phủ card KPI / bảng ranking đa cột) — cùng cách sibling churn dựng . --}} @extends('layout.admin_v2.main') @section('title') 有効接続率 @endsection @push('css') @endpush @section('content')
{{-- Header 1 dòng: tiêu đề + ◀ [date-picker] ▶ + toggle view | 「他社webhook 管理」(góc phải — BR-21) --}}

有効接続率(他社乗り換え)

{{-- 日次: chọn THÁNG · 月次: chọn NĂM (4月始まり) — lme-date-picker (Figma: ô viền + icon lịch) --}}
{{-- Toggle view — nhãn theo view hiện tại (FN-3) --}} @{{ toggleLabel }} {{-- Nút điều hướng SCR-05 (task #33865). Trước đây hardcode path vì route chưa tồn tại trong branch; #33865 đã merge (commit 9e04946427) nên dùng route() — đổi prefix ở routes/web.php sẽ tự lan sang đây, không còn link chết âm thầm. --}} 他社webhook 管理
{{-- Vùng nội dung --}}
{{-- Loading --}}
{{-- Error (5xx/network) + 再試行 --}}

@{{ error }}

再試行
{{-- ========================= 日次 view ========================= --}}
{{-- 4 thẻ KPI (BR-22). Giá trị ⏳ QA-spec-033 → 「-」 --}}
{{-- 全体有効接続率 --}}
全体有効接続率
有効:@{{ formatPercent(kpi.overall_rate.valid_pct) }} 無効:@{{ formatPercent(kpi.overall_rate.invalid_pct) }}
{{-- Thanh process: phần active = 有効% --}}
有効:@{{ formatCount(kpi.overall_rate.valid_count) }}件
無効:@{{ formatCount(kpi.overall_rate.invalid_count) }}件
{{-- 有料プラン有効接続率 --}}
有料プラン有効接続率
有効:@{{ formatPercent(kpi.paid_plan_rate.valid_pct) }} 無効:@{{ formatPercent(kpi.paid_plan_rate.invalid_pct) }}
有効:@{{ formatCount(kpi.paid_plan_rate.valid_count) }}件
無効:@{{ formatCount(kpi.paid_plan_rate.invalid_count) }}件
{{-- フリー/有料 比率 --}}
フリー/有料 比率
フリー:@{{ formatPercent(kpi.free_to_paid.free_pct) }} 有料:@{{ formatPercent(kpi.free_to_paid.paid_pct) }}
{{-- Figma: phần active (有料) nằm bên phải --}}
フリー:@{{ formatCount(kpi.free_to_paid.free_count) }}件
有料 :@{{ formatCount(kpi.free_to_paid.paid_count) }}件
{{-- 乗り換え先 TOP5 --}}
乗り換え先 TOP5
{{-- Luôn hiển thị đủ 5 dòng (1..5) — slot thiếu dữ liệu → 「-」(BR-G4) --}}
  1. @{{ i + 1 }}: @{{ formatTopCount(t.count) }}件(@{{ formatTopPercent(t.pct) }}) {{-- fix(#39577): có URL webhook đối thủ → mở TAB MỚI (link ngoài hệ thống nên kèm rel noopener). Không có URL → giữ text thường. --}} {{-- Tên bị cắt bởi ellipsis (card cố định 250px) → hover hiện tooltip tên đầy đủ. Dùng title thay tooltip CSS vì .cnr-kpi-card có overflow:hidden sẽ cắt mất tooltip absolute. Slot rỗng (「-」) → topsTitle() trả null nên Vue bỏ hẳn attribute. --}} @{{ formatText(t.name) }} @{{ formatText(t.name) }}
{{-- Danh sách chi tiết theo ngày (BR-23) --}}
{{-- 料金プラン: chấm tròn màu (有料 = xanh, フリー = xám) + nhãn --}} {{-- LINE公式アカウント: tên (link xanh) + @id xuống dòng (xám) --}}
webhook無効日時 料金プラン 乗り換え先(webhook) LINE公式アカウント名 主取得者情報
-
@{{ formatText(row.webhook_disabled_at) }} @{{ formatText(row.plan) }} @{{ formatText(row.switch_dest) }}
{{-- fix(#39631): trước đây là ô tròn xám rỗng. Nay hiện avatar LINE của LOA (bots.bot_image = pictureUrl từ LINE); không có ảnh hoặc URL hỏng → avatar mặc định user-outlined.svg, đúng cách các màn System Admin khác làm (@error=altImage). --}}
{{-- fix(#39577): tên BOT → màn detail bot. Trước đây href="#" (bấm không đi đâu). Thiếu bot_id → text thường. --}} @{{ loaName(row.line_account) }} @{{ loaName(row.line_account) }} @{{ loaId(row.line_account) }}
{{-- fix(#39596): nút này ĐĂNG NHẬP HỘ user đó ở TAB MỚI (giữ phiên admin tab hiện tại). Thiếu link → disable. --}}
{{-- fix(#39577): tên user → màn detail user --}} {{-- fix(#39631): tên/email dài bị cắt ellipsis nhưng hover không thấy full text. Thêm :title (native tooltip) — cùng cách màn 解約率 (churn_rate) đang dùng cho nhãn 経路 bị cắt. --}} @{{ formatText(row.main_owner.name) }} @{{ formatText(row.main_owner.name) }} @{{ formatText(row.main_owner.email) }}
{{-- ========================= 月次 view ========================= --}} {{-- 1 bảng gộp: 月 + 有効接続率(有効/無効/有効接続率/前月比) + 乗り換え先(1位..5位, mỗi hạng 2 cột). --}}
{{-- Nhóm 有効接続率 (ô gộp + 4 cột con) nền đậm hơn #E0E0E0 để tách khỏi nhóm 乗り換え先; đánh dấu bằng class thay vì nth-child vì số cột 乗り換え先 phụ thuộc RANK_N. --}}
月 有効接続率 乗り換え先
有効 無効 有効接続率 前月比
@{{ row.month }} @{{ formatCount(row.valid) }} @{{ formatCount(row.invalid) }} @{{ formatPercent(row.valid_rate) }} @{{ formatPercent(row.prev_month_ratio) }}
@endsection @push('script') @endpush