Multiple Sign Off
Modul: Document Routing, Inbox. Sign off beberapa routing dengan satu jawaban, tanpa membuka satu per satu. Master mendapatkannya kembali lewat INA01-866; sebelum itu handler-nya memakai iw_mysql_query() yang sudah dimatikan, jadi setiap percobaan berakhir fatal error.
Cara halaman ini diverifikasi
Dibaca di master pada 2026-09-16 di commit e230a25be dan c63dd6658 (INA01-866), yang masih lokal dan belum ada di origin/main. Empat fork big five lainnya di-grep di origin/main masing-masing pada hari yang sama.
Satu jawaban, satu project, satu Action Indicated. Setiap routing yang dipilih lalu diproses sendiri-sendiri dan mengikuti aturan yang sama dengan Sign Off tunggal untuk peran itu. Routing yang tidak bisa di-sign off dilaporkan dengan namanya dan sisanya tetap jalan.
Alur pengguna
Di Inbox, centang beberapa baris dan klik Sign Off (
inb_multisignoff_act). Tombolnya butuh aksesedityang sama dengan action Inbox lain, atau groupadmin.Satu baris yang dicentang membuka jendela Sign Off tunggal biasa. Kalau tidak ada baris yang dicentang, grid meminta Anda memilih dulu.
Tiga guard berjalan sebelum popup, semuanya di sisi server:
Guard Pesan saat gagal Project sama ( cmd=checkSimilarProject)You cannot signoff document with different Project. Anda performer di setiap baris, atau author routing-nya ( cmd=checkRoutingForSignOff)You have no access. Action Indicated sama ( cmd=checkSimilarActionIndicated)You cannot signoff document with different action indicated. Popup Multiple Sign Off (<peran>) terbuka (
cmd=multisignoff). Ia menampilkan field peran itu plus kotak Comments bersama. Perannya dibaca dari baris yang dipilih di server, bukan dikirim browser.Jawab lalu klik tombolnya. Browser mem-POST
act=multiplesignoffdengan daftarmap_idyang dipilih.Toast hijau berarti semua routing ter-sign off. Kalau tidak, muncul daftar: tiap dokumen yang ditolak beserta alasannya, dengan judul seperti "3 document(s) signed off, 1 could not be".
Field per peran
Peran diambil dari ts_map_routing_to.rout_indicate. Field-nya sama dengan yang ditampilkan Sign Off tunggal.
| Peran | rout_indicate | Field di popup | Tombol |
|---|---|---|---|
| R Review | 8 | Comments / No Comments | Yes, sign off these documents |
| I Information | 5 | Comments / No Comments | Yes, sign off these documents |
| L Leader | 11 | Return Code | Yes, sign off these documents |
| C Checking | 15 | Return Code | Yes, sign off these documents |
| S Responsible | 16 | Return Code | Yes, sign off these documents |
| A Approval | 9 | Return Code, plus Next Expected Submission saat enable_next_issue_code = 1 dan field-nya memang terlihat untuk performer itu | Yes, sign off these documents |
| D Transmit | 12 | tidak ada | dua tombol, lihat di bawah |
| selain itu | — | tidak ada | "This Action Indicated has no sign off." |
- Daftar Return Code dibatasi per Action Indicated, filter yang sama dengan Sign Off tunggal: hanya kode yang
doc_res_organization-nya memuataction_descperformer. - Next Expected Submission mengikuti
isNextExpectedVisibleForSignoff(). Ia disembunyikan kalau ada performer terpilih yang berada di sisi non-owner project atau routing-nya procurement. Daftarnya berisi issued statusexternalmilik project.
D - Transmit dijawab dengan dua tombol
D - Transmit tidak punya dropdown. Ia mendapat dua jawaban yang sama dengan Sign Off tunggalnya:
| Tombol | Return Code yang dipakai |
|---|---|
| Yes - Proceed routing | kode approved pertama untuk Action Indicated itu, urut doc_res_sort |
| No - Return to Contractor DC | kode rejected pertama, urut doc_res_sort |
Sisi yang tidak punya kode cocok tidak mendapat tombol.
Return Code yang rejected
Return Code dengan doc_res_action = rejected berarti Return, persis seperti di Sign Off tunggal:
- baris performer mendapat
rout_status_resp = '3'(Return), bukan'4'; - routing ditutup dan setiap baris yang masih terbuka diset Closed Without Action (
closeRoutingWithSweep()), untuk A, untuk C / S, dan untuk performer di bagian Document Controller dari routing; - routing tidak diteruskan ke sequence berikutnya;
- D - Transmit tidak memublikasikan dokumen ke Document Library.
Reject oleh A, atau oleh C / S di luar bagian Document Controller, tetap diantrekan untuk cron, jadi dokumen _R dan Transmittal return tetap dibuat, sama seperti Return pada Sign Off tunggal. Reject oleh D, oleh L, dan oleh performer di bagian Document Controller tidak diantrekan.
Hasil sebagian
Setiap routing diperiksa sendiri, dan kegagalan dilaporkan alih-alih menghentikan batch:
| Alasan yang muncul | Penyebab |
|---|---|
| Sorry, you can't response. | Baris itu milik resource yang tidak Anda pegang |
| You have responded to this routing! | Sudah dijawab |
| This route have closed!. | Routing sudah tertutup |
| You cannot signoff document with different Project or action indicated. | Baris tidak cocok dengan baris pertama yang lolos |
| Procurement routings must be signed off one at a time. | Routing procurement punya alur sendiri |
| The selected Return Code is not available for <action>. | Kode di luar cakupan Action Indicated itu |
| Please select Comments or No Comments. / Please select Next Expected Submission. | Field wajib kosong |
| You didn't reroute this routing, so you can not sign off this one! | Baris di-reroute tetapi tidak punya baris anak |
| Sign off failed. Please try again or sign off this document on its own. | Exception; detailnya masuk log error PHP |
Yang berjalan di latar belakang
Sign off-nya sendiri langsung ditulis. Bagian yang lambat diantrekan di ts_multiple_signoff_list, satu baris per performer (rout_id, map_id), dan dikerjakan cron/cron_multiple_signoff_v2.php:
- D - Transmit: record Document Library, Transmittal keluar dan folder library, dalam satu transaksi database.
- A, C / S yang me-reject, dan I - Information terakhir: dokumen
_Rapproved lewatgetPDFAfterApprove.php, lalu Transmittal return.
Tanpa baris cron itu, semua ini tidak terjadi. Memasangnya adalah langkah manual di setiap server, lihat Cron job.
Tabel database yang terpengaruh
| Tabel | Operasi | Kapan |
|---|---|---|
ts_map_routing_to | update (rout_status_resp, rout_response, rout_result_code, rout_comments, rout_resp_date) | setiap sign off |
ts_routing | update (rout_status='close', rout_return_status='N', tanggal approve) | sign off final atau rejected |
ts_documents | update (doc_res_id, next_expected_id, doc_appdate) | A - Approval |
ts_multiple_signoff_list | insert atau update (multi_status, cron_ongoing, map_id) | baris yang diantrekan |
ts_documents, ts_map_documents_library, ts_map_doc_file, ts_map_routing_file | insert | cron, publish D - Transmit |
Kolom map_id ditambahkan migrasi 20260915090000_alter_ts_multiple_signoff_list_add_map_id. Baris antrean yang ditulis sebelum itu tidak punya map_id dan dilewati cron.
Hal yang perlu diwaspadai
- Popup membaca peran dari baris terpilih pertama. Guard membuat semua baris berperan sama, jadi seleksi yang lolos guard akan dijawab dengan field peran yang salah.
- Group dengan "action as group" menstempel semua anggota routing group dan tidak menyimpan Return Code, sama seperti Sign Off tunggal.
- Routing non-MDR (routing "New") tetap di-sign off dan ditutup, tetapi tidak ada yang diantrekan: master tidak punya auto publish untuk routing itu.
Perbedaan antar instance
Diperiksa pada 2026-09-16 di origin/main masing-masing fork.
| Instance | Perbedaan |
|---|---|
| Jadestone | Implementasi sendiri, bukan milik master. Menambah aturan yang tidak ada di master: sign off ditolak saat reviewer masih mereview atau saat due date sudah lewat, dan cron-nya menempelkan Routing Slip ke dokumen approved. Punya jalur publish Internal Document untuk routing non-MDR. |
| Medco | Handler sendiri dan cron_multiple_signoff_v2.php sendiri, yang juga meminta Routing Slip (with_slip=1). |
| JOTRE | Masih handler legacy di atas iw_mysql_query(), yang di sana masih berfungsi. Tombol Sign Off di Inbox dikomentari di routing_browse.htm, jadi fiturnya tidak bisa dicapai dari toolbar. |
| Prima Energy | Handler legacy, dan iw_mysql_query() melempar exception, jadi akan fatal. Tombol Sign Off di Inbox juga dikomentari di sana. |
Terkait
- Sign Off: sign off tunggal yang ditiru halaman ini, lengkap dengan aturan field-nya.
- Cron job: job latar belakang dan cara memasangnya.
- Action Indicated: kode action routing.