#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Perbaikan #2908 TSLaw 19 Okt 2026: 618 -> 1.000+ kata, koreksi fakta SIUP/TDP (sudah tidak berlaku),
rapikan <p><p> bersarang, FAQ 5 -> 7 + skema, tautan pilar. Default dry run; --apply untuk menulis via REST."""
import base64, json, re, sys, unicodedata, urllib.request

DIR = "/home/mantapman/.hermes/profiles/atun/workspace/tslaw_pemulihan/perbaikan_20261019"
DOM = "tslaw.id"
AUTH = base64.b64encode(b"bambangbot:EFKm EYGx VQCP Y9go ncPr uM2Y").decode()
PID = 2908

lama = open(f"{DIR}/post_{PID}_SEBELUM.html").read()
lama_json = json.load(open(f"{DIR}/post_{PID}_SEBELUM.json"))

# ---------- blok lama yang dipakai ulang apa adanya ----------
INTRO = ("Setiap pelaku usaha di Indonesia wajib memiliki dokumen hukum untuk menjalankan bisnis secara legal. "
         "Banyak pengusaha pemula yang belum memahami dokumen apa saja yang harus disiapkan. Akibatnya, mereka "
         "sering menghadapi masalah hukum. Oleh karena itu, memahami dokumen hukum adalah langkah awal yang penting. "
         "TSLaw siap membantu Anda mengurus dokumen hukum bisnis dengan profesional.")

AKTA_P = ("Akta pendirian adalah dokumen fundamental yang membuktikan eksistensi hukum perusahaan. Dokumen ini "
          "dibuat oleh notaris dan disahkan oleh Kementerian Hukum dan HAM. Akta pendirian memuat anggaran dasar, "
          "susunan pengurus, dan tujuan perusahaan. Pasalnya, tanpa akta pendirian yang sah, perusahaan tidak "
          "diakui secara hukum.")

NIB_P = ("Nomor Induk Berusaha diterbitkan oleh sistem OSS RBA dan berlaku sebagai identitas pelaku usaha. NIB "
         "berfungsi sebagai TDP, API, dan akses kepabeanan sekaligus. Pengurusan NIB kini bisa dilakukan secara "
         "online melalui sistem OSS. Dengan memiliki NIB, usaha Anda terdaftar secara resmi di pemerintah Indonesia.")

NPWP_P = ("NPWP perusahaan diperlukan untuk kepentingan perpajakan bisnis. Setiap perusahaan wajib memiliki NPWP "
          "untuk membayar dan melaporkan pajak. Pelaporan pajak dilakukan setiap bulan dan tahunan. Dengan NPWP, "
          "perusahaan bisa mengkreditkan pajak masukan.")

LINDUNG1 = ("Pelaku usaha sering baru menyadari pentingnya dokumen saat menghadapi masalah. Padahal dokumen yang "
            "rapi mencegah masalah itu muncul. Setidaknya ada lima dokumen dasar yang perlu dipastikan keberadaannya.")
LINDUNG2 = ("Dokumen pertama adalah legalitas badan usaha berupa akta pendirian dan izin usaha. Kedua, dokumen "
            "perpajakan seperti NPWP badan dan status kewajiban pajak. Ketiga, perjanjian pokok dengan pemasok, "
            "mitra, atau klien.")
KONTRAK1 = ("Kelompok dokumen keempat berkaitan dengan kontrak bisnis. Setiap transaksi berulang sebaiknya punya "
            "perjanjian tertulis yang mengatur lingkup pekerjaan, pembayaran, dan penyelesaian sengketa. Tanpa itu, "
            "hubungan usaha bergantung pada kesepahaman lisan yang sulit dibuktikan.")
KONTRAK2 = ("Kelima, dokumen ketenagakerjaan bila memiliki karyawan: perjanjian kerja, ketentuan upah, dan aturan "
            "internal. Kelengkapan dokumen-dokumen ini sering menentukan hasil bila terjadi pemeriksaan atau sengketa.")
RAWAT1 = ("Memiliki dokumen saja belum cukup. Dokumen perlu diperbarui seiring perubahan usaha: penambahan izin, "
          "perubahan alamat, pergantian pengurus. Sistem penyimpanan yang rapi memudahkan pencarian saat dibutuhkan cepat.")
RAWAT2 = ("Lakukan peninjauan berkala, misalnya setiap enam bulan, untuk memastikan semua dokumen masih berlaku dan "
          "sesuai kondisi usaha saat ini.")
KESIMPULAN = ("Dokumen hukum yang lengkap melindungi bisnis Anda dari berbagai risiko hukum. Mulai dari akta pendirian "
              "hingga NPWP, setiap dokumen memiliki fungsi penting. TSLaw siap membantu Anda mengurus seluruh dokumen "
              "hukum bisnis dengan cepat dan profesional.")

FAQ_LAMA = [
    ("Apa dokumen hukum paling dasar untuk usaha?",
     "Akta pendirian, izin usaha, NPWP badan, perjanjian dengan mitra, dan dokumen ketenagakerjaan bila punya karyawan."),
    ("Seberapa sering perlu diperbarui?",
     "Setiap ada perubahan signifikan, dengan peninjauan menyeluruh minimal setiap enam bulan."),
    ("Apakah usaha kecil perlu semua dokumen ini?",
     "Skalanya bisa disesuaikan, tapi legalitas dan perjanjian pokok tetap perlu ada."),
    ("Apa risiko bila dokumen tidak lengkap?",
     "Terhambat mengikuti tender, kesulitan pembiayaan, dan lemah bila terjadi sengketa."),
    ("Apakah dokumen boleh disimpan digital?",
     "Boleh, sekaligus simpan salinan cetak untuk dokumen yang sering diminta secara fisik."),
]
FAQ_BARU = [
    ("Apakah SIUP dan TDP masih diperlukan?",
     "Tidak. SIUP dan TDP sudah tidak diterbitkan lagi. NIB berlaku sebagai TDP, dan ketentuan SIUP dicabut melalui "
     "Permendag 26/2025."),
    ("Apa dasar hukum perizinan berusaha yang berlaku sekarang?",
     "PP 28/2025 tentang Penyelenggaraan Perizinan Berusaha Berbasis Risiko, berlaku sejak 5 Juni 2025 dan mencabut "
     "PP 5/2021."),
]

BARU = {
    "intro2": ("Versi 2026 sedikit berbeda dari panduan lama. Dua dokumen yang dulu wajib, yaitu SIUP dan TDP, sudah "
               "tidak diterbitkan lagi. Artikel ini memisahkan dokumen yang benar-benar harus Anda pegang dari dokumen "
               "yang hanya tinggal nama di formulir lama."),
    "akta2": ("Dasar hukumnya ada pada UU 40/2007 tentang Perseroan Terbatas. Pasal 7 ayat (1) menyebut perseroan "
              "didirikan oleh dua orang atau lebih dengan akta notaris yang dibuat dalam bahasa Indonesia. Status badan "
              "hukum baru lahir pada tanggal diterbitkannya keputusan Menteri mengenai pengesahan badan hukum, sesuai "
              "Pasal 7 ayat (4), dan permohonan pengesahan itu diajukan lewat sistem administrasi badan hukum elektronik "
              "menurut Pasal 9 ayat (1)."),
    "akta3": ("Untuk usaha mikro dan kecil, pilihannya tidak harus PT biasa. Perseroan perorangan diperkenalkan melalui "
              "Pasal 153A UU Cipta Kerja, yang kini menjadi UU 6/2023, dan bisa didirikan oleh satu orang. Direktorat "
              "Jenderal Pajak mencatat perseroan perorangan mulai diluncurkan AHU Kementerian Hukum dan HAM pada Oktober "
              "2021 bagi pelaku usaha mikro dan kecil."),
    "nib2": ("Aturan yang berlaku hari ini adalah PP 28/2025 tentang Penyelenggaraan Perizinan Berusaha Berbasis Risiko. "
             "Peraturan ini berlaku sejak 5 Juni 2025 dan mencabut PP 5/2021. Pasal 124 ayat (1) menegaskan bahwa "
             "perizinan berusaha ditentukan oleh tingkat risiko dan peringkat skala usaha, bukan oleh daftar izin yang "
             "sama untuk semua bidang."),
    "nib3": ("Bentuk perizinan mengikuti tingkat risikonya:"),
    "nibli": [
        "Risiko rendah: cukup NIB, yang sekaligus menjadi identitas dan legalitas pelaksanaan kegiatan usaha.",
        "Risiko menengah rendah dan menengah tinggi: NIB ditambah sertifikat standar, yang pada tingkat menengah tinggi "
        "harus terverifikasi lebih dulu.",
        "Risiko tinggi: NIB ditambah izin sektor yang diterbitkan instansi berwenang.",
    ],
    "siuptdp1": ("SIUP dahulu membedakan pedagang besar, menengah, dan kecil, serta diterbitkan Dinas Perindustrian dan "
                 "Perdagangan setempat. Ketentuan SIUP berasal dari Permendag 36/2007 dan perubahannya, yang kini dicabut "
                 "oleh Permendag 26/2025. Karena itu SIUP sudah tidak berlaku, dan tidak ada lagi permohonan SIUP baru "
                 "yang bisa diajukan."),
    "siuptdp2": ("Tanda Daftar Perusahaan atau TDP dahulu menjadi bukti bahwa perusahaan telah terdaftar di pemerintah, "
                 "dengan perpanjangan setiap lima tahun. Sejak OSS berbasis risiko, TDP tidak lagi diterbitkan tersendiri "
                 "karena NIB berlaku sebagai TDP, sekaligus sebagai Angka Pengenal Impor dan akses kepabeanan."),
    "siuptdp3": ("Praktiknya, bank, vendor, atau panitia tender kadang masih meminta salinan SIUP dan TDP karena "
                 "memakai daftar persyaratan lama. Yang bisa Anda lampirkan adalah NIB beserta penjelasan singkat bahwa "
                 "kedua dokumen tersebut sudah digantikan. Jika formulirnya tidak bisa diubah, minta konfirmasi tertulis "
                 "dari peminta dokumen agar berkas Anda tidak tertahan."),
    "npwp2": ("Format NPWP juga berubah. Sejak 14 Juli 2022, NPWP memakai 16 digit, dan untuk badan usaha bentuknya "
              "penambahan angka 0 di depan NPWP 15 digit yang sudah terdaftar. Kebutuhan pajak cabang tidak lagi memakai "
              "NPWP tersendiri, melainkan Nomor Identitas Tempat Kegiatan Usaha atau NITKU yang diberikan otomatis oleh "
              "Direktorat Jenderal Pajak."),
    "sektoral1": ("NIB bukan izin tunggal untuk semua kegiatan. Begitu tingkat risiko usaha masuk kategori menengah atau "
                  "tinggi, izin sektoral tetap harus diurus di instansi masing-masing. Untuk produk makanan dan minuman, "
                  "izin edar BPOM atau PIRT menjadi pintu masuk produk ke pasar, sedangkan sertifikat halal diurus melalui "
                  "BPJPH. Kegiatan yang berdampak pada lingkungan juga menuntut dokumen lingkungan tersendiri."),
    "sektoral2": ("Kesalahan yang sering terjadi adalah menganggap NIB sudah cukup karena pendaftaran di OSS selesai. "
                  "Padahal NIB hanya mencatat kegiatan usaha yang Anda pilih. Bila KBLI yang dicantumkan tidak sesuai "
                  "kegiatan yang benar-benar dijalankan, izin sektor yang dibutuhkan tidak akan muncul di sistem."),
    "salah1": ("Dokumen yang ada di atas kertas tetapi tidak cocok dengan kenyataan justru menimbulkan masalah baru. "
               "Beberapa temuan yang paling sering muncul saat pemeriksaan:"),
    "salahli": [
        "Akta pendirian tidak diperbarui setelah pergantian pengurus, perubahan alamat, atau perubahan modal.",
        "NIB mencantumkan KBLI yang tidak sesuai kegiatan utama, sehingga izin sektor tidak terbit.",
        "Perjanjian dengan mitra hanya lisan, tanpa lingkup pekerjaan dan cara pembayaran yang jelas.",
        "Dokumen karyawan tidak lengkap, misalnya perjanjian kerja tidak dibuat untuk sebagian pekerja.",
        "Tidak ada salinan digital, sehingga dokumen hilang saat pindah kantor atau berganti admin.",
    ],
    "advokat1": ("Pemeriksaan dokumen jauh lebih murah daripada memperbaiki akibat dokumen yang keliru. Titik paling rawan "
                 "ada tiga: saat mendirikan badan usaha, saat menandatangani kontrak bernilai besar, dan saat menerima "
                 "surat dari instansi atau rekan bisnis yang menyebut sanksi."),
    "advokat2": ("Bila urusannya sudah masuk sengketa, pemeriksaan, atau tender yang mempersoalkan legalitas, tim "
                 "<a href=\"https://www.tslaw.id/law-firm-surabaya/\">law firm Surabaya TSLaw</a> dapat memeriksa "
                 "kelengkapan dokumen dan menyusun langkah berikutnya. Untuk pertanyaan awal, konsultasi bisa dimulai "
                 "lewat tombol WhatsApp di bawah."),
}

PARAGRAF = []
PARAGRAF.append(f"<p>{INTRO}</p>")
PARAGRAF.append(f"<p>{BARU['intro2']}</p>")

PARAGRAF.append('<h2 class="wp-block-heading">Akta Pendirian Perusahaan</h2>')
PARAGRAF.append(f"<p>{AKTA_P}</p>")
PARAGRAF.append(f"<p>{BARU['akta2']}</p>")
PARAGRAF.append(f"<p>{BARU['akta3']}</p>")

PARAGRAF.append('<h2 class="wp-block-heading">Nomor Induk Berusaha (NIB)</h2>')
PARAGRAF.append(f"<p>{NIB_P}</p>")
PARAGRAF.append(f"<p>{BARU['nib2']}</p>")
PARAGRAF.append(f"<p>{BARU['nib3']}</p>")
PARAGRAF.append("<ul>\n" + "\n".join(f"<li>{x}</li>" for x in BARU["nibli"]) + "\n</ul>")

PARAGRAF.append('<h2 class="wp-block-heading">Status SIUP dan TDP Setelah OSS Berbasis Risiko</h2>')
PARAGRAF.append(f"<p>{BARU['siuptdp1']}</p>")
PARAGRAF.append(f"<p>{BARU['siuptdp2']}</p>")
PARAGRAF.append(f"<p>{BARU['siuptdp3']}</p>")

PARAGRAF.append('<h2 class="wp-block-heading">NPWP Perusahaan</h2>')
PARAGRAF.append(f"<p>{NPWP_P}</p>")
PARAGRAF.append(f"<p>{BARU['npwp2']}</p>")

PARAGRAF.append('<h2 class="wp-block-heading">Izin dan Sertifikat Sektoral</h2>')
PARAGRAF.append(f"<p>{BARU['sektoral1']}</p>")
PARAGRAF.append(f"<p>{BARU['sektoral2']}</p>")

PARAGRAF.append('<h2>Cek Cepat: Lima Dokumen yang Wajib Ada</h2>')
PARAGRAF.append(f"<p>{LINDUNG1}</p>")
PARAGRAF.append(f"<p>{LINDUNG2}</p>")

PARAGRAF.append('<h2>Dokumen Kontrak dan Ketenagakerjaan</h2>')
PARAGRAF.append(f"<p>{KONTRAK1}</p>")
PARAGRAF.append(f"<p>{KONTRAK2}</p>")

PARAGRAF.append('<h2>Merawat Dokumen Secara Rutin</h2>')
PARAGRAF.append(f"<p>{RAWAT1}</p>")
PARAGRAF.append(f"<p>{RAWAT2}</p>")

PARAGRAF.append('<h2 class="wp-block-heading">Kesalahan yang Paling Sering Terjadi</h2>')
PARAGRAF.append(f"<p>{BARU['salah1']}</p>")
PARAGRAF.append("<ul>\n" + "\n".join(f"<li>{x}</li>" for x in BARU["salahli"]) + "\n</ul>")

PARAGRAF.append('<h2 class="wp-block-heading">Kapan Sebaiknya Melibatkan Advokat</h2>')
PARAGRAF.append(f"<p>{BARU['advokat1']}</p>")
PARAGRAF.append(f"<p>{BARU['advokat2']}</p>")

PARAGRAF.append('<h2 class="wp-block-heading">Kesimpulan</h2>')
PARAGRAF.append(f"<p>{KESIMPULAN}</p>")

PARAGRAF.append('<div class="wp-block-buttons is-content-justification-center is-layout-flex '
                'wp-container-core-buttons-is-layout-a89b3969 wp-block-buttons-is-layout-flex">')
PARAGRAF.append('<div class="wp-block-button uagb-block-aa502741"><a class="wp-block-button__link wp-element-button" '
                'href="https://wa.me/6281909222026?text=Saya%20ingin%20tahu%20tentang%20TSLAW">KONSULTASI GRATIS</a></div>')
PARAGRAF.append('</div>')

FAQ = FAQ_LAMA + FAQ_BARU
PARAGRAF.append('<h2>Pertanyaan yang Sering Diajukan</h2>')
for q, a in FAQ:
    PARAGRAF.append(f"<h3>{q}</h3>")
    PARAGRAF.append(f"<p>{a}</p>")

skema = {"@context": "https://schema.org", "@type": "FAQPage",
         "mainEntity": [{"@type": "Question", "name": q,
                         "acceptedAnswer": {"@type": "Answer", "text": a}} for q, a in FAQ]}
PARAGRAF.append('<script type="application/ld+json">' + json.dumps(skema, ensure_ascii=False) + '</script>')

PARAGRAF.append('<h2>Baca juga</h2>')
PARAGRAF.append('<p>Kalau topiknya berhubungan dengan kebutuhan Anda, artikel berikut membahasnya lebih dalam: '
                '<a href="https://www.tslaw.id/panduan-pendirian-pt-untuk-pelaku-usaha/">Panduan Pendirian PT untuk '
                'Pelaku Usaha</a>, <a href="https://www.tslaw.id/8-langkah-legalitas-perusahaan-surabaya/">8 Langkah '
                'Legalitas Perusahaan di Surabaya</a>, <a href="https://www.tslaw.id/pentingnya-drafting-kontrak-bisnis-'
                'oleh-pengacara-profesional-surabaya/">Pentingnya Drafting Kontrak Bisnis oleh Pengacara Profesional</a>, '
                '<a href="https://www.tslaw.id/7-aspek-hukum-bisnis-yang-wajib-dipahami/">7 Aspek Hukum Bisnis yang Wajib '
                'Dipahami Pelaku Usaha</a>.</p>')

baru = "\n\n".join(PARAGRAF) + "\n"


def kata(html):
    t = re.sub(r"<(script|style)[^>]*>.*?</\1>", " ", html, flags=re.S | re.I)
    t = re.sub(r"<[^>]+>", " ", t)
    t = re.sub(r"&[a-z]+;", " ", t)
    return len(re.findall(r"[A-Za-z0-9][A-Za-z0-9'\-]*", t))


def kalimat(html):
    """Pisah per blok <p>/<li> dulu, baru per kalimat. Paragraf bersarang dirapikan lebih dulu,
    kalau tidak dua paragraf tergabung jadi satu blok panjang dan hasilnya positif palsu."""
    h = re.sub(r"<(script|style)[^>]*>.*?</\1>", " ", html, flags=re.S | re.I)
    h = h.replace("<p><p>", "<p>").replace("</p></p>", "</p>")
    out = []
    for m in re.finditer(r"<(p|li)\b[^>]*>(.*?)</\1>", h, flags=re.S | re.I):
        t = re.sub(r"<[^>]+>", " ", m.group(2))
        t = re.sub(r"&nbsp;", " ", t).replace("&amp;", "&")
        t = re.sub(r"\s+", " ", t).strip()
        out += [s.strip() for s in re.split(r"(?<=[.?!])\s+", t) if len(s.strip()) > 25]
    return out


# ---------- pemeriksaan ----------
print(f"kata lama={kata(lama)} baru={kata(baru)}")
assert kata(baru) >= 1000, "harus 1.000+ kata"

HILANG_DISENGAJA = [
    "Surat Izin Usaha Perdagangan diperlukan untuk perusahaan yang bergerak di bidang perdagangan.",
    "Dokumen ini diterbitkan oleh Dinas Perindustrian dan Perdagangan setempat.",
    "SIUP membedakan antara pedagang besar, menengah, dan kecil.",
    "Dengan SIUP, perusahaan bisa melakukan impor dan ekspor secara legal.",
    "Tanda Daftar Perusahaan atau TDP adalah bukti perusahaan telah terdaftar di pemerintah.",
    "TDP berlaku selama perusahaan masih menjalankan kegiatan usahanya.",
    "Perpanjangan TDP dilakukan setiap 5 tahun sekali.",
    "Dengan TDP, perusahaan diakui secara resmi oleh pemerintah daerah setempat.",
    "Kelengkapan ketiga dokumen ini sering menentukan hasil bila terjadi pemeriksaan atau sengketa.",
]
lama_s = kalimat(lama)
baru_s = kalimat(baru)
hilang = [s for s in lama_s
          if s not in baru_s and s not in HILANG_DISENGAJA
          and not s.startswith("Kalau topiknya berhubungan")]
print(f"kalimat lama={len(lama_s)} utuh={len(lama_s) - len(hilang) - len([s for s in lama_s if s in HILANG_DISENGAJA])}"
      f" diganti_disengaja={len([s for s in lama_s if s in HILANG_DISENGAJA])}")
if hilang:
    for s in hilang:
        print("  HILANG:", s[:120])
assert not hilang, "ada kalimat lama hilang di luar daftar koreksi"

assert "<p><p>" not in baru and "</p></p>" not in baru, "masih ada paragraf bersarang"
assert baru.count("wa.me/6281909222026") == 1, "tombol WA harus 1"
assert "law-firm-surabaya" in baru
for q, a in FAQ:
    assert q in baru and a[:60] in baru, f"FAQ tidak tampil: {q}"
assert baru.count('"@type": "Question"') == len(FAQ) == 7
for ch in "\u2014\u2013\u201c\u201d\u2018\u2019":
    assert ch not in baru, f"karakter terlarang {ch!r}"
assert not re.search(r"[\u3000-\u9fff\uff00-\uffef]", baru), "ada karakter CJK"
assert baru.count("<h2") == len(re.findall(r"<h2", baru))
print("H2:", baru.count("<h2"))
print("FAQ:", len(FAQ), "| skema item:", baru.count('"@type": "Question"'))
print("pilar:", baru.count("law-firm-surabaya"))

open(f"{DIR}/post_{PID}_SESUDAH_dryrun.html", "w").write(baru)
print("dry run ->", f"{DIR}/post_{PID}_SESUDAH_dryrun.html")

if "--apply" not in sys.argv:
    sys.exit(0)

open(f"{DIR}/post_{PID}_SESUDAH.html", "w").write(baru)
body = json.dumps({"content": baru}).encode()
req = urllib.request.Request(f"https://{DOM}/wp-json/wp/v2/posts/{PID}", data=body, method="POST",
                             headers={"Authorization": f"Basic {AUTH}", "Content-Type": "application/json",
                                      "User-Agent": "Mozilla/5.0"})
with urllib.request.urlopen(req, timeout=180) as x:
    resp = json.loads(x.read())
json.dump(resp, open(f"{DIR}/post_{PID}_POSTRESP.json", "w"), ensure_ascii=False, indent=1)
print("POST status:", x.status, "| kata di respons:", kata(resp["content"]["raw"]))
