Skip to content
All projects
LGU Developer 2026

Travel Order & Certificate of Appearance

The travel order module inside ACCESS: employees' travel dates, the Certificate of Appearance that proves each one, and the upload, encoding, rejection and cancellation workflow that connects them to payroll.

6

Access codes enforced

5

Certificate states tracked

JPG · PNG · PDF

Upload formats

01 · The problem

What was wrong

An employee on official travel is not at their biometric terminal, so the day has to be credited some other way. The proof is a Certificate of Appearance — a signed slip from wherever they actually went, which someone then has to match against the approved travel order before the day counts toward payroll.

On paper that means slips changing hands, disputes about whether one was ever submitted, and encoders reconciling documents against a payroll period that is about to lock.

02 · The approach

What I did

Built the certificate's whole life as an explicit, auditable workflow rather than a single approve button.

  • Every state is a state, not a guess: awaiting encoding, encoded, rejected with a recorded reason, cancelled, or blocked because the payroll period is already locked.
  • Rejection carries a reason, captured at the moment of rejection, so the employee is told what was actually wrong with the slip.
  • Role-scoped visibility — an ordinary employee sees their own travel, an office head sees the department, an encoder sees every department. The same screen, six different access codes behind it.
  • Payroll-period awareness throughout. Once a period is locked, the module stops offering actions that would silently do nothing, rather than accepting them and failing later.
  • Certificates uploaded as images or PDF and reviewed in a modal with prev/next paging, so an encoder works through a queue instead of reopening the list each time.

03 · The outcome

What changed

Travel days reach payroll with their supporting certificate attached, and every hand-off — who uploaded, who encoded, who rejected and why — is recorded against the record rather than remembered.

The rejection reason is the part users noticed. Before it existed, a rejected certificate meant a phone call to find out what was wrong with it.

Highlights

  • Full certificate lifecycle: upload, encode, reject with reason, cancel
  • Six access codes driving what each role can see and do on one screen
  • Server-side DataTables listing filtered by payroll period, department and status
  • Locked payroll periods disable actions up front instead of failing at submit

Built with

  • PHP 8.2
  • CodeIgniter 3
  • Microsoft SQL Server
  • jQuery
  • DataTables
  • Bootstrap
  • SweetAlert
  • Linux
  • Apache

Next project

ACCESS — LGU HRIS & Payroll

See how it was built