================================================================
PAKET TIMPA — Digitalisasi_3_3  v616
Gudang Klawas & Gudang Exbkpl
(kumulatif: memuat v549, v551, dan v552 s/d v616)
Disusun: 16 September 2026
================================================================

INI PAKET TIMPA, BUKAN FOLDER PENGGANTI.

Extract di atas folder yang sudah ada. Yang diganti HANYA berkas
yang memang berubah; sisanya dibiarkan utuh. Foto Anda aman —
berapa pun banyaknya, dan tidak peduli kapan diunggahnya.

YANG SENGAJA TIDAK ADA DI PAKET INI:

   ✗ backend/uploads/*.jpg      tidak ada satu pun foto di sini.
                                Yang ikut hanya struktur foldernya
                                (kosong), supaya folder gudang baru
                                terbentuk. Foto di server tidak
                                tersentuh sama sekali.

   ✗ backend/.env               setelan server TIDAK ditimpa.
                                Kalau Anda pernah mengubahnya
                                langsung di server, perubahan itu
                                tetap utuh.

   ✗ node_modules               package.json TIDAK berubah di
                                update ini (sudah saya bandingkan),
                                jadi 139 paket di server tetap
                                cukup. Tidak perlu npm install.

YANG ADA:

   ✔ Kode v616 lengkap    35 route, 8 utils, 39 halaman
   ✔ frontend/dist        SUDAH DIBUILD — tidak perlu npm run build


================================================================
LANGKAH PASANG — 3 LANGKAH
================================================================

1. BACKUP (10 detik, jangan dilewat)
      cd /path/ke/folder/induk
      cp -r Digitalisasi_3_3  Digitalisasi_3_3_backup_$(date +%F)

2. TIMPA
      unzip -o Digitalisasi_3_3_TIMPA_v616.zip -d /path/ke/folder/induk

   Flag -o = timpa tanpa bertanya.

   Lewat cPanel File Manager: upload ZIP ini ke folder INDUK
   (folder yang MEMUAT Digitalisasi_3_3), klik kanan → Extract.

   >>> JANGAN pilih opsi yang menghapus folder tujuan. Kalau
       muncul dialog di FileZilla/WinSCP, pilih OVERWRITE. <<<

3. RESTART BACKEND
      cd Digitalisasi_3_3/backend
      pm2 restart all

   PERIKSA LOG — dua baris ini HARUS muncul:
      [gudang] Gudang Klawas siap di /api/soh-gudang-klawas
               (tabel soh_gudang_klawas)
      [gudang] Gudang Exbkpl siap di /api/soh-gudang-exbkpl
               (tabel soh_gudang_exbkpl)

   Lalu buka aplikasi, tekan Ctrl+Shift+R.

   CEK:  http://50.6.7.38:3020/api/health
   harus muncul:  {"success":true, ... "db":"terhubung"}

SELESAI. Tidak ada perintah salin foto, tidak ada rename folder.


================================================================
UJI SESUDAH PASANG — LANGKAH (e) YANG PALING PENTING
================================================================

  a. Suku Cadang — sekarang ada EMPAT tab gudang.
  b. Gudang Klawas › Stok (SOH): kosong. Itu benar, tabelnya baru.
  c. Barang Masuk di Klawas: tambahkan satu part. Stoknya muncul di
     SOH Klawas, dan TIDAK muncul di SOH gudang lain.
  d. Barang Keluar dari Klawas: part tadi harus muncul di daftar
     saran, kolom Sisa terisi, stok berkurang setelah simpan.
  e. >>> PERIKSA SOH MSF 1 DAN MSF 2. Keduanya TIDAK BOLEH BERUBAH
     SAMA SEKALI oleh langkah (c) dan (d). <<<

  Kenapa (e) paling penting: sebelum v616, "gudang" berupa
  percabangan dua arah di 282 tempat —
        kode === 'MSF1' ? 'soh_gudang_msf_1' : 'soh_gudang_msf'
  Bentuk itu bekerja selama gudangnya tepat dua. Kalau ada SATU
  percabangan yang terlewat, gudang baru akan diam-diam
  diperlakukan sebagai MSF 2 — dan stok MSF 2 ikut berubah tanpa
  ada yang menyadarinya. Kalau itu terjadi, hentikan dan laporkan.


================================================================
HAK AKSES — DUA BARIS BARU
================================================================

Master Data › Hak Akses Menu kini punya:
      🏭 Gudang Klawas
      🏭 Gudang Exbkpl

Hak bawaannya DISAMAKAN dengan MSF 1/MSF 2, jadi orang yang sudah
boleh membuka gudang lama tidak perlu diatur ulang satu per satu.


================================================================
SUDAH DIUJI DI SINI — PENIMPAANNYA DISIMULASIKAN BETULAN
================================================================

Saya tidak hanya membuat ZIP-nya. Saya salin folder server Anda,
menimpanya dengan paket ini, lalu menjalankannya.

SEBELUM ditimpa:
    foto uploads  66        node_modules  139 paket
    .env DB_HOST  localhost route          31 berkas

SESUDAH ditimpa:
    foto uploads  66  ← UTUH, tidak satu pun hilang
    node_modules  139 ← utuh
    .env DB_HOST  localhost ← utuh, tidak tertimpa
    route         35  ← bertambah 4 (termasuk usulanpart.js)
    utils          8  ← bertambah 3 (gudang, sohFactory, collation)

LALU DIJALANKAN, memakai node_modules 139 paket milik server:
  ✔ tidak ada "Cannot find module"
  ✔ DUA BARIS [gudang] muncul dengan nama tabel yang benar
  ✔ SPA tersaji memakai build baru (assets/index-jIeF2HLg.js)
  ✔ foto lama tetap terbaca:
    /uploads/bd/bd_1786752783092_h8t3x.jpeg → 200, 227.886 byte
  ✔ /api/soh-gudang-klawas dan /api/soh-gudang-exbkpl TERDAFTAR

Selain itu:
  ✔ `node --check` lolos untuk SELURUH berkas .js backend
  ✔ `vite build` berhasil — dist 81 berkas, index.html menunjuk
    assets/index-jIeF2HLg.js
  ✔ package.json backend & frontend dibandingkan dengan milik
    server: TIDAK BERUBAH — itulah dasar keputusan tidak
    menyertakan node_modules
  ✔ Fitur update sebelumnya masih hidup: bypass-pengecekan (v549),
    cek-stok-nama (v551)


================================================================
BERSIH-BERSIH OPSIONAL
================================================================

"Timpa" tidak bisa menghapus. Tiga berkas sampah ini masih ada di
server dan tidak dipakai — hapus manual kalau mau rapi:

    rm Digitalisasi_3_3/backend/aichat.js
    rm Digitalisasi_3_3/backend/routes/pr.js.tmp
    rm Digitalisasi_3_3/frontend/src/views/TiketPerbaikan.vue.bak

Aset build lama di frontend/dist/assets juga menumpuk dan hanya
memakan tempat — index.html sudah menunjuk yang baru. Cara aman
membersihkan: hapus SELURUH isi frontend/dist, lalu extract ulang
paket ini.


================================================================
CATATAN TEKNIS
================================================================

1. frontend/.env.production masih:
        VITE_API_URL=http://50.6.7.38:3020/api
   Dipertahankan apa adanya. Kalau nanti pakai domain atau HTTPS,
   ganti jadi  /api  lalu build ulang.

2. Kunci hak akses gudang sekarang dibaca dari daftar di
   backend/utils/gudang.js, bukan percabangan if. Gudang yang
   namanya TIDAK ada di daftar mengembalikan kunci KOSONG — dan
   kosong berarti "tanpa pembatasan". Jadi kalau nanti menambah
   gudang kelima, mendaftarkannya di utils/gudang.js itu wajib;
   kalau terlewat, gudang itu terbuka untuk semua orang tanpa
   peringatan apa pun.

3. Paket ini tidak menyentuh soal keamanan (password plaintext,
   API tanpa autentikasi, CORS '*'). Pekerjaan terpisah.

4. Ikut disertakan untuk rujukan:
   BACA_DULU_v616.txt (changelog asli dari Anda)
   TABEL_IZIN_BYPASS_PENGECEKAN.sql (opsional, dari v549)
