{{ activity.projectRef }} · {{ activity.activityType }}
{{ activity.summary }}
Due {{ activity.dueDate }}
{{ activity.projectTitle }}
ZENQOR Technologies
Preparing your secure workspace
Verifying your secure link…
{{ passwordResetFlow.successDescription }}
{{ passwordResetFlow.error }}
{{ passwordResetFlow.mode === 'firstLogin' ? 'Set your permanent password to continue securely.' : (passwordResetFlow.otpVerified ? 'Your email is verified. Set a new password to regain secure access.' : 'Verify the code sent to your email before setting a new password.') }}
{{ loginOtp.sending ? 'Sending a 6-digit code to' : 'Enter the 6-digit code sent to' }} {{ loginOtp.email }}.
Confirm {{ passwordResetFlow.email }} to complete your Zenqor Portal account setup.
Restore {{ passwordResetFlow.previousEmail || passwordResetFlow.email }} for your Zenqor Portal account.
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.' }}
{{ emp.name }}
{{ emp.position || 'No position' }} · {{ emp.dept }}
No staff on record
{{ cu.name || cu.email }}
{{ cu.companyName || cu.email }}
No client accounts on record
{{ n.message }}
{{ formatDateTime(n.timestamp) }}
No notifications yet
You'll see updates here as they happen.
Prepare and manage quotation or invoice records for registered clients.
Bill To
Choose a registered client. Client details are managed in Client Information.
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.
{{ formatCurrency(myLatestNetSalary) }}
Latest Net Salary
Last Generated Payslip
{{ myPendingClaimsCount }}
Pending Claims
Status: Pending
{{ formatCurrency(myApprovedClaimsAmount) }}
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.
{{ 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)
Updates and conversation messages from your project activities.
No updates yet
Project updates will appear here once your project starts.
Secure sign-in, email 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.
{{ 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
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. |
||||||
Register and maintain client company records used across projects, quotations and invoices.
| 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. |
||||
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.
Exports below cover {{ reportPeriod ? periodLabel(reportPeriod) : 'all periods' }}.
Employee Directory always exports the full directory.
Each completed month is packaged automatically. Records are never deleted — only summarised.
Current period — still open
{{ currentPeriodLabel }}
| 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.
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).
{{ 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.' }}
{{ cust.clientId }}
SSM: {{ cust.clientSSM }}
{{ cust.clientContactPerson }}
{{ cust.clientEmail }}
{{ clientTaskDateLabel(cust) }}
No {{ group.key }} clients yet
{{ 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.') }}
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.
Most Important
Live status for every project linked to your Client Portal account.
{{ project.projectRef || 'Project' }}
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.
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.
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 || supportEmail }}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' }} | |
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. |
||||
System Configuration
Manage the company details used across invoices, quotations and official records.
Company identity
These details appear on official quotations, invoices and payment documents.
Registered address
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
Banking & payment
Shown on quotation and invoice payment instructions.
You do not have permission to manage Global Company Settings.
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. |
|||
Register new client records or update one selected client without affecting other records.
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.