STINV 2.10.241 — PATCH MIGRASI HISTORI PENJUALAN MODE 2 DENGAN STOK MINUS
Tanggal: 31 Oktober 2026
Tanpa perubahan versi / changelog

ISI PATCH (relatif terhadap root aplikasi):
- modules/periodic/engine.php
- includes/historical_migration_periodic.php
- includes/historical_migration_operational.php
- includes/migration_auto_valuation.php
- historical_migration_import.php

PERUBAHAN
1. Preview Import Penjualan Mode 2: kekurangan stok kronologis menjadi PERINGATAN jika setting allow_negative_stock=1; tetap fatal jika 0.
2. Validasi integritas qty, saldo ledger, stok vs lot, periode FINAL/Tutup Buku, cutover, snapshot safety backup dan approval tetap aktif.
3. HPP Periodic OPEN mengizinkan saldo negatif sementara, menyimpan baris valuasi per bulan, dan menampilkan nilai HPP provisional.
4. Pembelian di bulan sesudah stok minus dapat mengakui penyesuaian biaya HPP provisional sebagai cogs_adjustment; pembelian sumber tidak diubah.
5. Shadow stock ledger boleh negatif hanya bila fitur aktif dan pasangan qty/nilai konsisten; mutasi existing tidak di-replay dengan Moving Average.
6. Jika saldo akhir negatif, kekurangan bersih ditautkan pada movement penjualan baru sebagai negative_stock_lots, kompatibel dengan settlement native pada pembelian berikutnya.
7. Pengecekan Periodic untuk import dan rekalkulasi otomatis diperbolehkan pada OPEN yang provisional; validasi FINAL/Tutup Buku tetap menolak saldo negatif.

PENTING
- Gunakan PATCH hanya jika engine Periodic dan pve_* SUDAH terpasang dan aktif.
- Beri hak akses migrasi Penjualan Mode 2, dan aktifkan Pengaturan > Izinkan Stok Minus.
- Jalankan upgrade_negative_stock.php jika tabel negative_stock_lots/negative_stock_settlements belum tersedia.
- Sistem wajib membuat Safety Backup lengkap sebelum menulis batch migrasi.
- Jika sudah ada job/migrasi yang COMMIT, jangan lakukan import ulang. Gunakan monitor/retry valuasi.
- Nilai HPP pada bulan OPEN dengan stok minus BELUM FINAL; jangan memakai sebagai angka closing/GL final.
- Penjualan Mode 1 dan import histori pembelian tidak diubah oleh patch ini.
- Pembatalan batch Mode 2 dengan lot stok minus tidak didukung oleh jalur pembatalan lama; lakukan pemulihan dari Safety Backup yang tervalidasi atau tool rollback khusus setelah rekonsiliasi.
- Jika ada saldo kronologis atau valuasi tidak konsisten, sistem sengaja masih memblokir supaya tidak merusak data.
- Pengujian telah mencakup lint PHP dan kalkulasi PHP sintetis; belum dijalankan terhadap instalasi MySQL/XAMPP pengguna.

LANGKAH INSTALASI
1. Backup source dan database saat ini; buat duplikat DB untuk uji coba.
2. Extract PATCH ke ROOT aplikasi (D:\\xampp\\htdocs\\stinv\\), overwrite lima file di atas.
3. Jangan jalankan migration SQL atau installer ulang bila tabel native stok minus sudah ada.
4. Pastikan setting allow_negative_stock=1, inventory_cost_method=periodic_weighted_average, dan pve_active() benar.
5. Pada historical_migration_import.php?type=sales&mode=operational: upload Excel > Preview.
6. Baca warning produk stok minus; jika cocok, lanjut Import Final. Jangan lanjut bila ada fatal error integrity.
7. Audit historical_migration_batches, stock_movements, product_stocks, negative_stock_lots, pve_periods OPEN dan pve_movement_values.
8. Setelah pembelian pelunasan shortage, periksa pve_preflight sebelum FINAL/Tutup Buku.

PENGUJIAN NON-DESTRUKTIF DI LINGKUNGAN TEST
- Stok tersedia 2, migrasi jual 40: qty akhir -38, lot outstanding 38.
- Stok awal 0, migrasi jual 240: qty akhir -240, biaya provisional 0 hingga memperoleh basis biaya.
- Setelah pembelian berikutnya, qty kembali >=0; nilai HPP adjustment dicek tidak terhitung dua kali.
- Fitur stok minus OFF: preview ditolak seperti aturan lama.
- Bulan FINAL/closed: preview dan import tetap ditolak.
- Tutup Buku ketika ada qty minus / negative_stock_lots outstanding: tetap ditolak.
