Directory

{{ staffDirectoryTab === 'staff' ? staffDirectoryList.length : clientDirectoryList.length }} {{ staffDirectoryTab === 'staff' ? 'staff' : 'clients' }}

Notifications

{{ n.message }}

{{ formatDateTime(n.timestamp) }}

No notifications yet

You'll see updates here as they happen.

Quotation & Invoice

Prepare and manage quotation or invoice records for registered clients.

Bill To

Choose a registered client. Client details are managed in Client Information.

{{ docForm.clientName }}{{ docForm.clientId || docForm.clientSSM || 'Registered client' }}{{ docForm.clientEmail }}

ATTACHMENT / RECEIPT (MAX 2MB)

{{ docForm.paymentAttachment ? 'Receipt Attached' : 'No file selected' }}

Select a registered client before adding items or saving this document. Use Client Information to register or update a client.

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

The actual date the money will be used/paid out — editable, not locked to today.

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

{{ selectedClaimIds.length }} claim(s) selected
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.' }}

Page {{ claimsCurrentPage }} of {{ claimsTotalPages }}

PAYMENT VOUCHER RECORDS & APPROVAL STATUS

{{ selectedVoucherIds.length }} voucher(s) selected
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.' }}

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.

{{ formatCurrency(myLatestNetSalary) }}

Latest Net Salary

Last Generated Payslip

{{ myPendingClaimsCount }}

Pending Claims

Status: Pending

{{ formatCurrency(myApprovedClaimsAmount) }}

Approved Claims (YTD)

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

No records yet

Your claims, payment vouchers and payslips will appear here once submitted or issued.

Client Portal

Secure Workspace

Welcome back, {{ userProfile.name }}

Here's your live project, document and account snapshot.

{{ myClientDocs.length }}

Total Documents

Quotations & Invoices

{{ formatCurrency(myUnpaidInvoicesAmount) }}

Unpaid Invoices

{{ myUnpaidInvoicesCount }} Invois Unpaid

{{ formatCurrency(myPaidInvoicesAmount) }}

Total Paid Amount

Status: Paid

{{ clientActiveProjectsCount }}

Active Projects

{{ projects.length }} total project(s)

Project Updates & Messages

Updates and conversation messages from your project activities.

{{ clientRecentUpdates.length }} recent

No updates yet

Project updates will appear here once your project starts.

Your workspace is protected

Secure sign-in, email verification and role-based access help protect your company records.

Identity verified

Private company workspace

Activity securely logged

Project Progress

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.

01 · COMPLETE

Portal account activated

02 · NEXT

Project assignment

03 · UPCOMING

Live milestones & updates

Your Company Official Documents

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.

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

{{ periodQuotationCount }}

Quotations ({{ currentPeriodLabel }})

{{ formatCurrency(totalQuotationValue) }}

{{ periodInvoiceCount }}

Invoices ({{ currentPeriodLabel }})

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

{{ formatCurrency(periodRevenuePaid) }}

Revenue Collected ({{ currentPeriodLabel }})

Collected Inflow

{{ formatCurrency(totalRevenuePending) }}

Pending Receivables (all periods)

{{ unpaidInvoicesCount }} Invoices Unpaid

{{ formatCurrency(periodPayrollNet) }}

Payroll Net ({{ currentPeriodLabel }})

{{ payslipHistory.length }} Payslips Generated

{{ formatCurrency(periodApprovedClaimsAmount) }}

Claims Approved ({{ currentPeriodLabel }})

{{ pendingClaimsCount }} Pending Approval

Priority Clients{{ priorityClients.length }}

Priority Clients

No Priority-tier clients yet

Clients set to the Priority tier in the Client Directory will appear here.

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.

Staff Workload Across Clients

No active workload right now

Staff members with active project or activity assignments will appear here.

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 matching activities' : 'No activity yet' }}

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

Client Registration

Register and maintain client company records used across projects, 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.clientId }} {{ cust.companyType }} {{ cust.clientPosition }}
New {{ clientTierMeta(cust.clientTier).label }} {{ clientHealthScore(cust).label }}
{{ cust.clientContactPerson || '-' }} {{ cust.clientPhone }} {{ cust.clientEmail }} {{ formattedClientAddress(cust) || '—' }}

No clients yet

Register your first client here before creating projects, quotations or invoices.

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 yet

Add your first employee to begin managing profiles, statutory contributions and payroll.

Enterprise Reports & Data Export

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

Exports below cover {{ reportPeriod ? periodLabel(reportPeriod) : 'all periods' }}.
Employee Directory always exports the full directory.

Payroll Report

Employee Directory

Invoice & Quotation Report

Claims & Payment Vouchers

Monthly Packages

Each completed month is packaged automatically. Records are never deleted — only summarised.

{{ monthlyArchivesSorted.length }} closed period(s)

Current period — still open

{{ currentPeriodLabel }}

Collected
{{ formatCurrency(periodRevenuePaid) }}
Payroll (Net)
{{ formatCurrency(periodPayrollNet) }}
Claims Approved
{{ formatCurrency(periodApprovedClaimsAmount) }}
Invoices Issued
{{ periodInvoiceCount }}
Period Collected Payroll (Net) Claims & Vouchers Records Actions
{{ pkg.label || periodLabel(pkg.period || pkg.id) }} Closed {{ String(pkg.closedAt).slice(0, 10) }} {{ formatCurrency(pkg.revenueCollected || 0) }} {{ formatCurrency(pkg.payrollNet || 0) }} {{ formatCurrency((pkg.claimApprovedTotal || 0) + (pkg.voucherApprovedTotal || 0)) }} {{ pkg.recordCount || 0 }}

No month has closed yet. The first completed month is packaged automatically once someone signs in during the following month.

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 — client revenue will rank here once invoices are paid.

Staff Engaged per Client

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

No project assignments yet — staff engagement will rank here once projects are assigned.

Delivery Velocity

{{ avgActiveProjectAgeDays }}days

Average age of active projects still in progress.

{{ overloadedEmployeeCount }}staff

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

Client Task

{{ canManageProjects ? 'Client Task is the parent of every Project Activity and is grouped live by project status. Registering a client alone does not add it here; the first project creates its Client Task automatically. Click a company to view its projects; deleting a Client Task also deletes all of its projects.' : 'Click a company to open its Project Activities. You see the projects you run as Person In Charge and those with an activity assigned to you.' }}

{{ clientTaskStatusMeta(group.key).label }}

{{ group.clients.length }}
{{ cust.clientName }} {{ clientTaskStatusMeta(clientTaskStatus(cust.id)).label }}

{{ cust.clientId }}

SSM: {{ cust.clientSSM }}

{{ cust.clientContactPerson }}

{{ cust.clientEmail }}

{{ clientTaskDateLabel(cust) }}

PIC: {{ clientLatestProjectPic(cust.id) || 'Not assigned yet' }} {{ clientProjectCount(cust.id) }} proj

No {{ group.key }} clients yet

{{ userProfile.role === 'Client' ? 'My Project Tracker' : (canManageProjects ? 'Project Activities' : 'My Assigned Project Activities') }}

{{ userProfile.role === 'Client' ? 'Follow your project progress across five workflow stages, in real time.' : (canManageProjects ? 'Real-time project progress across five controlled workflow stages.' : 'Projects you run as Person In Charge, plus projects with an activity assigned to you.') }}

PIC & Assigned To Me
{{ boardClientFilter ? boardClientFilter.name : 'All Projects' }} Project Activities
{{ project.projectRef }}

{{ project.title }}

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

No projects assigned yet

Projects assigned to your account will appear here with real-time progress.

{{ stage }}

{{ getProjectsByStage(stage).length }}

No projects here

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

{{ 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' ? 'Documents & Billing' : currentTab === 'client-updates' ? 'Project Updates' : 'Help & Support' }}

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

Client WorkspaceSecure & Live

Welcome, {{ clientPortalIdentity.clientName }}

Everything for your projects, official documents and payment progress is gathered here in one secure workspace.

{{ getInitials(clientPortalIdentity.clientName) }}

{{ clientPortalIdentity.clientName }}

{{ clientPortalIdentity.clientSSM || 'Business profile pending' }}

{{ clientTierMeta(clientPortalIdentity.clientTier).label }} Client

{{ clientPortalIdentity.clientEmail }}

Protected client access

Documents

{{ clientPortalDocs.length }}

Official files available

Paid

{{ myClientPaidCount }}

Invoices completed

Action Needed

{{ myClientUnpaidCount }}

Unpaid invoices

Active Projects

{{ clientActiveProjectsCount }}

Currently in progress

Your Project 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.

Most Important

Current Project Status

Live status for every project linked to your Client Portal account.

{{ project.projectRef || 'Project' }}

{{ project.title || 'Project activity' }}

{{ project.status || 'Project Planning' }}

Latest Project Update

{{ project.latestProjectEvent?.message || 'Current project status is shown above.' }}

{{ formatDateTime(project.latestProjectEvent?.createdAt || project.updatedAt || project.createdAt) }}

No project status yet

A live status will appear when a project is linked to your account.

Project Updates & Conversation History

Messages shared by your project team and your own replies are kept separately from the current status.

{{ update.projectRef || 'Project activity' }}

{{ update.updateType || 'Project Update' }}

{{ update.projectTitle || 'Project activity' }}

{{ update.message || 'A new message is available for your project.' }}

{{ update.senderRole === 'Client' ? 'You' : (update.senderName || 'Project team') }} · {{ formatDateTime(update.createdAt || update.updateDate) }}

No conversation yet

Project messages and your replies will appear here.

How can we help?

Choose the most suitable channel below. For project-specific questions, open My Projects so your message stays connected to the correct project history.

Email Support

Send a general account, document or billing enquiry.

{{ company.email || supportEmail }}

Call Our Team

For urgent assistance during normal business hours.

{{ company.phone }}

Before contacting support

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.

Documents & Billing

Review and print your official quotations and invoices.

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

Website Content

Manage what's shown on zenqor-tech / www.zenqor.com.my — changes go live immediately. Restricted to Superadmin, Director and IT.

System Audit & Security Logs

Real-time user security and activity logs from Firebase.

Automatic Audit Log Retention

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.

System Configuration

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

Manage the company details used across invoices, quotations and official records.

Live document defaults

Company identity

Official company profile

These details appear on official quotations, invoices and payment documents.

Document source

Registered address

Company address details

Enter the registered address exactly as it should appear in documents.

City and state are suggested automatically after a valid Malaysian postcode is entered.

Contact details

Public contact information

Banking & payment

Payment destination

Shown on quotation and invoice payment instructions.

Only authorised users can change global settings.

Client Information

Register new client records or update one selected client without affecting other records.

Client Registration

{{ clientInformationModal.isEdit ? 'Update Client Information' : 'Client Information' }}

{{ clientInformationModal.isEdit ? 'Only this selected client record will be updated.' : 'Save to create the client’s permanent Client ID.' }}

New{{ clientInformationModal.form.clientId }}

Company profile

Primary contact

Registered address

Internal notes (optional)