Skip to content

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.

Audit: every routing of the project, grouped by project, state and date
Audit: every routing of the project, grouped by project, state and date · click to enlarge

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 ini

Sebuah 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

  1. Buka Document Routing, tab Audit. Hanya grup auditor; tab disembunyikan untuk yang lain.
  2. Pilih satu atau lebih baris routing yang closed, project dan originator yang sama.
  3. Klik Return (downloadrout). Ada hanya kalau enable_return_on_audit=1.
  4. 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:

js
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:

php
$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 disk

Lalu 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() memasukkan ts_correspondence dengan corrkind_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

TabelOperasiCatatan
ts_routingupdaterout_return_status='Y', rout_return_date=hari ini
ts_correspondenceinsertheader keluar (corrkind_id='2')
ts_file_explorer, ts_map_corr_fileinsertfile transmittal tersimpan plus tautan
ts_transmittal_datainsert / updatepenomoran (tahun / company / project / owner, out)
ts_company_transmittalselecttemplate 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.

InstancePerbedaan
JOTRETidak 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.
TimasSama 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

Di routing_browse.htm:

js
// 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

Di routing_handler_post.php:

php
} 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_query dengan $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

TabelOperasiCatatan
ts_routingupdaterout_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.

InstancePerbedaan
JOTREiw_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.