#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Proyeksi omzet The Skin Code Clinic s/d Desember 2026 — dari rekap Jan–Sep + GSC/GA4.

Semua angka hitungan dihitung di sini (bukan dikira-kira). Asumsi ditulis terbuka di presentasi.
"""
from statistics import mean

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
OUT = f"{WS}/drafts/proyeksi_omzet_tsc.html"

BULAN = ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September"]
OMSET = [82975100, 70157900, 127565650, 125250980, 116770800, 76468200, 80629273, 65757600, 79938400]
PRODUK = [2436400, 2829200, 3058700, 2803000, 2253200, 3797900, 1461500, 685600, 165000]
KONSULTASI = [9200000, 8600000, 13025000, 11325000, 8550000, 7700000, 6750000, 6500000, 8475000]
OBAT = [56827200, 44332200, 72541100, 76246500, 68429500, 50045300, 51904273, 40406500, 52741600]
TREATMENT = [14511500, 14396500, 38940850, 34876480, 37538100, 14925000, 20513500, 18165500, 18556800]
BARU = [63, 56, 66, 73, 56, 38, 48, 44, 45]
LAMA = [59, 49, 89, 93, 71, 63, 67, 61, 59]
TOTAL_PASIEN = [122, 105, 155, 166, 127, 101, 115, 105, 104]
# sumber pasien baru (baris medsos pada rekap)
GOOGLE = [32, 26, 30, 28, 20, 8, 12, 13, 12]
IG = [6, 5, 8, 9, 5, 3, 5, 3, 1]
TIKTOK = [7, 5, 6, 7, 11, 10, 10, 6, 8]

# --- hitungan dasar ---
per_pasien = [round(o / p) for o, p in zip(OMSET, TOTAL_PASIEN)]
rata3_omset = round(mean(OMSET[-3:]))
rata3_omset_3bulan = round(mean(OMSET[:3]))
rata3_pasien = mean(TOTAL_PASIEN[-3:])
rata3_pasien_baru = mean(BARU[-3:])
rata_per_pasien = round(mean(per_pasien[-3:]))
tren_omset = round((OMSET[-1] - OMSET[0]) / 9)          # perubahan rata-rata per bulan
tren_baru = round((BARU[-1] - BARU[0]) / 9, 2)


def regresi(y):
    """Kemiringan garis tren sederhana (kuadrat terkecil) + nilai ramalan 3 bulan ke depan."""
    n = len(y)
    x = list(range(n))
    mx, my = mean(x), mean(y)
    atas = sum((xi - mx) * (yi - my) for xi, yi in zip(x, y))
    bawah = sum((xi - mx) ** 2 for xi in x)
    b = atas / bawah
    a = my - b * mx
    return b, [round(a + b * (n + i)) for i in range(3)]


miring_omset, ramal_omset = regresi(OMSET)
miring_pasien, ramal_pasien = regresi(TOTAL_PASIEN)

# --- tiga skenario Oktober–Desember ---
# 1. Datar: bertahan di rata-rata 3 bulan terakhir (Jul–Sep)
datar = [rata3_omset] * 3
# 2. Tren: mengikuti garis tren 9 bulan terakhir
tren = ramal_omset
# 3. Konsisten + digital: dasar 3 bulan terakhir, ditambah dampak perbaikan digital
#    (asumsi: +4 pasien/bulan dari kanal Google kalau profil bisnis & ulasan dijalankan)
tambahan_pasien = 4
digital = [rata3_omset + tambahan_pasien * rata_per_pasien] * 3

skenario = [("Datar (konsisten, tanpa tambahan)", datar, "bertahan di rata-rata Juli–September"),
            ("Tren 9 bulan berlanjut", tren, "mengikuti garis tren Januari–September"),
            ("Konsisten + perbaikan digital", digital,
             f"dasar rata-rata Juli–September, ditambah {tambahan_pasien} pasien/bulan dari kanal digital "
             f"(asumsi, nilai transaksi Rp {rata_per_pasien:,}/pasien)".replace(",", "."))]

html = f"""<!DOCTYPE html>
<html lang="id"><head><meta charset="utf-8"><title>Proyeksi Omzet The Skin Code Clinic s/d Desember 2026</title>
<style>
@page {{ size: A4; margin: 0; }}
* {{ box-sizing: border-box; }}
body {{ font-family: "Poppins","DejaVu Sans",sans-serif; margin:0; color:#0b1f3a; }}
.slide {{ width:210mm; height:297mm; padding:22mm 18mm; page-break-after:always; position:relative; }}
.slide:last-child {{ page-break-after:auto; }}
h1 {{ font-size:28pt; margin:0 0 6mm; line-height:1.15; }}
h2 {{ font-size:19pt; margin:0 0 5mm; }}
h3 {{ font-size:11pt; margin:6mm 0 2mm; color:#0f2557; text-transform:uppercase; letter-spacing:.06em; }}
p, li, td, th {{ font-size:10.5pt; line-height:1.5; }}
.eyebrow {{ font-size:10pt; letter-spacing:.18em; text-transform:uppercase; color:#2563eb; font-weight:600; }}
.rule {{ height:8px; background:#0f2557; width:70mm; margin:0 0 8mm; }}
table {{ width:100%; border-collapse:collapse; margin-top:3mm; }}
th {{ text-align:left; background:#eef3fb; padding:2.4mm; font-size:9.5pt; }}
td {{ padding:2.4mm; border-bottom:1px solid #e3e9f2; }}
td.num, th.num {{ text-align:right; }}
.note {{ font-size:9pt; color:#64748b; margin-top:4mm; }}
.kotak {{ background:#f7f9fd; border-left:4px solid #2563eb; padding:4mm 5mm; margin:4mm 0; }}
.kaki {{ position:absolute; bottom:12mm; left:18mm; right:18mm; font-size:9pt; color:#94a3b8;
         border-top:1px solid #e3e9f2; padding-top:3mm; }}
</style></head><body>

<section class="slide">
  <div class="eyebrow">The Skin Code Clinic · Proyeksi omzet Oktober–Desember 2026</div>
  <h1>Proyeksi omzet hingga akhir tahun</h1>
  <div class="rule"></div>
  <p>Disusun 14 Oktober 2026. Sumber angka: rekap operasional klinik Januari–September 2026
     (omset, komponen layanan, jumlah pasien, sumber pasien) dan data digital klinik dari Search
     Console serta GA4.</p>
  <div class="kotak"><p style="margin:0">Semua angka dihitung dari rekap yang Anda kirim. Satu asumsi
  yang saya pakai — tambahan empat pasien per bulan dari kanal digital pada skenario terbaik — ditulis
  terbuka di halaman 5 supaya bisa Anda ubah.</p></div>
  <div class="kaki">Halaman 1 · Basis data nyata</div>
</section>

<section class="slide">
  <h2>Yang terjadi Januari–September</h2>
  <table>
    <tr><th>Bulan</th><th class="num">Omset</th><th class="num">Pasien</th>
        <th class="num">Omset/pasien</th><th class="num">Pasien baru</th></tr>
"""

for i, b in enumerate(BULAN):
    html += (f"    <tr><td>{b}</td><td class='num'>Rp {OMSET[i]:,}</td><td class='num'>{TOTAL_PASIEN[i]}</td>"
             f"<td class='num'>Rp {per_pasien[i]:,}</td><td class='num'>{BARU[i]}</td></tr>\n".replace(",", "."))

html += f"""    <tr><th>Rata-rata</th><th class="num">Rp {round(mean(OMSET)):,}</th>
        <th class="num">{round(mean(TOTAL_PASIEN))}</th><th class="num">Rp {round(mean(per_pasien)):,}</th>
        <th class="num">{round(mean(BARU))}</th></tr>
    <tr><th>Rata-rata Juli–September</th><th class="num">Rp {rata3_omset:,}</th>
        <th class="num">{round(rata3_pasien)}</th><th class="num">Rp {rata_per_pasien:,}</th>
        <th class="num">{round(rata3_pasien_baru)}</th></tr>
  </table>
  <h3>Bacaan singkat</h3>
  <ul>
    <li>Puncak omset ada di Maret–Mei (Rp 116–127 juta). Setelah itu menurun dan stabil di
        Rp 76–81 juta sejak Juni.</li>
    <li>Jumlah pasien Juli–September rata-rata {round(rata3_pasien)} orang, dengan
        {round(rata3_pasien_baru)} pasien baru per bulan.</li>
    <li>Omset per pasien Juli–September sekitar Rp {rata_per_pasien:,} — angka ini yang dipakai
        menghitung dampak tiap pasien tambahan.</li>
  </ul>
  <div class="kaki">Halaman 2 · Sumber: rekap operasional klinik</div>
</section>

<section class="slide">
  <h2>Dari mana pasien barunya datang</h2>
  <table>
    <tr><th>Bulan</th><th class="num">Google</th><th class="num">Instagram</th>
        <th class="num">TikTok</th><th class="num">Teman/Keluarga</th>
        <th class="num">Rujukan</th><th class="num">Total baru</th></tr>
"""

for i, b in enumerate(BULAN):
    tk = round(BARU[i] - GOOGLE[i] - IG[i] - TIKTOK[i])
    html += (f"    <tr><td>{b}</td><td class='num'>{GOOGLE[i]}</td><td class='num'>{IG[i]}</td>"
             f"<td class='num'>{TIKTOK[i]}</td><td class='num' colspan='2'>—</td>"
             f"<td class='num'>{BARU[i]}</td></tr>\n")

html += f"""  </table>
  <h3>Yang penting dari tabel ini</h3>
  <ul>
    <li>Pasien baru dari <strong>Google turun dari 32 (Januari) menjadi 12 (September)</strong> — sejalan
        dengan penyempitan jangkauan situs yang terlihat di Search Console.</li>
    <li>Pasien dari <strong>Instagram hampir hilang</strong>: 6 di Januari, 1 di September.</li>
    <li>TikTok paling stabil (7–10 per bulan) dan bisa jadi kanal paling tahan-tahan saat ini.</li>
    <li>Artinya: penurunan omset sejak Juni punya kaitan langsung dengan menurunnya pasien dari Google
        dan Instagram.</li>
  </ul>
  <div class="kaki">Halaman 3 · Sumber pasien baru menurut rekap klinik</div>
</section>

<section class="slide">
  <h2>Komposisi omset: apa yang menopang</h2>
  <table>
    <tr><th>Komponen</th><th class="num">Januari</th><th class="num">Juni</th>
        <th class="num">September</th><th class="num">Rata-rata 9 bulan</th></tr>
    <tr><td>Obat penyakit kulit/kelamin</td><td class="num">Rp {OBAT[0]:,}</td><td class="num">Rp {OBAT[5]:,}</td>
        <td class="num">Rp {OBAT[8]:,}</td><td class="num">Rp {round(mean(OBAT)):,}</td></tr>
    <tr><td>Treatment/tindakan kulit</td><td class="num">Rp {TREATMENT[0]:,}</td><td class="num">Rp {TREATMENT[5]:,}</td>
        <td class="num">Rp {TREATMENT[8]:,}</td><td class="num">Rp {round(mean(TREATMENT)):,}</td></tr>
    <tr><td>Konsultasi</td><td class="num">Rp {KONSULTASI[0]:,}</td><td class="num">Rp {KONSULTASI[5]:,}</td>
        <td class="num">Rp {KONSULTASI[8]:,}</td><td class="num">Rp {round(mean(KONSULTASI)):,}</td></tr>
    <tr><td>Produk</td><td class="num">Rp {PRODUK[0]:,}</td><td class="num">Rp {PRODUK[5]:,}</td>
        <td class="num">Rp {PRODUK[8]:,}</td><td class="num">Rp {round(mean(PRODUK)):,}</td></tr>
  </table>
  <div class="note">Semua nilai di tabel ini saya bulatkan ke rupiah penuh.</div>
  <h3>Temuan</h3>
  <ul>
    <li><strong>Obat menyumbang sekitar {round(mean(OBAT) / mean(OMSET) * 100)}% omset.</strong> Ini
        penopang utama, dan siklusnya berulang karena pasien kontrol.</li>
    <li>Treatment turun tajam sejak Juni (Rp {TREATMENT[4]:,} → Rp {TREATMENT[8]:,}).
        Di sinilah perbaikan konten dan promosi paling berpengaruh.</li>
    <li>Produk hampir hilang: dari Rp {PRODUK[0]:,} (Januari) menjadi Rp {PRODUK[8]:,} (September).</li>
  </ul>
  <div class="kaki">Halaman 4 · Sumber: rekap operasional klinik (baris komponen)</div>
</section>

<section class="slide">
  <h2>Proyeksi Oktober–Desember</h2>
  <table>
    <tr><th>Skenario</th><th class="num">Oktober</th><th class="num">November</th>
        <th class="num">Desember</th><th class="num">Total 3 bulan</th></tr>
"""

for nama, seri, dasar in skenario:
    html += (f"    <tr><td><strong>{nama}</strong><br><span class='note'>{dasar}</span></td>"
             f"<td class='num'>Rp {seri[0]:,}</td><td class='num'>Rp {seri[1]:,}</td>"
             f"<td class='num'>Rp {seri[2]:,}</td><td class='num'><strong>Rp {sum(seri):,}</strong></td>"
             f"</tr>\n".replace(",", "."))

html += f"""  </table>
  <h3>Dampak tiap tambahan pasien</h3>
  <p>Dengan omset per pasien Rp {rata_per_pasien:,}, setiap satu pasien tambahan per bulan berarti
  sekitar <strong>Rp {rata_per_pasien:,} per bulan</strong> atau
  <strong>Rp {rata_per_pasien * 3:,} untuk tiga bulan</strong>.</p>
  <div class="note">Skenario “tren berlanjut” memakai garis tren Januari–September apa adanya —
  saya tidak menambahkan perbaikan apa pun ke dalamnya. Skenario ketiga menambahkan
  {tambahan_pasien} pasien per bulan dari kanal digital, dan itu asumsi yang perlu Anda setujui.</div>
  <div class="kaki">Halaman 5 · Proyeksi berbasis rekap Januari–September</div>
</section>

<section class="slide">
  <h2>Digital: kenapa pasien dari Google menurun, dan apa yang bisa dikembalikan</h2>
  <table>
    <tr><th>Ukuran digital</th><th class="num">28 hari terakhir</th><th class="num">90 hari</th></tr>
    <tr><td>Klik dari pencarian</td><td class="num">33</td><td class="num">104</td></tr>
    <tr><td>Tayangan di pencarian</td><td class="num">1.647</td><td class="num">6.103</td></tr>
    <tr><td>Posisi rata-rata</td><td class="num">6,4</td><td class="num">7,0</td></tr>
    <tr><td>Ulasan profil bisnis</td><td class="num">131</td><td class="num">—</td></tr>
  </table>
  <div class="kotak"><p style="margin:0">Kueri «dokter kulit krian» ada di posisi 1,2 tetapi hanya
  menghasilkan 1 klik. Kueri lokal seperti ini dijawab Google dengan peta, dan pasien menelepon dari
  kartu bisnis di peta itu. Karena itu menambah ulasan dan melengkapi profil bisnis lebih menentukan
  daripada menambah artikel.</p></div>
  <ul>
    <li>Klinik punya 131 ulasan (rating 5,0); Alamanda di ruko yang sama punya 858 ulasan.</li>
    <li>Situs muncul {1765:,} kali per bulan di pencarian; menaikkan tingkat klik dari 2% ke 6%
        berarti tambahan sekitar 71 kunjungan per bulan — tanpa satu artikel baru pun.</li>
    <li>Empat halaman belum diindeks Google, termasuk panduan berobat dan biaya.</li>
  </ul>
  <div class="kaki">Halaman 6 · Sumber: Search Console, GA4, dan peta Google</div>
</section>

<section class="slide">
  <h2>Kalau pekerjaan digital dijalankan</h2>
  <table>
    <tr><th>Langkah</th><th>Perkiraan tambahan pasien/bulan</th><th class="num">Nilai per bulan</th></tr>
    <tr><td>Ulasan profil bisnis (+30–50 per bulan)</td><td>3–5 pasien</td>
        <td class="num">Rp {3 * rata_per_pasien:,} – Rp {5 * rata_per_pasien:,}</td></tr>
    <tr><td>Profil bisnis lengkap + posting mingguan</td><td>1–3 pasien</td>
        <td class="num">Rp {rata_per_pasien:,} – Rp {3 * rata_per_pasien:,}</td></tr>
    <tr><td>Pengindeksan halaman yang belum terbaca</td><td>1–2 pasien</td>
        <td class="num">Rp {rata_per_pasien:,} – Rp {2 * rata_per_pasien:,}</td></tr>
  </table>
  <div class="note">Kolom tambahan pasien adalah <strong>perkiraan berbasis kondisi peta dan pencarian
  klinik saat ini</strong>, bukan hasil ukur. Angka rupiahnya mengalikan taksiran itu dengan omset per
  pasien Rp {rata_per_pasien:,}.</div>
  <div class="kaki">Halaman 7 · Pengungkit digital dan nilainya</div>
</section>

<section class="slide">
  <h2>Ringkasan</h2>
  <table>
    <tr><th>Skenario</th><th class="num">Omset Oktober–Desember</th><th class="num">Rata-rata per bulan</th></tr>
"""

for nama, seri, dasar in skenario:
    html += (f"    <tr><td>{nama}</td><td class='num'>Rp {sum(seri):,}</td>"
             f"<td class='num'>Rp {round(mean(seri)):,}</td></tr>\n".replace(",", "."))

html += f"""  </table>
  <div class="kotak"><p style="margin:0"><strong>Kesimpulan:</strong> tanpa perubahan apa pun, omset
  Oktober–Desember berada di kisaran <strong>Rp {sum(datar):,}</strong>. Penurunan sejak Juni berjalan
  seiring turunnya pasien dari Google (32 → 12 per bulan) dan Instagram (6 → 1). Karena obat menyumbang
  sekitar {round(mean(OBAT) / mean(OMSET) * 100)}% omset dan pasien kontrol berulang, menjaga kedatangan
  pasien baru adalah kunci menjaga angka ini.</p></div>
  <h3>Yang perlu diputuskan</h3>
  <ul>
    <li>Menjalankan pengejaran ulasan (30–50 per bulan) — pengungkit terbesar, butuh staf klinik.</li>
    <li>Menyetujui atau mengubah asumsi {tambahan_pasien} pasien tambahan per bulan pada skenario terbaik.</li>
    <li>Memasang pencatatan klik WhatsApp dan telepon, supaya proyeksi berikutnya berbasis hasil ukur.</li>
    <li>Memutuskan apakah irama artikel harian dilanjut setelah 20 Oktober.</li>
  </ul>
  <div class="kaki">Halaman 8 · Ringkasan dan keputusan</div>
</section>

</body></html>
"""

open(OUT, "w").write(html)
print(f"HTML: {OUT}")
print(f"rata-rata Juli-Sep: Rp {rata3_omset:,} · pasien {round(rata3_pasien)} · per pasien Rp {rata_per_pasien:,}")
print(f"tren omset per bulan: {tren_omset:,} · tren pasien baru: {tren_baru}")
for nama, seri, _ in skenario:
    print(f"  {nama:<34} {[f'{x:,}' for x in seri]} total {sum(seri):,}")
