Skip to content

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

  1. Di Inbox, centang beberapa baris dan klik Sign Off (inb_multisignoff_act). Tombolnya butuh akses edit yang sama dengan action Inbox lain, atau group admin.

  2. Satu baris yang dicentang membuka jendela Sign Off tunggal biasa. Kalau tidak ada baris yang dicentang, grid meminta Anda memilih dulu.

  3. Tiga guard berjalan sebelum popup, semuanya di sisi server:

    GuardPesan 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.
  4. 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.

  5. Jawab lalu klik tombolnya. Browser mem-POST act=multiplesignoff dengan daftar map_id yang dipilih.

  6. 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.

Peranrout_indicateField di popupTombol
R Review8Comments / No CommentsYes, sign off these documents
I Information5Comments / No CommentsYes, sign off these documents
L Leader11Return CodeYes, sign off these documents
C Checking15Return CodeYes, sign off these documents
S Responsible16Return CodeYes, sign off these documents
A Approval9Return Code, plus Next Expected Submission saat enable_next_issue_code = 1 dan field-nya memang terlihat untuk performer ituYes, sign off these documents
D Transmit12tidak adadua tombol, lihat di bawah
selain itutidak 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 memuat action_desc performer.
  • 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 status external milik project.

D - Transmit dijawab dengan dua tombol

D - Transmit tidak punya dropdown. Ia mendapat dua jawaban yang sama dengan Sign Off tunggalnya:

TombolReturn Code yang dipakai
Yes - Proceed routingkode approved pertama untuk Action Indicated itu, urut doc_res_sort
No - Return to Contractor DCkode 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 munculPenyebab
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 _R approved lewat getPDFAfterApprove.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

TabelOperasiKapan
ts_map_routing_toupdate (rout_status_resp, rout_response, rout_result_code, rout_comments, rout_resp_date)setiap sign off
ts_routingupdate (rout_status='close', rout_return_status='N', tanggal approve)sign off final atau rejected
ts_documentsupdate (doc_res_id, next_expected_id, doc_appdate)A - Approval
ts_multiple_signoff_listinsert atau update (multi_status, cron_ongoing, map_id)baris yang diantrekan
ts_documents, ts_map_documents_library, ts_map_doc_file, ts_map_routing_fileinsertcron, 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.

InstancePerbedaan
JadestoneImplementasi 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.
MedcoHandler sendiri dan cron_multiple_signoff_v2.php sendiri, yang juga meminta Routing Slip (with_slip=1).
JOTREMasih 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 EnergyHandler 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.