Audit
Audit mendaftar setiap routing terkirim project, siapa pun pengirimnya, dikelompokkan per project, status dan tanggal. Ditampilkan ke grup admin, Document Controller dan Procurement Controll.

Toolbar: View, Edit, Delete, Refresh, Search, Print, Download, Group Routing, Return, Clear Return Status.
Return
Ringkasan
Return menutup siklus sebuah dokumen yang sudah direview: seorang auditor membuat paket Transmittal Out (TSO) keluar dan menandai routing sebagai returned. Semantik bisnisnya sama seperti yang selalu dimiliki INACT (peran auditor yang sama, penulisan status yang sama, catatan correspondence yang sama, validasi yang sama). v3 membangun ulang mesin pembuatnya sebagai class OOP Transmittal yang merender lewat HTML2PDF, menambahkan gerbang config, dan memodernisasi alur unduh.
Prasyarat dan posisinya
Upload → routing dibuat → reviewer bertindak → routing CLOSED
↓
Return (ini) → membuat TSO + mengeset ts_routing.rout_return_status='Y', rout_return_date=hari iniSebuah routing bisa di-return kalau rout_status-nya closed, belum di-return (rout_return_status != 'Y'), dan pilihannya berbagi satu project dan satu originator. Dan enable_return_on_audit harus '1' supaya tombolnya muncul sama sekali.
Alur pengguna
- Buka Document Routing, tab Audit. Hanya grup auditor; tab disembunyikan untuk yang lain.
- Pilih satu atau lebih baris routing yang closed, project dan originator yang sama.
- Klik Return (
downloadrout). Ada hanya kalauenable_return_on_audit=1. - Sistem memvalidasi, memesan nomor transmittal, membangun TSO, menandai routing returned, dan mengalirkan paketnya ke browser.
Cara kerjanya
Gating dan tombol
Tab Audit hanya ditampilkan untuk admin, Document Controller dan Procurement Controll (routing_header.inc.php). Ketiga nama yang sama muncul di kelima fork. Tombol Return dibuat hanya kalau flag menyala, di routing_browse.htm:
if("{enable_return_on_audit}" === "1") {
procBarAudit.addButton('downloadrout', 9,"Return","download.svg");
}JOTRE dan Timas tidak punya tombol Return sama sekali
Di kedua fork itu baris downloadrout dikomentari di toolbar Audit, toolbar Outbox dan menu overflow, dan key enable_return_on_audit tidak ada. Handler AJAX-nya masih ada di kode, jadi fitur ini hanya bisa dijangkau lewat request langsung.
Front-end
Downloadrout() di js/routing.js meminta konfirmasi, lalu memanggil ajax=transmittaloutgoingdownload&ids=<mapids> dan mengunduh setiap arsip yang dikembalikan di sisi klien lewat blob dan XMLHttpRequest. Ini mendukung return batch, beberapa arsip dalam satu aksi.
Back-end
routing_handler_ajax.php mengarahkan transmittaloutgoingdownload ke generateTransmittalOutSantos($ids) di routing.inc.php, yang memakai class Transmittal:
$t = new Transmittal("return", $html2pdf);
$t->setRoutId($routids);
$t->setBatchRouting(true, $routids);
$t->saveReturnAuditTransmittalNumber(); // pesan nomor di ts_transmittal_data
$t->generateTransmittal(); // bangun PDF lewat HTML2PDF
$t->storeFile(); // tulis ke diskLalu inti menulis:
- Tandai returned:
UPDATE ts_routing SET rout_return_date=<now>, rout_return_status='Y' WHERE rout_id IN (...), lewat$pdo->prepare()->execute(). - Correspondence keluar:
handleProcessTransmittalCorrespondence()memasukkants_correspondencedengancorrkind_id='2'dan menautkan filenya.
Penomoran
saveReturnAuditTransmittalNumber() memesan nomor berikutnya di ts_transmittal_data, dikunci oleh tahun, company, trans_type='out', project dan owner. Skema yang lebih rinci daripada increment sederhana v2.
Mesin pembuat: HTML2PDF, dengan jalur Excel legacy masih ada
Jalur Return yang aktif merender transmittal sebagai HTML ke PDF lewat HTML2PDF di dalam class Transmittal (routing_handler_transmittal.class.php, writeHTML() / Output()). generateTransmittalOutSantos() memanggil new Transmittal di kelima fork.
Hibrida, bukan penggantian bersih
Mekanisme Excel per company yang legacy masih ada di kode: writeExcelSantosTransmittalOut() dan pencarian ts_company_transmittal / comp_file_name (docUpload/routing/) tetap ada di routing.inc.php di setiap fork. Pastikan jalur mana yang dipakai build kamu sebelum berasumsi template Excel tidak dipakai. Keduanya ada.
Tabel database yang terpengaruh
| Tabel | Operasi | Catatan |
|---|---|---|
ts_routing | update | rout_return_status='Y', rout_return_date=hari ini |
ts_correspondence | insert | header keluar (corrkind_id='2') |
ts_file_explorer, ts_map_corr_file | insert | file transmittal tersimpan plus tautan |
ts_transmittal_data | insert / update | penomoran (tahun / company / project / owner, out) |
ts_company_transmittal | select | template per company, jalur legacy, kalau dipakai |
Validasi dan penanganan error
Pemeriksaan dan pesan di routing.inc.php: "You cannot return open document(s)", "Document(s) already returned", "You cannot return document(s) with different contractor/originator", dan penjaga beda-project.
Tab "Ready to Return"
Master, Jadestone dan Medco punya tab di sebelah Audit yang didukung routing_handler_ready_to_return.php, mendaftar rout_status='close' AND rout_return_status='N'. JOTRE dan Timas tidak punya filenya.
Perbedaan antar instance (Return)
Diperiksa pada 2026-09-06.
| Instance | Perbedaan |
|---|---|
| JOTRE | Tidak ada tombol Return: downloadrout dikomentari di semua tempat di routing_browse.htm. Tidak ada key enable_return_on_audit. Tidak ada tab Ready to Return. |
| Timas | Sama dengan JOTRE. |
Master, Jadestone dan Medco sama dalam gerbang, tombol, peran auditor, class Transmittal dan tab Ready to Return.
Clear Return Status
Tidak aktif. Tombol toolbar-nya dikomentari.
Fitur ini tidak bisa dijangkau dari UI di semua big five. Handler-nya yang masih rusak tetap ada di kode. Di master, Jadestone, Medco dan Timas ia akan fatal kalau act=clearreturn di-POST langsung, karena memanggil iw_mysql_query() yang sudah dinonaktifkan. Di JOTRE helper itu masih bekerja, jadi di sana handler-nya benar-benar berjalan, dengan bug di bawah. Diperiksa 2026-09-06.
Ringkasan
Di v2, Clear Return Status adalah tombol tab Audit yang aktif dengan bug penamaan yang terkenal: meski bernama "Clear", ia mengeset rout_return_status='Y' (tandai returned) alih-alih menghapusnya. Dokumen v2 menandainya untuk diperbaiki di v3.
Yang sebenarnya terjadi di v3: perbaikannya tidak masuk. Sebagai gantinya, tombolnya dikomentari. Fitur hilang dari UI, tetapi handler yang rusak tidak berubah.
Arti field-nya
rout_return_status di ts_routing: 'Y' = dikembalikan ke originator, 'N' = belum dikembalikan. 'N' hanya ditulis oleh jalur approve dan sign-off internal, tidak pernah oleh tombol yang dihadapkan ke pengguna.
Keadaan tombol saat ini
// procBarAudit.addButton('aud_clear', 10,"Clear Return Status","bar_channel_trace_all.svg");Barisnya dikomentari, begitu juga entri menu overflow di bawahnya. Tombol tidak pernah dibuat, jadi tidak ada jalur UI untuk memanggil act=clearreturn. Ini sama di kelima fork.
Handler-nya, tidak berubah dan masih rusak
} elseif ($_POST["act"] == "clearreturn") {
if ($_LOGIN_GROUP_ID != "admin" && !havePrivilegesResource($_LOGIN_GROUP_RESOURCE, $mod_code, 'edit')) {
echo "denied"; exit;
}
$sumId = explode(",", $_POST['id']);
for ($k = 0; $k < count($sumId); $k++) {
if (iw_mysql_query("update ts_routing set rout_return_status='Y' where rout_id='$sumId[$k]'", "...")) {
echo "Row Updated.";
} else {
echo "Error clear return status.";
}
}
// br_logs($_LOGIN_ID,'clear',$qry);
exit;
}Setiap cacat v2 masih ada di sini:
- Masih mengeset
'Y', bukan'N', perilaku terbalik yang sama yang dijanjikan namanya untuk diperbaiki. - Masih tidak mengeset
rout_return_date. Baris yang "di-clear" menampilkan Returned = Yes dengan tanggal return kosong. - Log audit masih dikomentari (
// br_logs(...)). - Masih
iw_mysql_querydengan$sumId[$k]yang tidak di-escape: rawan SQL injection, dan memakai API legacy bukan$pdo. Di empat dari lima fork API legacy itu melempar exception, dan itu satu-satunya alasan handler ini tidak bisa merusak di sana.
Satu-satunya perubahan v3 pada handler itu sendiri adalah pemeriksaan privilege: v2 memakai havePrivileges($_LOGIN_GROUP_ID, ...); v3 memakai havePrivilegesResource($_LOGIN_GROUP_RESOURCE, ...) berbasis resource dengan bypass admin. Model otorisasi baru, diterapkan di sini tanpa memperbaiki bug intinya.
Tabel database yang terpengaruh
| Tabel | Operasi | Catatan |
|---|---|---|
ts_routing | update | rout_return_status='Y' per rout_id. Tidak mengeset rout_return_date. |
Yang dibutuhkan perbaikan sungguhan
Tulis 'N' dan kosongkan tanggalnya, atau ganti nama aksinya menjadi "Mark as Returned" dan set tanggalnya. Pulihkan logging. Escape inputnya atau pindah ke $pdo. Sampai saat itu, biarkan tombolnya tetap dikomentari.
Perbedaan antar instance (Clear Return Status)
Diperiksa pada 2026-09-06.
| Instance | Perbedaan |
|---|---|
| JOTRE | iw_mysql_query() masih aktif, jadi POST act=clearreturn langsung berjalan dan mengeset 'Y' tanpa tanggal. Di tempat lain POST yang sama fatal begitu masuk. |
Keadaan tombol dan teks handler identik di kelima fork.
Related
- Document Routing: ikhtisar.
- Action Indicated: kode action routing.