{{ activity.projectRef }} · {{ activity.activityType }}
{{ activity.summary }}
Due {{ activity.dueDate }}
{{ activity.projectTitle }}
ZENQOR Technologies
Preparing your secure workspace
Verifying your reset link…
Your password has been reset successfully. You can now sign in with your new password.
{{ passwordResetFlow.error }}
{{ passwordResetFlow.email }}
Enter the email linked to your account and we'll send you a link to reset your password.
If an account exists for {{ forgotPasswordFlow.email }}, a reset link is on its way.
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.' }}
All portal accounts require a second verification step. {{ loginOtp.sending ? 'Sending a code to' : 'We sent a 6-digit code to' }} {{ loginOtp.email }}.
{{ n.message }}
{{ formatDateTime(n.timestamp) }}
No notifications yet
You'll see updates here as they happen.
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
Client Portal Access
Comma-separated. Anyone signing in with these emails can also access this client's Client Portal, projects and documents — in addition to the primary Email Address above.
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
The actual date the money will be used/paid out — editable, not locked to today.
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 }} | {{ requesterNameLive(clm.empNo, clm.name) }} {{ clm.empNo }} | {{ clm.category }} {{ clm.subCategory }} | {{ formatCurrency(clm.amount) }} |
{{ clm.status }}
Approved by {{ approverNameLive(clm.approvedByUid, clm.approvedByName) }} ({{ clm.approvedByRole }}) {{ formatDateTime(clm.approvedAt) }} |
{{ clm.assignedToName || '-' }} {{ clm.assignedToRole || '-' }} |
|
|
|
{{ claimsHistory.length ? 'No matching claim records' : 'No expense claims yet' }} {{ claimsHistory.length ? 'No claims match your current search.' : 'Submitted expense claims will appear here for review and approval.' }} |
|||||||
| 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 {{ requesterNameLive(pv.empNo, pv.name) }} | {{ pv.category }} {{ pv.subCategory }} | {{ formatCurrency(pv.amount) }} |
{{ pv.status }}
Approved by {{ approverNameLive(pv.approvedByUid, pv.approvedByName) }} ({{ pv.approvedByRole }}) {{ formatDateTime(pv.approvedAt) }} |
{{ pv.assignedToName || '-' }} {{ pv.assignedToRole || '-' }} |
|
|
|
{{ paymentVouchers.length ? 'No matching voucher records' : 'No payment vouchers yet' }} {{ paymentVouchers.length ? 'No payment vouchers match your current search.' : 'Payment vouchers will appear here for review and approval.' }} |
|||||||
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 |
|
No records yet Your claims, payment vouchers and payslips will appear here once submitted or issued. |
||||
Client Portal
Secure WorkspaceHere's your live project, document and account snapshot.
Total Documents
Quotations & Invoices
Unpaid Invoices
{{ myUnpaidInvoicesCount }} Invois Unpaid
Total Paid Amount
Status: Paid
Active Projects
{{ projects.length }} total project(s)
Latest messages from your project team.
No updates yet
Project updates will appear here once your project starts.
Secure sign-in, trusted-device verification and role-based access help protect your company records.
Identity verified
Private company workspace
Activity securely logged
Live workflow status for projects assigned to your Client Portal account.
+{{ projects.length - 3 }} more project(s) — view all for full tracker
Your workspace is ready
Your project tracker will activate automatically when the Zenqor team assigns your first project.
Portal account activated
Project assignment
Live milestones & updates
Your five most recent quotations and invoices.
| Date | Type | Document No. | Amount (RM) | Status | Action |
|---|---|---|---|---|---|
| {{ d.date }} | {{ d.type }} | {{ d.docNo }} | {{ formatCurrency(d.amount) }} | {{ d.status || 'Unpaid' }} | |
|
No official documents yet Quotations and invoices issued to your company will appear here automatically. |
|||||
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
No Priority-tier clients yet
Clients set to the Priority tier in the Client Directory will appear here.
Active project and activity assignments per staff member — a view only possible because HR and Client records share one system.
No active workload right now
Staff members with active project or activity assignments will appear here.
| 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 matching activities' : 'No activity yet' }} No records match your activity filters and your search for "{{ searchQuery }}". No records match your current activity filters. No records match your search for "{{ searchQuery }}". Clear it from the search bar above. Activity across documents, payroll, claims and vouchers will appear here. |
||||||
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 }} | {{ formattedClientAddress(cust) || '—' }} |
|
|
No clients yet Client records are created automatically the first time you generate a quotation or invoice for them. |
||||
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 yet Add your first employee to begin managing profiles, statutory contributions and payroll. |
|||||
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 — client revenue will rank here once invoices are paid.
Staff Engaged per Client
No project assignments yet — staff engagement will rank here once projects are assigned.
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 projects assigned yet
Projects assigned to your account will appear here with real-time progress.
No projects here
| 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 }} | |
|
{{ projects.length ? 'No matching projects' : 'No projects yet' }} {{ projects.length ? 'No projects match your current scope or search.' : 'Projects will appear here once they are created.' }} |
|||||
Client Workspace
{{ currentTab === 'client-documents' ? 'Manage your quotations, invoices and payment records.' : currentTab === 'client-updates' ? 'Follow the latest information shared by your project team.' : 'Get assistance and contact the ZENQOR support team.' }}
Everything for your projects, official documents and payment progress is gathered here in one secure workspace.
{{ clientPortalIdentity.clientName }}
{{ clientPortalIdentity.clientSSM || 'Business profile pending' }}
{{ clientTierMeta(clientPortalIdentity.clientTier).label }} Client{{ clientPortalIdentity.clientEmail }}
Protected client access
{{ clientPortalDocs.length }}
Official files available
{{ myClientPaidCount }}
Invoices completed
{{ myClientUnpaidCount }}
Unpaid invoices
{{ clientActiveProjectsCount }}
Currently in progress
Your next project will appear here
Once our team assigns a project to your account, you can follow every milestone and update in real time.
Latest information shared by your project team.
{{ update.title || update.status || 'Project update' }}
{{ update.message || update.details || 'A new update is available for your project.' }}
{{ formatDateTime(update.createdAt || update.updateDate) }}
All caught up
New project updates will be shown here automatically.
Choose the most suitable channel below. For project-specific questions, open My Projects so your message stays connected to the correct project history.
Send a general account, document or billing enquiry.
{{ company.email || 'admin@zenq0r.com' }}For urgent assistance during normal business hours.
{{ company.phone }}Include reference number
Provide the project or document number.
Describe the issue
Explain what happened and the expected result.
Attach evidence
Include a screenshot when relevant.
Review and print your official quotations and invoices.
| Type | Document No. | Date | Amount (RM) | Status | Actions |
|---|---|---|---|---|---|
|
{{ clientPortalDocs.length ? 'No documents match this filter' : 'Your document centre is ready' }} {{ clientPortalDocs.length ? 'Choose another type or payment status to see more records.' : 'Official quotations and invoices will appear here automatically when issued by our team.' }} |
|||||
| {{ d.type }} | {{ d.docNo }} | {{ d.date }} | {{ formatCurrency(d.amount) }} | {{ d.status || 'Unpaid' }} | |
{{ userProfile.role === 'Client' ? 'My Workspace' : 'Operation Center' }}
Fill in, sign and finalize your Authorization Letter, Client Information Form, NDA and Service Agreement online.
Loading documents…
{{ signedDocuments.error }}
{{ userProfile.role !== 'Client' && signedDocuments.items.length ? 'No matching documents' : 'No documents yet' }}
{{ userProfile.role !== 'Client' && signedDocuments.items.length ? 'No documents match your client or status filter.' : 'Signed documents will appear here once created.' }}
{{ documentTemplates[d.templateId] ? documentTemplates[d.templateId].label.en : d.templateId }}
{{ d.clientName }} · {{ d.referenceNo }} · Updated {{ formatDateTime(d.updatedAt) }}
Manage what's shown on zenqor-tech / www.zenqor.com.my — changes go live immediately. Restricted to Superadmin, Director and IT.
Once this list has at least one item, the public page shows ONLY these items — its built-in sample content is fully replaced, not merged.
No items published yet
The public page is currently showing its built-in sample content for {{ websiteContentLabel(websiteContentTab) }}.
{{ [item.companyName, item.eventDate].filter(Boolean).join(' · ') }}
No Company Name set yet
{{ item.desc }}
This overrides copy on ANY zenqor-tech page (Home, About, Contact, Legal, FAQ, etc). Leave a field un-overridden and the site keeps its built-in default text.
{{ row.key }}
EN: {{ row.override.en || '—' }}
MS: {{ row.override.ms || '—' }}
No matching text fields
Try a different section or search term.
Real-time user security and activity logs from Firebase.
Available only to Director, Superadmin and IT. Expired records are removed automatically by Firestore TTL.
{{ auditRetention.message }}
{{ auditRetention.error }}
| Timestamp | User | Action | Activity / Target | IP & Browser |
|---|---|---|---|---|
| {{ new Date(log.timestamp).toLocaleString('en-MY') }} | {{ log.userName || log.user }}{{ log.user }}{{ log.role }} | {{ log.action }} | {{ log.details }}Module: {{ log.module }}UID: {{ log.uid }} | {{ log.ip || 'Unavailable' }}{{ log.browser || 'Unknown Browser' }}{{ log.os || 'Unknown OS' }} · {{ log.device || 'Unknown Device' }}{{ log.userAgent || log.browser }} |
|
No audit events yet Security and compliance events will be recorded here automatically as they happen. |
||||
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 yet — new releases will be listed here as they're published.
| Username | Sign-In Email | Role | Actions |
|---|---|---|---|
| {{ usr.name }} | {{ usr.email }} | {{ getRoleDisplayName(usr.role) }} |
Protected Seed Account
|
|
No portal accounts yet Grant portal access to give someone a login for this system. |
|||
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' }}: {{ formatDateWithDay(claimPreview.claim.documentType === 'Payment Voucher' ? claimPreview.claim.paymentDate : claimPreview.claim.expenseDate) }}
Submitted: {{ formatDateTimeWithDay(claimPreview.claim.createdAt) }}
{{ requesterNameLive(claimPreview.claim.empNo, claimPreview.claim.name) }}
{{ claimPreview.claim.empNo }} · {{ requesterDeptLive(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 {{ approverNameLive(claimStageStamp(claimPreview.claim, step.role).approvedByUid, 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 {{ approverNameLive(claimPreview.claim.approvedByUid, 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 {{ approverNameLive(claimPreview.claim.rejectedByUid, 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.
Business Registration No.: {{ company.ssm }}
{{ formattedCompanyAddress() }}
Tel: {{ company.phone }} | Email: {{ company.email }} | Web: {{ company.website || 'www.zenqor.com.my' }}
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 }}
{{ formattedClientAddress(docForm) }}
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 }}
{{ formattedCompanyAddress() }}
Tel: {{ company.phone }} | Email: {{ company.email }} | Web: {{ company.website || 'www.zenqor.com.my' }}
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 }}
{{ formattedClientAddress(docForm) }}
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 }}
{{ formattedCompanyAddress() }}
Tel: {{ company.phone }} | Web: {{ company.website || 'www.zenqor.com.my' }}
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' }}: {{ formatDateWithDay(claimPrint.documentType === 'Payment Voucher' ? claimPrint.paymentDate : claimPrint.expenseDate) }}
Submitted: {{ formatDateTimeWithDay(claimPrint.createdAt) }}
{{ 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.