{{ notification.message }}
A new version of this portal is available.

Still there?

You've been inactive for a while. For your security, this session will sign out automatically in about 1 minute unless you stay active.

Sign out from the portal?

Are you sure you want to end this session? Any unsaved changes may be lost.

You have been signed out

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' }}

{{ onboardingMode === 'whatsnew' ? (latestChangelog?.title || "What's New") : `Hi ${userProfile.name}, glad to have you here!` }}

ZENQOR Logo

ZENQOR HRMS/CDTS

Dual System Human Resources Management System & Client Documents Tracking System

Malaysia's First Unified HR & Client Management System
ZENQOR Logo

{{ authView === 'client' ? 'Client Portal Sign In' : 'Staff & Management Sign In' }}

{{ authView === 'client' ? 'Access your official documents and live project tracker.' : 'Access payroll, billing, claims and HR modules.' }}

{{ loginError }}

Notifications

{{ n.message }}

{{ formatDateTime(n.timestamp) }}

No notifications yet.

Billing & Documents

Create and manage client quotations and invoices in a standard corporate format.

CLIENT INFORMATION (BILL TO)

{{ getInitials(docForm.clientName) }}

{{ 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' }}

Complete the required Client Information fields and click Save Client before adding items or saving the document.

LIST OF ITEMS & SERVICES

Description / Product Qty Unit Price (RM) Total (RM)
{{ formatCurrency(item.qty * item.price) }}
Subtotal:RM {{ docSubtotal.toFixed(2) }}
SST (8%):RM {{ docSST.toFixed(2) }}
Grand Total:RM {{ docGrandTotal.toFixed(2) }}

Payroll Management

Automated statutory contribution engine for EPF, SOCSO, EIS and PCB, with MTD/YTD tracking.

EMPLOYEE & BANKING INFORMATION

{{ getInitials(payForm.name) }}

{{ payForm.name || 'Untitled Employee' }}

{{ payForm.position || 'No position set' }}

{{ payForm.dept }}

{{ selectedPayEmployeeId ? 'From HR Directory' : 'Manual Entry' }}

Identity

Employment

Banking & Statutory

EARNINGS - RM

STATUTORY DEDUCTIONS - RM

Gross Salary:RM {{ payCalc.gross.toFixed(2) }}
Total Deductions:RM {{ payCalc.deduct.toFixed(2) }}
Net Salary:RM {{ payCalc.net.toFixed(2) }}

Claims & Payment Vouchers

Submit and track expense claims and payment vouchers through the approval workflow.

{{ legacyPaymentVouchersCount }} legacy Payment Voucher record(s) are still stored inside the Claims collection. Migrate them into the dedicated Payment Vouchers collection (requires firestore.rules to already be deployed).

NEW EXPENSE CLAIM APPLICATION

{{ getInitials(claimForm.name) }}

{{ claimForm.name || 'Untitled Applicant' }}

{{ claimForm.dept || 'No department set' }}

{{ selectedClaimEmployeeId ? 'From HR Directory' : 'Manual Entry' }}

Applicant Information

ASSIGN TO HR APPROVER *

Human Resource Management

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' }}

NEW PAYMENT VOUCHER APPLICATION

{{ getInitials(voucherForm.name) }}

{{ voucherForm.name || 'Untitled Requester' }}

{{ voucherForm.dept || 'No department set' }}

{{ selectedVoucherEmployeeId ? 'From HR Directory' : 'Manual Entry' }}

Requester Information

ASSIGN TO HR APPROVER *

Human Resource Management

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' }}

CLAIM RECORDS & APPROVAL STATUS

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.
Page {{ claimsCurrentPage }} of {{ claimsTotalPages }}

PAYMENT VOUCHER RECORDS & APPROVAL STATUS

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.
Page {{ vouchersCurrentPage }} of {{ vouchersTotalPages }}

Project Progress

Live project workflow overview.

My Assigned Project Activities

Activities requiring your action, ordered by due date.

OverdueTodayNext 3 DaysScheduled{{ myPendingProjectActivities.length }} Open

{{ activity.projectRef }} · {{ activity.activityType }}

{{ activity.summary }}

Due {{ activity.dueDate }}

{{ projectActivityDueState(activity).label }}

{{ activity.projectTitle }}

Staff Employee Dashboard

Welcome, {{ userProfile.name }}. View your latest payslips and expense claim status.

Latest Net Salary

{{ formatCurrency(myLatestNetSalary) }}

Last Generated Payslip

Pending Claims

{{ myPendingClaimsCount }}

Status: Pending

Approved Claims (YTD)

{{ formatCurrency(myApprovedClaimsAmount) }}

Status: Approved

My Claims & Payslip History

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

Welcome back, {{ userProfile.name }}

Here's a snapshot of your projects and official documents today.

Total Documents

{{ myClientDocs.length }}

Quotations & Invoices

Unpaid Invoices

{{ formatCurrency(myUnpaidInvoicesAmount) }}

{{ myUnpaidInvoicesCount }} Invois Unpaid

Total Paid Amount

{{ formatCurrency(myPaidInvoicesAmount) }}

Status: Paid

Project Progress

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.

Your Company Official Documents

Date Type Document No. Amount (RM) Status Action
{{ d.date }} {{ d.type }} {{ d.docNo }} {{ formatCurrency(d.amount) }} {{ d.status || 'Unpaid' }}

Enterprise Executive Dashboard

Real-time monitoring of financial KPIs, HR, corporate documents, and system activities.

Live data

{{ employees.length }}

Total Employees

{{ activeEmployeesCount }} Active

{{ customers.length }}

Total Clients

{{ priorityClients.length }} Priority

{{ totalQuotations }}

Total Quotations

{{ formatCurrency(totalQuotationValue) }}

{{ totalInvoices }}

Total Invoices

{{ paidInvoicesCount }} Paid / {{ unpaidInvoicesCount }} Unpaid

{{ formatCurrency(totalRevenuePaid) }}

Revenue (Paid)

Collected Inflow

{{ formatCurrency(totalRevenuePending) }}

Pending Receivables

{{ unpaidInvoicesCount }} Invoices Unpaid

{{ formatCurrency(totalPayrollNet) }}

Total Payroll (Net)

{{ payslipHistory.length }} Payslips Generated

{{ formatCurrency(totalApprovedClaimsAmount) }}

Claims & Vouchers (Approved)

{{ pendingClaimsCount }} Pending Approval

Priority Clients{{ priorityClients.length }}

Staff Workload Across Clients{{ overloadedEmployeeCount }} Overloaded

Active project and activity assignments per staff member — a view only possible because HR and Client records share one system.

Financial & Revenue Trend

Document & Invoice Status Distribution

Claims & Payment Voucher Pipeline

{{ claimsPipelineTotal }} total record{{ claimsPipelineTotal === 1 ? '' : 's' }}
{{ stage.label }}
{{ stage.count }} {{ stage.pct }}%
Finance notification: {{ financePendingClaims.length }} claim(s) and/or payment voucher(s) are pending Finance approval.

Recent Activities & Document List

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.' }}

Page {{ currentPage }} of {{ totalPages }}

Client Directory

Maintain client company records used across quotations and invoices.

REGISTERED CLIENT DIRECTORY

Total Clients: {{ customers.length }}
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.

Employee Management

Maintain employee profiles, statutory contributions, and employment records.

REGISTERED EMPLOYEE DIRECTORY

Total Employees: {{ employees.length }}
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
{{ getInitials(emp.name) }}
{{ 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.

Enterprise Reports & Data Export

Export financial, employee, and document reports to CSV/Excel.

Payroll Report

Employee Directory

Invoice & Quotation Report

Cross-Domain Insights

Combined HR + Client analytics — unique to a unified HRMS/CDTS platform.

Top Clients by Revenue

{{ r.clientName }} {{ formatCurrency(r.revenue) }}

No paid invoices yet.

Staff Engaged per Client

{{ s.clientName }} {{ s.staffCount }} staff

No project assignments yet.

Delivery Velocity

{{ avgActiveProjectAgeDays }}days

Average age of active projects still in progress.

{{ overloadedEmployeeCount }}staff

Currently overloaded across client work (4+ active items).

{{ userProfile.role === 'Client' ? 'My Project Tracker' : 'Project Activities' }}

{{ userProfile.role === 'Client' ? 'Follow your project progress across five workflow stages, in real time.' : 'Real-time project progress across five controlled workflow stages.' }}

{{ project.projectRef }}

{{ project.title }}

{{ project.targetDate || 'Not scheduled' }}
{{ project.ownerName || 'ZENQOR Team' }}

No project has been assigned to your account yet.

{{ stage }}

{{ getProjectsByStage(stage).length }}
New Client {{ clientTierMeta(clientTierForId(group.clientDirectoryId)).label }}
{{ project.projectRef }} {{ projectTargetDateState(project).label }}

No project in this stage

Reference / ProjectClientPerson In ChargeTarget DateWorkflow StatusActions

{{ 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 }}

{{ projectPreview.project.title }}

Project Information

Client

Schedule

Start: {{ projectPreview.project.startDate || '—' }}

Target: {{ projectPreview.project.targetDate || '—' }}

Person In Charge

{{ getInitials(projectPreview.project.ownerName) }}

{{ projectPreview.project.ownerName || '—' }}

{{ projectPreview.project.ownerPosition || 'NO POSITION' }}

{{ projectPreview.project.ownerEmpNo }} · {{ projectPreview.project.ownerEmail }}

Assigned {{ formatDateTime(projectPreview.project.ownerAssignedAt) }} · {{ projectPicPresenceDetail(projectPreview.project) }}

Project Description

{{ projectPreview.project.description || 'No project description provided.' }}

Client Documents

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) }}

Activity Issues

Scheduled actions, assignees and due dates for this project.

{{ activity.activityType }}{{ projectActivityDueState(activity).label }}

{{ activity.summary }}

{{ activity.details }}

{{ activity.assignedName }} · {{ activity.assignedPosition || 'NO POSITION' }}

Due Date

{{ activity.dueDate }}

No activity issue scheduled

Client Activity History

Two-way conversation between your team and the client for this project.

{{ update.senderName }} · {{ update.senderPosition || 'STAFF' }}
{{ formatDateTime(update.createdAt) }}· edited

No Client update has been shared

{{ activityModal.project.projectRef }}

{{ activityModal.isEdit ? 'Edit Project Activity' : 'Schedule Project Activity' }}

{{ activityModal.project.title }}

{{ clientUpdateModal.project.projectRef }}

{{ clientUpdateModal.isEdit ? 'Edit Client Update' : 'Send Client Update' }}

This message will appear in the Client Activity History.

Project Activities

{{ projectModal.isEdit ? 'Update Project' : 'Add New Project' }}

As the assigned Person In Charge, you can update the workflow stage, schedule and description below. Reference, title, client and PIC linkage can only be changed by Director or Superadmin.

Project Identity

Client & Person In Charge

Workflow & Schedule

Client Self-Service Portal

Dedicated self-service portal for clients to view documents and payment status.

{{ getInitials(myClientRecord?.clientName || userProfile.name) }}

{{ myClientRecord?.clientName || userProfile.name }}

{{ myClientRecord?.clientSSM || 'SSM not on file' }}

{{ clientTierMeta(myClientRecord.clientTier).label }}

Total Documents

{{ clientPortalDocs.length }}

Paid Invoices

{{ myClientPaidCount }}

Unpaid Invoices

{{ myClientUnpaidCount }}

Active Projects

{{ projects.filter(p => p.status !== 'Completed & Done').length }}

Your Project Progress

Showing {{ filteredClientPortalDocs.length }} of {{ clientPortalDocs.length }} document(s)
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' }}

System Audit & Security Logs

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 }})

{{ currentTab === 'settings' ? 'Global Company Settings' : 'Admin Profile & Portal Access Management' }}

Read-only

{{ claimPreview.claim.documentType === 'Payment Voucher' ? 'Payment Voucher' : 'Claim' }} Record Preview

{{ 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.status }}

{{ claimPreview.claim.documentType === 'Payment Voucher' ? 'Requested By' : 'Applicant' }}

{{ claimPreview.claim.name }}

{{ claimPreview.claim.empNo }} · {{ claimPreview.claim.dept || '-' }}

{{ claimPreview.claim.empEmail }}

{{ claimPreview.claim.documentType === 'Payment Voucher' ? 'Payment Details' : 'Expense Details' }}

{{ claimPreview.claim.category }}

{{ claimPreview.claim.subCategory }}

{{ formatCurrency(claimPreview.claim.amount) }}

Payment Recipient

Payee: {{ claimPreview.claim.payeeName }}

Payee type: {{ claimPreview.claim.payeeType }}

Reference: {{ claimPreview.claim.payeeReference || '-' }}

Purpose: {{ claimPreview.claim.paymentPurpose }}

{{ claimPreview.claim.documentType === 'Payment Voucher' ? 'Payment Description' : 'Expense Description' }}

{{ claimPreview.claim.description }}

Approval Workflow

{{ step.label }}

{{ 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.documentType === 'Payment Voucher' ? 'Supporting Document' : 'Receipt Attachment' }}

{{ claimPreview.claim.receiptAttachmentName || 'Attached receipt' }}

Claim receipt preview

Director Approval Document

{{ claimPreview.claim.directorApprovalAttachmentName || 'Supporting document attached' }}

Director approval document preview

Director Approval Document *

A supporting document is required before final approval. PNG, JPG or JPEG only; maximum 2MB.

{{ claimPreview.directorApprovalAttachmentName || 'No document selected' }}
{{ attachmentPreview.label }}
Read-only PDF Preview

Client Directory

Client Information

Registered company and contact information.

Company

{{ clientView.client.clientName }}

SSM: {{ clientView.client.clientSSM }}

New Client Returning · {{ clientProjectCount(clientView.client.id) }} Project{{ clientProjectCount(clientView.client.id) === 1 ? '' : 's' }} {{ clientTierMeta(clientView.client.clientTier).label }} {{ clientHealthScore(clientView.client).label }} · {{ clientHealthScore(clientView.client).score }}
Set Tier:

Contact Person

{{ clientView.client.clientContactPerson }}

Position

{{ clientView.client.clientPosition }}

Email

{{ 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.action === 'delete' ? 'Delete client record?' : 'Edit client record?' }}

{{ 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.title }}

{{ appConfirm.message }}

HR Employee Management

Employee Information

Sensitive identifiers are protected and shown only as the final four digits.

Employee

{{ employeeView.employee.name }}

{{ employeeView.employee.empNo }} · {{ employeeView.employee.position }}

{{ employeePresenceLabel(employeeViewLiveRecord) }}

{{ employeeLastSeen(employeeViewLiveRecord) }}

Department

{{ employeeView.employee.dept }}

Employment

{{ employeeView.employee.employmentType }} · {{ employeeView.employee.status }}

Work Email

{{ employeeView.employee.email }}

Join Date

{{ employeeView.employee.joinDate }}

Protected information

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.action === 'delete' ? 'Delete employee record?' : 'Edit employee record?' }}

{{ 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.' }}

{{ employeeModal.isEdit ? 'Update Employee: ' + employeeModal.form.empNo : 'Add New Employee' }}

Basic Information

Core employment and department details.

Advanced Information

Identity, statutory, banking and payroll details.

Sensitive values are masked. Leave a field blank to keep it unchanged, or enter the complete new value to replace it.

{{ userModal.isEdit ? 'Update Portal Access' : 'Add Portal Access' }}

Gmail and other external email domains are allowed for Client Users System Terminal.

This role must use the official company domain (@zenq0r.com).

Generated automatically and locked. The user must change it after first sign-in.

Kemaskini Kata Laluan Akaun

{{ changePasswordModal.error }}