Skip to content

MDR

Tab pertama Master Doc. Register: grid register, toolbar-nya, dan tombol-tombol yang menggerakkan dokumen (Import MDR, Upload, Upload Transmittal, Generate Transmittal).

Grup Civil dibuka: satu baris per entri MDR, dengan kolom template project
Grup Civil dibuka: satu baris per entri MDR, dengan kolom template project · click to enlarge

Satu baris per entri ts_documents_master, dikelompokkan per discipline secara default. Kolomnya adalah template MDR project (getProjectSelectedColumn, dipelihara di Project Register), itu sebabnya dua instance menampilkan set kolom yang berbeda. Project KTP menampilkan ID, Document Number, Title, Vendor Codes, Last Revision, Project Code, Discipline, Document Type, Area Number, Route Type, Document Size, Contract / PO Number, Weight Factor, Document Category, Previous Document Number, Remarks, Document Sub-Type dan Drawing Category.

TombolYang dibukaDijelaskan di
Uploaddialog Upload File: pilih file, lalu langkah upload option mencocokkan tiap file ke baris MDR dan membuat revisi library serta routing-nyaUpload)
Deletemenghapus baris MDR terpilih, baris matriksnya dan baris ts_mdr_progress-nyaadmin saja
Import MDRdialog Import MDR from Excel Template: download template, upload yang sudah diisiImport MDR)
Replace MDRdialog yang sama dalam mode replace: baris yang sudah ada diperbarui, tidak diduplikasiImport MDR)
Upload Transmittalalur return di instance berbasis auditUpload Transmittal)
Searchdialog Search MDR Data, basic dan advanceddi bawah
Sortdialog sort pada kolom template
Export Excelcmd=exportXLS, grid sebagai workbook
Printdialog Select Column, lalu grid dicetak dengan kolom yang dicentang (cmd=printgrid)
Ungroup, Regroup Bycmd=regroup: mengubah pengelompokandi bawah
Upload: file dijatuhkan di sini dulu; pencocokan ke baris MDR terjadi di langkah berikutnya
Upload: file dijatuhkan di sini dulu; pencocokan ke baris MDR terjadi di langkah berikutnya · click to enlarge
Import MDR from Excel Template: download template, isi, upload
Import MDR from Excel Template: download template, isi, upload · click to enlarge

cmd=search membuka documents_master_search.htm dengan dua tab. Basic Search satu kotak teks yang dicocokkan ke nomor dan judul dokumen di folder saat ini, atau semua folder kalau Search in all folders dicentang. Advance Search baris field / operator / nilai pada kolom template, plus sort. Hasilnya menggantikan grid sampai Refresh.

Search, tab basic
Search, tab basic · click to enlarge
Search, tab advanced: field, operator, nilai, dan sort
Search, tab advanced: field, operator, nilai, dan sort · click to enlarge
Print: centang kolomnya, lalu grid dicetak sebagai tabel
Print: centang kolomnya, lalu grid dicetak sebagai tabel · click to enlarge
Regroup By: kolom pengelompokan, kolom sort dan urutannya
Regroup By: kolom pengelompokan, kolom sort dan urutannya · click to enlarge

Daftar Regroup By berisi Discipline, Document Type dan kolom-kolom yang dinyalakan instance: enable_doc_category, enable_system_code, enable_doc_classification, enable_func_code dan enable_contract_po_number masing-masing menambah satu (cmd=getRegroupOption). Pilihannya disimpan per user dan project di ts_grouping_parameter, jadi grid terbuka dengan cara yang sama lain kali.

Import MDR

Ringkasan

Import MDR membuat massal grid perencanaan MDR (ts_documents_master) dan matriks routing (ts_matrix_rout) dari file Excel (.xlsx). Ini import bertahap dua fase dengan pratinjau sel merah, memakai $pdo, dan di sebagian besar fork mendukung beberapa tipe matriks.

Posisinya di alur kerja

Import MDR (ini)   → ts_documents_master (grid) + ts_matrix_rout (matriks)

Upload (file)      → ts_documents (register) + ts_routing            ← lihat Upload

Upload Transmittal → mencap nomor submission ke register / routing   ← lihat Upload Transmittal

Alur pengguna

  1. Documents Master, Import MDR (import_act, privilege edit).
  2. Pilih MDR atau VDR (dm_is_vdr), pilih .xlsx, Upload.
  3. Grid pratinjau tampil. Sel yang tidak valid disorot merah dan memblokir commit sampai diperbaiki.
  4. Konfirmasi untuk meng-commit baris-baris ke MDR.

Cara kerjanya

  • Fase 1, staging dan parse: act=importexcel di documents_master_handler_post.php memanggil proceedTempMDRImport(), lalu saveTemporaryDocs() di documents_master.inc.php. Ia membaca file dengan PhpSpreadsheet, mengambil baris data pertama dari ts_projects.mdr_row_as_value_start, menyelesaikan pemetaan kolom-ke-field dari ts_mdr_template_setting yang di-join dengan ts_mdr_column, dan menyimpan setiap baris plus matriksnya sebagai JSON ke ts_docmaster_metadata_temp.
  • Fase 2, validasi (pratinjau): nomor dokumen duplikat, format tanggal (dd-Mon-yy), format plan date (dd-mm-yyyy), originator di ts_company, kombinasi sub-discipline dan discipline.
  • Fase 3, commit: proceedSaveTempdata() memanggil insertMetadataToDocumentsMaster(), yang menulis ts_documents_master lewat model Mdr (model/mdr.php), dan insertMatrixData() menulis ts_matrix_rout.

Kedua fungsi staging dan model Mdr ada di kelima fork.

Kontrak data dan template

Tata letak kolom ditentukan data per project, bukan hard-coded: mdr_row_as_value_start plus ts_mdr_template_setting dan ts_mdr_column menentukan kolom Excel mana yang dipetakan ke field ts_documents_master mana, dan di mana blok user-matrix dimulai. Kode action matriks dipetakan ke sequence di insertMatrixData(): R → sequence 1, L → sequence 2, A → sequence 3, selainnya → 4.

Urutan sheet adalah kolom metadata, lalu blok User Matrix (hanya tipe doc_number), lalu kolom Plan Date.

Tipe matriks

getProjectMdrMatrixType() membaca tipe matriks project: doc_number, issued_status atau transmission_type. Master, Jadestone, Medco dan JOTRE punya fungsi ini. Timas tidak; ia hanya mengenal satu tipe matriks.

Kolom Plan Date (INA01-809, hanya master)

Template membawa satu kolom Plan Date <ISSUED_CODE> per baris di ts_issued_status untuk project itu, baris header kedua DD-MM-YYYY, ditulis setelah blok User Matrix oleh mdrSettingDownload(). Import menyimpan nilainya di ts_mdr_progress.progress_content pada ['two'][<issued_code>]['plan_date'] sebagai Y-m-d, field yang sama yang ditulis Edit Progress. Ditulis dan dibaca untuk setiap tipe matriks: plan date adalah per Issued Status dan tidak ada hubungannya dengan tipe matriks.

  • Dicari lewat teks header, tidak pernah dengan menghitung kolom. saveTemporaryDocs() mencocokkan baris 1 dengan Plan Date <code> dan hanya menerima kode yang benar-benar dimiliki project, lalu menyimpan setiap nilai di bawah key plan_date_<ISSUED_CODE> di temp_data. Metadata tetap dikunci dengan huruf kolom. Grid pratinjau dan commit sama-sama membacanya kembali per kode lewat extractPlanDatesFromTempData().
  • Kenapa bukan hitungan kolom. Menghitung mundur dari kolom terakhir rusak kalau file diunduh sebelum sebuah Issued Status ditambah atau dihapus. Menghitung maju dengan count(get_doc_column_master2()) - 1 rusak karena fungsi itu memfilter ts_mdr_template_setting.is_import = 1 sementara penulis template (mdrSettingList()) tidak. Di data dev INA01 itu selisih dua kolom.
  • Sel kosong diimpor tanpa masalah dan menyimpan plan date kosong. File tanpa kolom Plan Date membiarkan apa pun yang sudah tersimpan tidak tersentuh, jadi file template lama tetap bisa diimpor.
  • Pemeriksaan format terjadi di cmd=temporaryMetadataValidation (d-m-Y), dilaporkan di bucket invalidDateCellList2. Urutan cabang bucket itu di templates/tracking_v2/documents_master_browse.htm harus sama dengan urutan cabang yang memilih $data["msg"], atau sel merah dan pesannya tidak sinkron.

Hanya master yang punya ini

extractPlanDatesFromTempData() hanya ada di master. Empat fork lain tidak mengimpor plan date dari template MDR.

Tabel database yang terpengaruh

TabelOperasiCatatan
ts_docmaster_metadata_tempinsert / select / deletestaging (baris plus matriks sebagai JSON)
ts_documents_masterinsert (lewat Mdr)satu baris per baris spreadsheet; dm_is_vdr dari opsi
ts_matrix_routinsertmatriks reviewer per dokumen
ts_mdr_progressinsert / updateweight factor plus plan date per Issued Status (plan date: hanya master)
ts_projects, ts_mdr_template_setting, ts_mdr_columnselectbaris awal plus pemetaan kolom
ts_issued_status, ts_progress_gateselectkolom Plan Date plus kerangka progress
ts_company, ts_sub_discipline, ts_docdiscipline, ts_org_personselectvalidasi plus pencarian reviewer

Hal yang perlu diwaspadai

  • Tata letak ditentukan data. mdr_row_as_value_start atau pemetaan yang salah diam-diam membaca header sebagai data. Mulai dari template khusus project.
  • Pencarian nama reviewer gagal diam-diam. Nama matriks yang tidak terselesaikan menghasilkan person_id kosong dan entri matriks itu dilewati, meninggalkan celah routing yang baru terlihat di Upload).
  • Satu import staging per pengguna dan project. Memulai import baru menimpa yang belum dikonfirmasi.
  • Blok User Matrix harus berakhir di header merge-nya, bukan di getHighestColumn(), karena sheet tidak lagi berakhir dengan matriks. saveTemporaryDocs() membaca akhir merge untuk User Matrix dan hanya menyimpan huruf kolomnya. Memakai alamat sel mentah (CE1) membiarkan digit baris di rentang per baris, jadi CE1 . 4 menjadi CE14 dan pembacaan melebar ke ribuan baris, bukan satu. Itu INA27-236, error 504 pada file 2.600 baris. File kecil terlihat baik-baik saja, jadi hanya file besar yang menangkapnya.

Perbedaan antar instance (Import MDR)

Diperiksa pada 2026-09-06.

InstancePerbedaan
TimasTidak ada getProjectMdrMatrixType(); hanya satu tipe matriks.
Jadestone, Medco, JOTRE, TimasTidak ada kolom Plan Date di template dan tidak ada extractPlanDatesFromTempData().

Upload

Ringkasan

Upload menerima file dokumen, membuat baris register (ts_documents) untuk PDF, menyimpan filenya, dan memulai routing dari matriks project. Mesinnya memakai $pdo, dengan gating feature flag dan pemetaan otomatis referensi DMS. UI-nya sederhana: dialog opsi lama (Convert / Modify Routing / Force Upload) sudah hilang di master, dan watermark PDF dinonaktifkan. Ia juga membawa dua bug yang diketahui, lihat Hal yang perlu diwaspadai.

Prasyarat

1. Import MDR / Add   → ts_documents_master (grid perencanaan)   ← Import MDR
2. Upload (ini)       → ts_documents (register) + ts_routing    ← membuat + me-routing
3. Upload Transmittal → mencap nomor submission ke baris-baris itu

Nomor dokumen harus ada di ts_documents_master, dan matriks routing ts_matrix_rout harus terisi. Kalau tidak, Upload menolak filenya ("User matrix empty").

Alur pengguna (master)

  1. Documents Master, Upload (upload_act, privilege upload).
  2. Jendela Upload File terbuka langsung. Pilih Issued Status (disembunyikan kalau skema nama file project tidak punya issued_code), tambahkan file di pengunggah multi-file, Start Upload.
  3. Sebuah prompt konfirmasi bertanya "Whether originator of document is correct?" sebelum file naik.
  4. Setiap file divalidasi, disimpan, dan, untuk PDF, didaftarkan dan di-routing. Hasilnya dikembalikan sebagai JSON per file.

Nama file penting. Nomor dokumen, revisi dan judul diambil dari nama file sesuai ts_file_name_setting. Nomor yang tidak cocok atau nama yang salah bentuk ditolak.

Yang disederhanakan atau dihapus

Di documents_master_browse.htm master, tombol upload_act langsung memanggil multiuploadOptionProcess(); baris yang membuka dialog lama, // multiuploadOption();, dikomentari. Jadi tiga pilihan v2 tidak ditawarkan lagi:

Opsi lamaYang dilakukannyaStatus di master
Convert Document(s) (valConvert)Menjalankan pdf_converter.php untuk mendeteksi halaman PDF berukuran besar, mengantrekannya di ts_routconvert_queue, dan menahan dokumen dari inbox sampai dikonversi.Tidak bisa dipilih. Handler masih punya if ($_GET['valConvert']==1) include "pdf_converter.php", tetapi parameternya tidak pernah dikirim, jadi Convert adalah kode mati.
Modify Routing(s) (valModify)Menyimpan routing baru ke ts_routmaster_temp supaya pengunggah bisa meninjaunya sebelum email notifikasi terkirim.Tidak bisa dipilih. Tombol toolbar upload_routing dan modify_routing_process di dalam showUpload dikomentari. Routing mengikuti jalur "kirim sekarang".
Force Upload (forceStatus)Melewati penjaga next-expected-submission dan previous-revision-returned untuk upload di luar urutan.Tidak bisa dipilih sebagai toggle. Penjaga next-expected diatur oleh flag config enable_next_issue_code.

Juga dihapus: watermark PDF SPRD / VOID. Rutin yang mencap PDF superseded atau void dengan deskripsi issued-nya saat upload tidak punya baris aktif tersisa di handler di kelima fork. Flag enable_watermark ada di seed master, Jadestone, Medco dan JOTRE, default 0, dan handler upload tidak membacanya.

Medco menghidupkan dialognya lagi, dengan satu opsi

INA28-229 (2026-07-12) mengaktifkan kembali dialog Upload Option di Medco dengan Force Upload saja. upload_act di sana menjalankan checkPerms('upload', multiuploadOption), dan multiuploadOptionProcess() memanggil showUpload(0, 0, 0, valForce). Convert dan Modify Routing tetap tidak tersedia.

Jadestone tidak menanyakan originator

Form upload-nya mengeset showOriginator: false dengan catatan "originator is not asked per file anymore, it is always the logged in user". Empat fork lain menampilkan prompt itu.

Cara kerjanya

Handler documents_master_multiupload_upload.php memvalidasi nama file, mencari baris MDR, memeriksa matriks, memasukkan ts_documents, menyimpan file (ts_file_explorer, ts_map_documents_library, ts_map_doc_file), dan membuat routing (ts_routing, ts_map_routing_file, ts_map_routing_to) dengan tanggal jatuh tempo. Issued Status menentukan durasi review, pemeriksaan next-expected-submission, dan metadata issued yang disimpan di record. Nilai referensi DMS disalin ke ts_map_routing_file lewat MODULE_REFERENCE_TABLE_CONFIG dan getAllDmsRefDataByRelatedTable() di tracking_function.inc.php, di kelima fork.

Folder library: hanya Deliverables saat upload

Di v2, Upload menurunkan folder library bersarang dari metadata MDR dokumen lewat getLibCodeAutoGenerateFromDocMaster(), dibentuk oleh ts_projects.project_east_java (hierarki Medco / Ophir / East Java).

Upload tidak melakukan itu lagi. Fungsi itu tidak dirujuk lagi dari handler upload sama sekali, di kelima fork. Sebagai gantinya dokumen yang diunggah diarsipkan ke satu folder tetap, folder Deliverables project, lewat getLibCodeDeliverablesByProjectCode(). Penempatan bersarang berdasarkan metadata MDR terjadi kemudian, saat auto-publish routing (sign-off approver), bukan saat upload. Lihat Auto Folder Creation dan Sign Off.

Timas mengarsipkan secara berbeda

Handler upload Timas tidak punya getLibCodeDeliverablesByProjectCode() dan tidak membaca enable_autopublish. Ia mencari folder project langsung dari ts_doc_library. Baca handler-nya sebelum berasumsi perilaku Deliverables berlaku di sana.

Aturan penempatan D

Kalau matriks berisi baris D (Transmit / DocCon), handler menegakkan penempatannya dan menunda auto-publish. Detail di Action Indicated. Timas tidak punya pemeriksaan docconFound.

Tabel database yang terpengaruh

TabelOperasi
ts_documents_masterselect, update (dm_revision)
ts_documentsinsert (PDF), update (doc_due_date)
ts_file_explorer, ts_map_documents_library, ts_map_doc_fileinsert
ts_matrix_routselect (matriks)
ts_routing, ts_map_routing_file, ts_map_routing_toinsert

Hal yang perlu diwaspadai

  • matrix_doc_no='4' hard-coded. Masih ada di kelima fork. Query penghitung action memfilter WHERE tmr.matrix_doc_no='4', sebuah literal, jadi ia selalu menghitung action matriks dokumen nomor 4, bukan dokumen yang diunggah.
  • is_trash='y' hard-coded. Masih ada di kelima fork. Insert ts_map_routing_file mengikat $is_trash="y", menandai setiap tautan file routing sebagai sampah.
  • Matriks harus ada atau upload gagal. Jalankan Import MDR) dulu.
  • Rollback manual, bukan transaksional. Error di tengah jalan bisa meninggalkan data yatim.
  • Kode mati yang terlihat seperti fitur. Convert dan Modify Routing masih punya kode backend tetapi tidak ada yang mengirim parameternya.
  • cron/cron_issue_staging_oversize.php ada tetapi merupakan job notifikasi ukuran file. Ia bukan pengganti langkah Convert yang dihapus.

Perbedaan antar instance (Upload)

Diperiksa pada 2026-09-06.

InstancePerbedaan
MedcoDialog Upload Option diaktifkan kembali dengan Force Upload saja (INA28-229). forceStatus dibaca dua kali di handler.
JadestoneTidak ada prompt konfirmasi originator. Originator selalu pengguna yang login.
TimasTidak ada aturan docconFound, tidak ada getLibCodeDeliverablesByProjectCode(), tidak ada pembacaan enable_autopublish di handler upload.
JOTRESama dengan master di setiap hal yang diperiksa.

Upload Transmittal

Ringkasan

Upload Transmittal mengimpor Transmittal Sheet (.xlsx) yang sudah diisi dan mencap dokumen register yang cocok dengan nomor submission dan referensi dokumen sebelumnya. Kontrak tata letak dan posisi selnya adalah yang selalu dipakai INACT. Di master importer ini memakai $pdo, memeriksa tipe file, dan tidak lagi memperbarui remarks routing.

Ini bukan importer umum: ia hanya memperbarui baris ts_documents yang sudah ada, dicocokkan tepat pada doc_number plus doc_rev.

Prasyarat dan urutan

1. Import MDR / Add   → ts_documents_master
2. Upload (file)      → ts_documents (register) + ts_routing
3. Upload Transmittal → mencap nomor submission / prev-doc ke baris-baris itu

Mengunggah transmittal sebelum langkah 2 tidak mencocokkan baris apa pun.

Alur pengguna

  1. Documents Master, Upload Transmittal (import_transmittal_act, privilege edit).
  2. Pilih Transmittal Sheet .xlsx yang sudah diisi, Save.
  3. Saat berhasil server merespons Success.; nama yang duplikat merespons Transmittal <name> already exist.

Cara kerjanya

Handler act=importtransmittal di documents_master_handler_post.php:

  1. Pemeriksaan tipe file. File non-Excel ditolak dengan "Invalid file type. Please upload an Excel file."
  2. Pemeriksaan duplikat. Nama file tanpa ekstensi dibandingkan dengan ts_correspondence.corr_doc_number.
  3. Simpan file. uploadTransmittal() menulisnya ke docUpload/correspondence/.
  4. Parse Excel dengan PHPExcel, library legacy. Sheet pertama ke array.
  5. Baca sel header. H9 nomor transmittal, H7 kontrak, B7 company pengirim.
  6. Insert ts_correspondence (corrkind_id=1). library_code dicari dari folder default transmittal masuk, bukan 1.1 hard-coded yang lama.
  7. Catat file. ts_file_explorer, ts_map_corr_file.
  8. Loop baris dokumen dari baris 25, berhenti di kolom A kosong pertama. Untuk setiap baris, update ts_documents (doc_submission_number, doc_number_prev) WHERE doc_number=<A> AND doc_rev=<F>. Di master, Jadestone dan Medco update lama ke ts_routing.rout_remarks dikomentari.
  9. Selesaikan pengirim. ts_company.company_desc LIKE '%<from>%'.

Kontrak data dan template

SelArti
H9Transmittal Number
H7Contract Number
B7From, company pengirim

Tabel dokumen: header baris 24, data dari baris 25. A = Document Number, F = Rev, N = dokumen sebelumnya (doc_number_prev), P = Remarks.

Yang terjadi pada baris yang tidak cocok

Di master, UPDATE per baris adalah prepared statement dan import dibatalkan dengan "Failed to map transmittal file5." hanya kalau statement-nya gagal. Baris yang cocok dengan nol dokumen lolos diam-diam. Medco menambahkan pemeriksaan rowCount() == 0 dan gagal secara eksplisit pada baris yang tidak cocok; apakah satu dokumen yang tidak cocok membatalkan seluruh import Medco belum dipastikan.

Tabel database yang terpengaruh

TabelOperasiCatatan
ts_correspondenceinsert, updateheader (corrkind_id=1); company_id setelah pencarian
ts_file_explorer, ts_map_corr_fileinsertfile tersimpan plus tautan
ts_documentsupdatedoc_submission_number, doc_number_prev (cocokkan doc_number plus doc_rev)
ts_routingupdate, hanya JOTRE dan Timasrout_remarks dari kolom P
ts_companyselectpenyelesaian pengirim

Hal yang perlu diwaspadai

  • Butuh kecocokan revisi persis. Spasi di akhir atau format berbeda di kolom F berarti barisnya diam-diam tidak diperbarui.
  • Hanya update. Dokumen yang tidak ada di register tidak dibuat.
  • Remarks tidak diimpor di master. Kolom P di-parse tetapi tidak disimpan di mana pun. JOTRE dan Timas masih menulisnya ke ts_routing.rout_remarks, yang punya catatan ketidakcocokan kolom antar versi template.
  • Masih PHPExcel di sini, sementara Import MDR) memakai PhpSpreadsheet.
  • SQL yang sebagian besar tidak di-escape pada nilai sel di bagian handler yang lama. Perlakukan unggahan sebagai input tepercaya.

Perbedaan antar instance (Upload Transmittal)

Diperiksa pada 2026-09-06.

InstancePerbedaan
JOTREUpdate ts_routing.rout_remarks aktif. Kolom P disimpan.
TimasSama dengan JOTRE.
MedcoKegagalan eksplisit pada baris yang tidak cocok (rowCount() == 0).

Master dan Jadestone sama.

Generate Transmittal

Tidak aktif. Tidak bisa dijangkau dari UI di semua big five.

Tombol toolbar-nya dikomentari; logika backend-nya utuh. Diperiksa 2026-09-06: tombol yang dikomentari, handler cmd=generateTransmittal, file prototipe yang dihapus dan typo Content-Type identik di kelima fork.

Ringkasan

Generate Transmittal menghasilkan Transmittal Sheet (.xlsx) terisi untuk sebuah dokumen MDR yang dipilih dengan menggabungkannya ke template Excel per company, lalu mengalirkannya sebagai unduhan. Ia adalah penghasil sheet yang dimaksudkan untuk dipakai Upload Transmittal). Jangan jelaskan ke pengguna bahwa fitur ini tersedia.

Kenapa tidak muncul di UI

Di documents_master_header.inc.php, perhatikan // di awal:

php
// $tpl->Assign('toolbar_generate_transmittal','procBarMDR.addButton("generate_transmittal_act", 13, "Generate Transmittal", ...);');

Variabel template tidak pernah di-assign, jadi tombolnya tidak pernah dirender. Dispatch dan rute backend-nya ada tetapi tidak ada yang memicunya.

Cara kerjanya kalau diaktifkan

cmd=generateTransmittal di documents_master_handler_form.php mencari dokumen di ts_documents_master, mengambil template originator dari ts_company_transmittal (comp_file_name, di docUpload/routing/), memuatnya dengan PHPExcel, mengisi sel-sel tetap, menulis satu baris dokumen, dan mengalirkan TRANSMITTAL <date>.xlsx.

Kontrak data dan template

.xlsx per company, diunggah lewat Reference, Company. Sel: G6 project, G9 kontraktor (To), G16 attention, G12 alamat, O48 issued-by, S46 tanggal, dan baris dokumen di baris 53 (B53 nomor item, C53 nomor dokumen, L53 judul). Hanya membaca, tidak menulis.

Cacat yang diketahui di kode yang tidak aktif ini

  • Hanya satu dokumen. Tidak ada loop; satu dokumen per sheet.
  • Typo Content-Type. Header respons mengirim pplication/... bukan application/....
  • Prototipe yatim documents_master_create_transmittal.php dari v2 sudah dihapus di setiap fork.
  • Class OOP Transmittal (HTML2PDF) ada untuk fitur Return di routing dan tidak terhubung ke generator ini.

Cara mengaktifkan kembali

Buka komentar tombolnya, pastikan setiap originator punya template di ts_company_transmittal dan docUpload/routing/, perbaiki typo Content-Type, dan uji siklus bolak-baliknya lewat Upload Transmittal). Perlakukan sebagai perubahan kode sungguhan dengan work item.

Perbedaan antar instance (Generate Transmittal)

Diperiksa pada 2026-09-06. Tidak ada. Kelima fork identik di setiap hal di atas.