{{ activity.projectRef }} · {{ activity.activityType }}
{{ activity.summary }}
Due {{ activity.dueDate }}
{{ activity.projectTitle }}
ZENQOR Technologies
Preparing your secure workspace
You've been inactive for a while. For your security, this session will sign out automatically in about 1 minute unless you stay active.
Are you sure you want to end this session? Any unsaved changes may be lost.
Do you want to stay here to sign back in to the Portal, or return to the main Zenqor Technologies website?
{{ onboardingMode === 'whatsnew' ? `Updated · v${latestChangelog?.version}` : 'Welcome' }}
This portal was just updated. Here's what's new since your last visit:
{{ userProfile.role === 'Client' ? 'Here\'s a quick look at your Client Portal:' : 'Here\'s a quick look at what you can do:' }}
Dual System Human Resources Management System & Client Documents Tracking System
Malaysia's First Unified HR & Client Management System
{{ authView === 'client' ? 'Access your official documents and live project tracker.' : 'Access payroll, billing, claims and HR modules.' }}
{{ n.message }}
{{ formatDateTime(n.timestamp) }}
Create and manage client quotations and invoices in a standard corporate format.
{{ docForm.clientName || 'Untitled Client' }}
{{ docForm.clientSSM || 'No SSM / TIN set' }}
{{ clientSavedForDocument ? 'Saved Client' : 'Unsaved Draft' }}Company Identity
Contact Details
Address
ATTACHMENT / RECEIPT (MAX 2MB)
{{ docForm.paymentAttachment ? 'Receipt Attached' : 'No file selected' }}
| Description / Product | Qty | Unit Price (RM) | Total (RM) | |
|---|---|---|---|---|
| {{ formatCurrency(item.qty * item.price) }} |
Automated statutory contribution engine for EPF, SOCSO, EIS and PCB, with MTD/YTD tracking.
{{ payForm.name || 'Untitled Employee' }}
{{ payForm.position || 'No position set' }}
{{ payForm.dept }}
{{ selectedPayEmployeeId ? 'From HR Directory' : 'Manual Entry' }}Identity
Employment
Banking & Statutory
Submit and track expense claims and payment vouchers through the approval workflow.
{{ claimForm.name || 'Untitled Applicant' }}
{{ claimForm.dept || 'No department set' }}
{{ selectedClaimEmployeeId ? 'From HR Directory' : 'Manual Entry' }}Applicant Information
ASSIGN TO HR APPROVER *
The claim is assigned to the HR role group. All registered HR users can review it; it then moves to Account and Director for final approval.
RECEIPT ATTACHMENT (MAX 2MB) *
{{ claimForm.receiptAttachment ? `${claimForm.receiptAttachmentName || 'Receipt Attached'} · stored ${formatFileSize(getDataUrlSize(claimForm.receiptAttachment))}` : 'PNG, JPG or JPEG · total application files max 2MB' }}
{{ voucherForm.name || 'Untitled Requester' }}
{{ voucherForm.dept || 'No department set' }}
{{ selectedVoucherEmployeeId ? 'From HR Directory' : 'Manual Entry' }}Requester Information
ASSIGN TO HR APPROVER *
The voucher is assigned to the HR role group. All registered HR users can review it; it then moves to Account and Director for final approval.
SUPPORTING DOCUMENT (MAX 2MB) *
{{ voucherForm.receiptAttachment ? `${voucherForm.receiptAttachmentName || 'Document Attached'} · stored ${formatFileSize(getDataUrlSize(voucherForm.receiptAttachment))}` : 'PNG, JPG or JPEG · total application files max 2MB' }}
| Date & Receipt No. | Employee | Category & Sub-Category | Amount (RM) | Status | Assigned To | Actions |
|---|---|---|---|---|---|---|
| {{ clm.expenseDate }} Claim REF: {{ clm.receiptNo }} | {{ clm.name }} {{ clm.empNo }} | {{ clm.category }} {{ clm.subCategory }} | {{ formatCurrency(clm.amount) }} |
{{ clm.status }}
Approved by {{ clm.approvedByName }} ({{ clm.approvedByRole }}) {{ formatDateTime(clm.approvedAt) }} |
{{ clm.assignedToName || '-' }} {{ clm.assignedToRole || '-' }} |
|
| No expense claim records found. | ||||||
| Date & Voucher No. | Payee | Category & Sub-Category | Amount (RM) | Status | Assigned To | Actions |
|---|---|---|---|---|---|---|
| {{ pv.paymentDate }} Voucher REF: {{ pv.voucherNo }} | {{ pv.payeeName }} {{ pv.payeeType }} · Requested by {{ pv.name }} | {{ pv.category }} {{ pv.subCategory }} | {{ formatCurrency(pv.amount) }} |
{{ pv.status }}
Approved by {{ pv.approvedByName }} ({{ pv.approvedByRole }}) {{ formatDateTime(pv.approvedAt) }} |
{{ pv.assignedToName || '-' }} {{ pv.assignedToRole || '-' }} |
|
| No payment voucher records found. | ||||||
Live project workflow overview.
Activities requiring your action, ordered by due date.
{{ activity.projectRef }} · {{ activity.activityType }}
{{ activity.summary }}
Due {{ activity.dueDate }}
{{ activity.projectTitle }}
Welcome, {{ userProfile.name }}. View your latest payslips and expense claim status.
Latest Net Salary
Last Generated Payslip
Pending Claims
Status: Pending
Approved Claims (YTD)
Status: Approved
| Date | Type | Reference / Description | Amount (RM) | Status |
|---|---|---|---|---|
| {{ c.expenseDate }} | Claim | {{ c.category }} - {{ c.receiptNo }} | {{ formatCurrency(c.amount) }} | {{ c.status }} |
| {{ v.paymentDate }} | Voucher | {{ v.category }} - {{ v.voucherNo }} | {{ formatCurrency(v.amount) }} | {{ v.status }} |
| {{ p.date }} | Payslip | {{ p.docNo }} ({{ p.raw?.month || 'Monthly Salary' }}) | {{ formatCurrency(p.amount) }} | PAID |
Client Portal
Here's a snapshot of your projects and official documents today.
Total Documents
Quotations & Invoices
Unpaid Invoices
{{ myUnpaidInvoicesCount }} Invois Unpaid
Total Paid Amount
Status: Paid
Live workflow status for projects assigned to your Client Portal account.
+{{ projects.length - 3 }} more project(s) — view all for full tracker
No project has been assigned to your account yet.
| Date | Type | Document No. | Amount (RM) | Status | Action |
|---|---|---|---|---|---|
| {{ d.date }} | {{ d.type }} | {{ d.docNo }} | {{ formatCurrency(d.amount) }} | {{ d.status || 'Unpaid' }} |
Real-time monitoring of financial KPIs, HR, corporate documents, and system activities.
Total Employees
{{ activeEmployeesCount }} Active
Total Clients
{{ priorityClients.length }} Priority
Total Quotations
{{ formatCurrency(totalQuotationValue) }}
Total Invoices
{{ paidInvoicesCount }} Paid / {{ unpaidInvoicesCount }} Unpaid
Revenue (Paid)
Collected Inflow
Pending Receivables
{{ unpaidInvoicesCount }} Invoices Unpaid
Total Payroll (Net)
{{ payslipHistory.length }} Payslips Generated
Claims & Vouchers (Approved)
{{ pendingClaimsCount }} Pending Approval
Active project and activity assignments per staff member — a view only possible because HR and Client records share one system.
| Date | Module | Ref No. | Recipient / Employee | Amount (RM) | Status | Actions |
|---|---|---|---|---|---|---|
| {{ item.date }} | {{ item.type }} | {{ item.docNo }} | {{ item.name }} | {{ formatCurrency(item.amount) }} | {{ getActivityStatus(item).label }} {{ getActivityStatus(item).detail }} |
|
|
{{ (recentActivityFilter !== 'all' || recentActivityAttentionOnly || searchQuery) ? 'No records match your current filter.' : 'No records found.' }} |
||||||
Maintain client company records used across quotations and invoices.
| Reg No. / TIN | Client / Company Name | Contact & Email | Address & Location | Actions |
|---|---|---|---|---|
| {{ cust.clientSSM || '-' }} |
{{ getInitials(cust.clientName) }}
{{ cust.clientName }}
{{ cust.clientPosition }}
New
{{ clientTierMeta(cust.clientTier).label }}
{{ clientHealthScore(cust).label }}
|
{{ cust.clientContactPerson || '-' }} {{ cust.clientPhone }} {{ cust.clientEmail }} | {{ cust.clientAddress }} |
|
| No clients registered in the database. | ||||
Maintain employee profiles, statutory contributions, and employment records.
| Employee ID & Presence | Name & Position | ID / Passport & Bank Account (PDPA Masked) | Contributions (EPF/SOCSO/PCB) | Basic Salary (RM) | Actions |
|---|---|---|---|---|---|
| {{ emp.empNo }} {{ employeePresenceLabel(emp) }} {{ employeeLastSeen(emp) }} {{ emp.status === 'Aktif' ? 'Active' : emp.status }} {{ emp.employmentType || 'Not set' }} · Joined {{ emp.joinDate || '-' }} 60+ Senior |
{{ emp.name }}
{{ emp.position }}
{{ emp.dept }}
{{ emp.email }}
|
{{ maskIC(emp.ic) }} {{ maskBank(emp.bankAcc) }} |
EPF: {{ maskSensitive(emp.epfNo) }} SOCSO: {{ maskSensitive(emp.socsoNo) }} PCB: {{ maskSensitive(emp.taxNo) }} |
{{ formatCurrency(emp.basicSalary) }} |
|
| No employees registered in the database. | |||||
Export financial, employee, and document reports to CSV/Excel.
Combined HR + Client analytics — unique to a unified HRMS/CDTS platform.
Top Clients by Revenue
No paid invoices yet.
Staff Engaged per Client
No project assignments yet.
Delivery Velocity
Average age of active projects still in progress.
Currently overloaded across client work (4+ active items).
{{ userProfile.role === 'Client' ? 'Follow your project progress across five workflow stages, in real time.' : 'Real-time project progress across five controlled workflow stages.' }}
No project has been assigned to your account yet.
No project in this stage
| Reference / Project | Client | Person In Charge | Target Date | Workflow Status | Actions |
|---|---|---|---|---|---|
{{ project.projectRef }} {{ project.title }} {{ project.description }} |
— {{ project.clientEmail }} New{{ clientTierMeta(clientTierForId(project.clientDirectoryId)).label }} |
{{ project.ownerName || '—' }} {{ project.ownerPosition }} {{ project.ownerEmail }} Assigned {{ formatDateTime(project.ownerAssignedAt) }} {{ projectPicPresenceDetail(project) }} |
{{ project.targetDate || '—' }} | {{ project.status }} | |
No project activity found | |||||
{{ projectPreview.project.projectRef }}
{{ projectTargetDateState(projectPreview.project).label }}Client
—
Schedule
Start: {{ projectPreview.project.startDate || '—' }}
Target: {{ projectPreview.project.targetDate || '—' }}
Person In Charge
{{ projectPreview.project.ownerName || '—' }}
{{ projectPreview.project.ownerPosition || 'NO POSITION' }}
{{ projectPreview.project.ownerEmpNo }} · {{ projectPreview.project.ownerEmail }}
Assigned {{ formatDateTime(projectPreview.project.ownerAssignedAt) }} · {{ projectPicPresenceDetail(projectPreview.project) }}
Centralized repository — JPG, PNG and PDF files shared between your team and the client.
Loading documents…
No documents uploaded yet
{{ item.fileName }}
{{ formatFileSize(item.fileSize) }} · Uploaded by {{ item.uploadedByName }} · {{ formatDateTime(item.uploadedAt) }}
Scheduled actions, assignees and due dates for this project.
{{ activity.summary }}
{{ activity.details }}
{{ activity.assignedName }} · {{ activity.assignedPosition || 'NO POSITION' }}
Due Date
{{ activity.dueDate }}
No activity issue scheduled
Two-way conversation between your team and the client for this project.
{{ update.message }}
No Client update has been shared
Dedicated self-service portal for clients to view documents and payment status.
{{ myClientRecord?.clientName || userProfile.name }}
{{ myClientRecord?.clientSSM || 'SSM not on file' }}
{{ clientTierMeta(myClientRecord.clientTier).label }}Total Documents
Paid Invoices
Unpaid Invoices
Active Projects
| Type | Document No. | Date | Amount (RM) | Status | Actions |
|---|---|---|---|---|---|
| No documents match this filter. | |||||
| {{ d.type }} | {{ d.docNo }} | {{ d.date }} | {{ formatCurrency(d.amount) }} | {{ d.status || 'Unpaid' }} | |
Real-time user security and activity logs from Firebase.
| Timestamp | User | Action | Activity / Target | IP & Browser |
|---|---|---|---|---|
| {{ log.timestamp }} | {{ log.user }} | {{ log.action }} | {{ log.details }} | {{ log.ip }} ({{ log.browser }}) |
Global information used across company documents.
Displayed on quotations and invoices.
To change your own role, use Portal Access Management below (requires a second look to avoid accidental self-lockout).
PNG, JPEG or JPG only. Maximum file size: 2 MB. The image is saved securely in Firebase Storage.
Uploading and saving photo…
{{ profilePhotoUpload.error }}
No update history recorded yet.
| Username | Sign-In Email | Role | Actions |
|---|---|---|---|
| {{ usr.name }} | {{ usr.email }} | {{ getRoleDisplayName(usr.role) }} | Protected Seed Account |
Read-only
{{ claimPreview.claim.documentType === 'Payment Voucher' ? 'Voucher / Reference No.' : 'Receipt / Reference No.' }}
{{ claimPreview.claim.documentType === 'Payment Voucher' ? claimPreview.claim.voucherNo : claimPreview.claim.receiptNo }}
{{ claimPreview.claim.documentType === 'Payment Voucher' ? 'Payment Date' : 'Expense Date' }}: {{ claimPreview.claim.documentType === 'Payment Voucher' ? claimPreview.claim.paymentDate : claimPreview.claim.expenseDate }}
{{ claimPreview.claim.name }}
{{ claimPreview.claim.empNo }} · {{ claimPreview.claim.dept || '-' }}
{{ claimPreview.claim.empEmail }}
{{ claimPreview.claim.category }}
{{ claimPreview.claim.subCategory }}
{{ formatCurrency(claimPreview.claim.amount) }}
Payee: {{ claimPreview.claim.payeeName }}
Payee type: {{ claimPreview.claim.payeeType }}
Reference: {{ claimPreview.claim.payeeReference || '-' }}
Purpose: {{ claimPreview.claim.paymentPurpose }}
{{ claimPreview.claim.description }}
{{ step.label }}
Approved by {{ claimStageStamp(claimPreview.claim, step.role).approvedByName }}
{{ formatDateTime(claimStageStamp(claimPreview.claim, step.role).approvedAt) }}
Bypassed — skipped by Director
{{ claimPreview.claim.assignedToRole === step.role ? 'Current approver' : 'Workflow stage' }}
Approved by {{ claimPreview.claim.approvedByName }} ({{ claimPreview.claim.approvedByRole }}).
{{ claimPreview.claim.approvalPath }}
HR/Finance stages bypassed: {{ claimPreview.claim.bypassedReviews.join(', ') }}. No further review required.
{{ formatDateTime(claimPreview.claim.approvedAt) }}
Rejected by {{ claimPreview.claim.rejectedByName }} ({{ claimPreview.claim.rejectedByRole }}) on {{ formatDateTime(claimPreview.claim.rejectedAt) }}.
{{ claimPreview.claim.receiptAttachmentName || 'Attached receipt' }}
{{ claimPreview.claim.directorApprovalAttachmentName || 'Supporting document attached' }}
A supporting document is required before final approval. PNG, JPG or JPEG only; maximum 2MB.
Client Directory
Registered company and contact information.
Company
{{ clientView.client.clientName }}
SSM: {{ clientView.client.clientSSM }}
Contact Person
{{ clientView.client.clientContactPerson }}
Position
{{ clientView.client.clientPosition }}
{{ clientView.client.clientEmail }}
Phone
{{ clientView.client.clientPhone }}
Registered Address
{{ clientView.client.clientAddress }}
{{ clientView.client.clientPostcode }} {{ clientView.client.clientCity }}, {{ clientView.client.clientState }}
{{ clientView.client.clientCountry }}
Client Documents
All JPG, PNG and PDF files collected for this client, viewable by their Client Portal too.
Loading documents…
No documents uploaded yet
{{ item.fileName }}
{{ formatFileSize(item.fileSize) }} · Uploaded by {{ item.uploadedByName }} · {{ formatDateTime(item.uploadedAt) }}
{{ clientActionConfirm.client?.clientName }}
{{ clientActionConfirm.action === 'delete' ? 'This action removes the client record. Please confirm before continuing.' : 'You will be taken to Billing & Documents to update the client information.' }}
{{ appConfirm.message }}
HR Employee Management
Sensitive identifiers are protected and shown only as the final four digits.
Employee
{{ employeeView.employee.name }}
{{ employeeView.employee.empNo }} · {{ employeeView.employee.position }}
{{ employeeLastSeen(employeeViewLiveRecord) }}
Department
{{ employeeView.employee.dept }}
Employment
{{ employeeView.employee.employmentType }} · {{ employeeView.employee.status }}
Work Email
{{ employeeView.employee.email }}
Join Date
{{ employeeView.employee.joinDate }}
ID / Passport{{ employeeView.employee.ic }}
Bank Account{{ employeeView.employee.bankAcc }}
EPF / SOCSO{{ employeeView.employee.epfNo }} · {{ employeeView.employee.socsoNo }}
EIS / Tax PCB{{ employeeView.employee.eisNo }} · {{ employeeView.employee.taxNo }}
{{ employeeActionConfirm.employee?.name }} · {{ employeeActionConfirm.employee?.empNo }}
{{ employeeActionConfirm.action === 'delete' ? 'This action removes the employee record. Please confirm before continuing.' : 'Sensitive fields remain protected and require a full value when changed.' }}
Business Registration No.: {{ company.ssm }}
{{ company.address }}
Tel: {{ company.phone }} | Email: {{ company.email }} | Web: {{ company.website || 'www.zenq0r.com' }}
Ref No.: {{ docForm.docNo }}
Issue Date: {{ docForm.date }}
Valid Until: {{ docForm.dueDate }}
Payment Method: {{ docForm.paymentMethod || 'Bank Transfer' }}
{{ docForm.clientName }}
{{ docForm.clientSSM }} | Tel: {{ docForm.clientPhone }}
{{ docForm.clientAddress }}
{{ docForm.clientCity }} {{ docForm.clientPostcode }}, {{ docForm.clientState }}
Email: {{ docForm.clientEmail }}
{{ docForm.clientContactPerson || 'Procurement / Purchasing Dept.' }}
{{ docForm.clientPosition }}
Please quote this reference number when issuing an official Purchase Order (PO).
| No. | Description / Service | Qty | Unit Price (RM) | Total (RM) |
|---|---|---|---|---|
| {{ i + 1 }} | {{ it.desc }} | {{ it.qty }} | {{ Number(it.price).toFixed(2) }} | {{ (it.qty * it.price).toFixed(2) }} |
1. This quotation is valid for the duration stated above.
2. Prices are subject to change if additional specifications are requested.
3. Please cite the Quotation reference number when placing an official order.
| Bank Name: | {{ company.bankName }} |
| Account Name: | {{ company.name }} |
| Account No.: | {{ company.bankAccount }} |
Prepared By
Sales / Admin Dept.
Reviewed / Approved By
Company Stamp & Signature
Client Acceptance
Signature & Stamp
Business Registration No.: {{ company.ssm }}
{{ company.address }}
Tel: {{ company.phone }} | Email: {{ company.email }} | Web: {{ company.website || 'www.zenq0r.com' }}
Invoice No.: {{ docForm.docNo }}
Invoice Date: {{ docForm.date }}
Due Date: {{ docForm.dueDate }}
Payment Method: {{ docForm.paymentMethod || 'Bank Transfer' }} ({{ docForm.paymentBank }})
Receiver Account: {{ docForm.paymentReceiver }}
Payment Reference No.: {{ docForm.paymentRefNo }}
{{ docForm.clientName }}
{{ docForm.clientSSM }} | Tel: {{ docForm.clientPhone }}
{{ docForm.clientAddress }}
{{ docForm.clientCity }} {{ docForm.clientPostcode }}, {{ docForm.clientState }}
Email: {{ docForm.clientEmail }}
{{ docForm.clientContactPerson || 'Accounts & Finance Dept.' }}
Please state the invoice number ({{ docForm.docNo }}) on the payment transaction slip as proof of payment.
| No. | Description / Product | Qty | Unit Price (RM) | Total (RM) |
|---|---|---|---|---|
| {{ i + 1 }} | {{ it.desc }} | {{ it.qty }} | {{ Number(it.price).toFixed(2) }} | {{ (it.qty * it.price).toFixed(2) }} |
| Bank Name: | {{ company.bankName }} |
| Account Name: | {{ company.name }} |
| Account No.: | {{ company.bankAccount }} |
| DuitNow QR / UEN: | {{ company.ssm }} |
1. Goods or services sold are non-refundable.
2. Official receipts will be issued once payment clears.
Prepared By
Accounts & Finance Dept.
Approved By
Company Stamp & Signature
Client Acceptance
Signature & Stamp
Business Registration No.: {{ company.ssm }}
{{ company.address }} | Tel: {{ company.phone }} | Web: {{ company.website || 'www.zenq0r.com' }}
Month: {{ payForm.month }}
Payslip No.: PS-{{ currentYear }}-{{ payForm.empNo || 'ZEN-0000000' }}
Payment Date: {{ payForm.payDate }}
| Employee Name | {{ payForm.name }} | ID / Passport | {{ maskIC(payForm.ic) }} | Employee ID | {{ payForm.empNo }} |
|---|---|---|---|---|---|
| Position | {{ payForm.position }} | Department | {{ payForm.dept }} | Join Date | {{ payForm.joinDate }} |
| Bank / Account No. | {{ maskBank(payForm.bankAcc) }} | EPF / SOCSO No. | {{ maskEpfSocso(payForm.epfSocso) }} | ||
| EARNINGS | |
|---|---|
| Basic Salary | {{ formatCurrency(payForm.basic) }} |
| OT (Overtime) | {{ formatCurrency(payForm.ot) }} |
| Phone Allowance | {{ formatCurrency(payForm.phone) }} |
| Transport Allowance | {{ formatCurrency(payForm.transport) }} |
| Meal Allowance | {{ formatCurrency(payForm.meal) }} |
| Bonus / Commission | {{ formatCurrency(payForm.bonus) }} |
| GROSS SALARY | {{ formatCurrency(payCalc.gross) }} |
| EMPLOYEE DEDUCTIONS | |
|---|---|
| Employee EPF {{ payForm.isSenior ? '(0%)' : '(11%)' }} | {{ formatCurrency(payForm.dedEpf) }} |
| Employee SOCSO | {{ formatCurrency(payForm.dedSocso) }} |
| Employee EIS | {{ formatCurrency(payForm.dedEis) }} |
| MTD / PCB (Tax) | {{ formatCurrency(payForm.dedPcb) }} |
| Advance / Loan | {{ formatCurrency(payForm.dedAdvance) }} |
| TOTAL DEDUCTION | {{ formatCurrency(payCalc.deduct) }} |
| NET SALARY | {{ formatCurrency(payCalc.net) }} |
| Contribution Type | Employee | Employer |
|---|---|---|
| EPF | {{ formatCurrency(payForm.dedEpf) }} | {{ formatCurrency(payCalc.epfEmpr) }} |
| SOCSO | {{ formatCurrency(payForm.dedSocso) }} | {{ formatCurrency(payCalc.socsoEmpr) }} |
| EIS | {{ formatCurrency(payForm.dedEis) }} | {{ formatCurrency(payCalc.eisEmpr) }} |
| Contribution Type | Employee | Employer |
|---|---|---|
| EPF | {{ formatCurrency(payForm.dedEpf * payslipYtdMultiplier) }} | {{ formatCurrency(payCalc.epfEmpr * payslipYtdMultiplier) }} |
| SOCSO | {{ formatCurrency(payForm.dedSocso * payslipYtdMultiplier) }} | {{ formatCurrency(payCalc.socsoEmpr * payslipYtdMultiplier) }} |
| EIS | {{ formatCurrency(payForm.dedEis * payslipYtdMultiplier) }} | {{ formatCurrency(payCalc.eisEmpr * payslipYtdMultiplier) }} |

Approved {{ claimPrint.documentType === 'Payment Voucher' ? 'Payment Voucher' : 'Expense Claim' }} Record
{{ claimPrint.documentType === 'Payment Voucher' ? 'Voucher' : 'Receipt' }} Ref: {{ claimPrint.documentType === 'Payment Voucher' ? claimPrint.voucherNo : claimPrint.receiptNo }}
Printed: {{ formatDateTime(new Date().toISOString()) }}
{{ claimPrint.name }}
{{ claimPrint.empNo }} · {{ claimPrint.dept }}
{{ claimPrint.empEmail }}
Category: {{ claimPrint.category }}
Sub-category: {{ claimPrint.subCategory }}
{{ claimPrint.documentType === 'Payment Voucher' ? 'Payment date' : 'Expense date' }}: {{ claimPrint.documentType === 'Payment Voucher' ? claimPrint.paymentDate : claimPrint.expenseDate }}
{{ formatCurrency(claimPrint.amount) }}
Payee: {{ claimPrint.payeeName }}
Type: {{ claimPrint.payeeType }}
Reference: {{ claimPrint.payeeReference || '-' }}
Purpose: {{ claimPrint.paymentPurpose }}
{{ claimPrint.description }}
Approved by: {{ claimPrint.approvedByName }} ({{ claimPrint.approvedByRole }})
Approval path: {{ claimPrint.approvalPath || 'Director Final Approval' }}
Bypassed review: {{ claimPrint.bypassedReviews.join(', ') }}
Approval date & time: {{ formatDateTime(claimPrint.approvedAt) }}
{{ claimPrint.receiptAttachmentName || 'Attachment included' }}
No supported image attachment is available.
{{ claimPrint.directorApprovalAttachmentName || 'Attachment included' }}
No supported image attachment is available.
This is a computer-generated approved {{ claimPrint.documentType === 'Payment Voucher' ? 'payment voucher' : 'claim' }} record.