Backend Team

RollPay CPanel

Active Module

{{ vm.activeMenuTitle() }} Signed in as {{ vm.currentUser.loginName }} ({{ vm.currentUser.loginType }})

RollPay Client Operations

{{ vm.activeMenuTitle() }}

{{ vm.autoRefreshing ? 'Refreshing latest data...' : 'Loading data...' }}
{{ vm.errorMessage }}

Client Registry

Company Master Table

Current view: {{ vm.activeFilterLabel() }}

ID Company Alias Town Product Price List Website Status
{{ company.companyId }} {{ company.companyName }} {{ company.domainName || 'No domain configured' }} {{ company.aliasName || '-' }} {{ company.town || '-' }} {{ company.productName || '-' }} {{ company.priceListName || ('#' + company.priceListId) }} {{ company.websiteLogoPath ? 'Logo' : 'No Logo' }} {{ company.websiteTestimonial ? 'Testimonial saved' : 'No testimonial' }} {{ company.isDeleted ? 'Deleted' : 'Active' }}
No companies matched the current filter and search.

{{ vm.canManageCompanyMaster() ? 'Editor' : 'Website Content' }}

{{ vm.isCreateMode ? 'Create Client Record' : (vm.canManageCompanyMaster() ? 'Company Detail Panel' : 'Logo & Testimonial') }}

{{ vm.isCreateMode ? 'Add a new RollPay client company record.' : (vm.canManageCompanyMaster() ? 'Update selected client settings and save changes directly to company master.' : 'Update the selected client logo and website testimonial.') }}

{{ vm.successMessage }}
Price List
Website Customer Logo
{{ vm.form.companyName }} logo preview
{{ vm.selectedWebsiteLogoFile ? vm.selectedWebsiteLogoFile.name : (vm.form.websiteLogoPath ? 'Current logo is active on the website.' : 'Upload JPG, PNG, WEBP or GIF up to 2 MB.') }}

Backend Notes

Company Notes Desk

All company notes in one table. Use Add Note to open the drawer and create a new remark.

{{ vm.successMessage }}
Company Name Note By Note Date & Time Note Added Action
{{ note.companyName || note.companyId }} {{ note.companyId }} {{ note.addedByLoginName || '-' }} {{ note.noteDateTime | date:'dd-MMM-yyyy HH:mm:ss' }} {{ note.noteRemarks }}
No company notes matched the current search.
No companies are available to attach notes to yet.

Add Note

New Company Note

Select company name and add the backend note or reminder from this drawer.

Company Name
Every new note triggers an email notification to support@rollpay.in.

Website Leads

Enquiries

Contact page enquiries captured from the RollPay v2 website. Open a row to update status and add manager comments.

{{ vm.successMessage }}
Received Customer Company Requirement Status Latest Update Action
#{{ item.websiteEnquiryId }} {{ item.createdOn | date:'dd-MMM-yyyy HH:mm:ss' }} {{ item.personName || '-' }} {{ item.emailAddress || '-' }} {{ item.mobileNo || '-' }} {{ item.companyName || '-' }} {{ item.designation || '-' }} {{ item.subject || 'RollPay demo request' }} {{ item.message || '-' }} {{ vm.enquiryStatusLabel(item.enquiryStatus) }} {{ vm.latestWebsiteEnquiryComment(item).commentedByLoginName }} {{ vm.latestWebsiteEnquiryComment(item).commentText }} {{ vm.latestWebsiteEnquiryComment(item).commentDateTime | date:'dd-MMM-yyyy HH:mm' }} No manager comment yet.
No enquiries matched the current search.

Enquiry Detail

{{ vm.websiteEnquiryForm.personName || 'Website Enquiry' }}

{{ vm.websiteEnquiryForm.companyName || 'No company provided' }} ยท {{ vm.websiteEnquiryForm.createdOn | date:'dd-MMM-yyyy HH:mm' }}

Name {{ vm.websiteEnquiryForm.personName || '-' }}
Email {{ vm.websiteEnquiryForm.emailAddress || '-' }}
Mobile {{ vm.websiteEnquiryForm.mobileNo || '-' }}
Status {{ vm.enquiryStatusLabel(vm.websiteEnquiryForm.enquiryStatus) }}

Original Requirement

{{ vm.websiteEnquiryForm.subject || 'RollPay demo request' }}

{{ vm.websiteEnquiryForm.message || '-' }}

Saving a comment updates the enquiry status and emails the note to ceo@rollpay.in.

Comment History

Timestamped manager comments and CEO email delivery status.

{{ comment.commentedByLoginName || '-' }} {{ comment.commentDateTime | date:'dd-MMM-yyyy HH:mm' }}

{{ comment.commentText }}

No manager comments have been added yet.

Issue Queue

Bug Tracker Desk

{{ vm.successMessage }}
#{{ bug.companyBugTrackerId }} {{ vm.companyBugAttachmentCount(bug) }} {{ bug.tenantCompanyName || bug.tenantCompanyId || '-' }} {{ bug.tenantCompanyId || '-' }} | {{ bug.companyName || bug.companyId || '-' }} {{ vm.bugPriorityMeta(bug.priority).label }} {{ bug.bugFromUserName || '-' }} {{ bug.bugAddedDateTime | date:'dd-MMM-yyyy HH:mm' }} {{ bug.createdByLoginName || '-' }} Login ID {{ bug.createdByLoginId || '-' }} {{ bug.bugRemarks }}
No {{ vm.isCompanyBugClosedView() ? 'closed' : 'open' }} bugs matched the current search.

Bug Detail

{{ vm.isCompanyBugCreateMode ? 'Create Bug' : ('Bug #' + vm.companyBugForm.companyBugTrackerId) }}

{{ vm.isCompanyBugCreateMode ? 'Select tenant company and save the issue first. Workflow flags can be updated directly from the table.' : 'Review bug details and continue the team chat history below.' }}

Tenant Company*
Priority*

Attachment URLs

Paste shared issue screenshots, videos, OneDrive links, or any external reference URLs for this bug.

Created by {{ vm.companyBugForm.createdByLoginName || '-' }} (Login ID {{ vm.companyBugForm.createdByLoginId || '-' }}) on {{ vm.companyBugForm.bugAddedDateTime | date:'dd-MMM-yyyy HH:mm' }}.

Bug Chat

Bug #{{ vm.companyBugForm.companyBugTrackerId }} Conversation

Continue the bug discussion in a dedicated chat drawer instead of working at the bottom of the detail form.

{{ vm.companyBugForm.tenantCompanyName || vm.companyBugForm.tenantCompanyId || ('Bug #' + vm.companyBugForm.companyBugTrackerId) }} {{ vm.companyBugForm.companyName || vm.companyBugForm.companyId || '-' }} {{ (vm.companyBugForm.comments || []).length }} comments
{{ comment.commentedByLoginName || 'Unknown User' }} {{ comment.commentDateTime | date:'dd-MMM-yyyy HH:mm:ss' }}

{{ comment.commentText }}

No comments added yet. Start the discussion below.

Client Approval Desk

Ticketing

Capture client instructions, send approval mail, and retain the full decision trail for future checks.

{{ vm.successMessage }}
Ticket Tenant Company Requested By Work Request Attachments Status Approval Email
#{{ ticket.companyTicketId }} {{ ticket.requestReceivedOn | date:'dd-MMM-yyyy HH:mm' }} {{ ticket.tenantCompanyName || ticket.tenantCompanyId || '-' }} {{ ticket.tenantCompanyId || '-' }} | {{ ticket.companyName || ticket.companyId || '-' }} {{ ticket.requestedByClientName || '-' }} Source: {{ vm.ticketRequestSourceLabel(ticket.requestSource) }} {{ ticket.workSubject || '-' }} {{ ticket.workDetails || '-' }} No attachments {{ vm.ticketStatusLabel(ticket.ticketStatus) }} {{ (ticket.recipients || []).length }} email rows {{ vm.ticketApprovalStatusLabel(ticket.clientApprovalStatus) }} {{ ticket.clientRespondedOn | date:'dd-MMM-yyyy HH:mm' }} {{ ticket.clientRespondedByLoginName }}
{{ ticket.approvalEmailSentOn | date:'dd-MMM-yyyy HH:mm' }} -
No tickets matched the current search.

Ticket Detail

{{ vm.isCompanyTicketCreateMode ? 'Create Ticket' : ('Ticket #' + vm.companyTicketForm.companyTicketId) }}

{{ vm.isCompanyTicketCreateMode ? 'Document the client request first, then send the approval email from the saved ticket.' : 'Update the ticket, review the approval state, and keep the request trail complete.' }}

Tenant Company
Request Source

Email Recipients

Add To and CC email rows for the approval mail.

Loading tenant logins...
No tenant logins were found for this company. You can still type the login name and email manually.
Tenant Login

Attachment URLs

Paste shared OneDrive links or other external URLs. File upload is not needed here.

Approval Summary

Current approval status from the client-side decision page.

Approval Status {{ vm.ticketApprovalStatusLabel(vm.companyTicketForm.clientApprovalStatus) }} {{ vm.companyTicketForm.clientRespondedOn | date:'dd-MMM-yyyy HH:mm:ss' }}
Approval Mail {{ vm.companyTicketForm.approvalEmailSentOn ? 'Sent' : 'Not Sent' }} {{ vm.companyTicketForm.approvalEmailSentOn ? (vm.companyTicketForm.approvalEmailSentOn | date:'dd-MMM-yyyy HH:mm:ss') : 'Send from here when ready.' }}
Responded By {{ vm.companyTicketForm.clientRespondedByLoginName || '-' }} {{ vm.companyTicketForm.clientResponseRemarks || 'No client response remarks yet.' }}

Audit Trail

Saved history of create, update, login, and response events.

{{ audit.auditSummary || audit.auditType || 'Activity' }} {{ audit.auditDateTime | date:'dd-MMM-yyyy HH:mm:ss' }}
{{ audit.auditType || 'log' }} By {{ audit.auditByLoginName }} Client Login: {{ audit.tenantLoginName }}

{{ audit.auditRemarks }}

No audit history is available for this ticket yet.
Created by {{ vm.companyTicketForm.createdByLoginName || '-' }} on {{ vm.companyTicketForm.createdOn | date:'dd-MMM-yyyy HH:mm:ss' }}. Last updated by {{ vm.companyTicketForm.updatedByLoginName || '-' }} on {{ vm.companyTicketForm.updatedOn | date:'dd-MMM-yyyy HH:mm:ss' }}.

Client Onboarding

Onboarding Control Desk

Last Sync {{ vm.latestCompanyMasterCrossSync() ? (vm.latestCompanyMasterCrossSync().lastSyncedOn | date:'dd-MMM-yyyy HH:mm') : '-' }} {{ vm.latestCompanyMasterCrossSync() ? ((vm.latestCompanyMasterCrossSync().companyName || vm.latestCompanyMasterCrossSync().companyId) + ' synced latest.') : 'Cross table has not been populated yet.' }}
{{ vm.successMessage }}
Company ID Company Name Tenant Company ID Tenant Company Name Last Synced On
{{ item.companyId }} Cross {{ item.companyMasterCrossId }} {{ item.companyName || '-' }} {{ item.tenantCompanyId || '-' }} {{ item.tenantCompanyName || '-' }} {{ item.lastSyncedOn | date:'dd-MMM-yyyy HH:mm:ss' }}
No cross-table rows matched the current search.
Company Tenant Company Email Count Required Contacts Headings
{{ item.companyName || item.companyId }} {{ item.companyId }} {{ item.tenantCompanyName || '-' }} {{ item.tenantCompanyId || '-' }} {{ vm.onboardingEmailContactCount(item.companyMasterCrossId) }}
{{ vm.onboardingMissingRequiredContactHeadings(item.companyMasterCrossId).length ? '!' : 'OK' }} {{ vm.onboardingRequiredContactStatusLabel(item.companyMasterCrossId) }}
{{ vm.onboardingEmailHeadingSummary(item.companyMasterCrossId) }}
{{ vm.onboardingEmailContactsMissingOnly ? 'No tenant-company rows missing Admin, HR, or Accounts matched the current search.' : 'No tenant-company rows matched the current search.' }}
Checklist Description Order Status Action
{{ item.checklistName }} System checklist {{ item.checklistDescription || '-' }} {{ item.displayOrder }} {{ item.isActive ? 'Active' : 'Inactive' }}
No onboarding checklist rows matched the current search.
Client / Progress / Tenant
{{ checklist.checklistName }} {{ checklist.checklistDescription }}
{{ row.companyName || row.companyId }} {{ row.companyId }}
{{ vm.onboardingRowProgress(row).percent }}% {{ vm.onboardingRowProgress(row).completedCount }}/{{ vm.onboardingRowProgress(row).totalCount }}
{{ row.tenantCompanyName || row.tenantCompanyId }} {{ row.tenantCompanyId }}
{{ vm.onboardingStatusMeta(vm.getMatrixStatus(row, checklist.onboardingChecklistId).onboardingStatus).icon }}
By {{ vm.getMatrixStatus(row, checklist.onboardingChecklistId).updatedByLoginName }} {{ vm.getMatrixStatus(row, checklist.onboardingChecklistId).statusDateTime | date:'dd-MMM-yyyy HH:mm' }} {{ vm.getMatrixStatus(row, checklist.onboardingChecklistId).fetchedSummary }} Fetched on {{ vm.getMatrixStatus(row, checklist.onboardingChecklistId).lastTenantFetchedOn | date:'dd-MMM-yyyy HH:mm' }} {{ vm.getMatrixStatus(row, checklist.onboardingChecklistId).statusRemarks }}
{{ vm.onboardingChecklistStatusFilter === 'pending' ? 'No pending onboarding checklist rows matched the current search.' : (vm.onboardingChecklistStatusFilter === 'not required' ? 'No not-required onboarding checklist rows matched the current search.' : 'No onboarding matrix rows matched the current search.') }}
Checklist Pending Data Pending Open Total Companies
{{ item.checklistName }} {{ item.checklistDescription }} {{ item.pendingCount }} {{ item.dataPendingCount }} {{ item.openCount }} {{ item.openCount }} companies Pending and data-pending client rows
No pending onboarding checklist report rows matched the current search.
Checklist Company Tenant Requested By Requested Slot Status Meeting Link Remarks Action
{{ item.checklistName || '-' }} Request #{{ item.companyOnboardingMeetingRequestId }} {{ item.companyName || item.companyId || '-' }} {{ item.companyId || '-' }} {{ item.tenantCompanyName || item.tenantCompanyId || '-' }} {{ item.tenantCompanyId || '-' }} {{ item.requesterName || '-' }} {{ item.requesterEmail || '-' }} {{ item.requestedMeetingDateTime | date:'dd-MMM-yyyy HH:mm' }} Booked from public scheduling page {{ item.requestStatusLabel || item.requestStatus || '-' }} {{ item.supportHandledByLoginName }} on {{ item.supportHandledOn | date:'dd-MMM-yyyy HH:mm' }} Open Meeting Link - Sent {{ item.meetingLinkSentOn | date:'dd-MMM-yyyy HH:mm' }} Client: {{ item.clientRemarks || '-' }} Support: {{ item.supportRemarks || '-' }}
No onboarding meeting requests matched the current search.

{{ quadrant.title }}

{{ quadrant.companies.length }} Parties

{{ quadrant.description }}

{{ company.companyName || company.companyId }} {{ company.companyId }}
{{ company.progressPercent }}%
Child Companies: {{ company.childCount }} Completed Checklists: {{ company.completedChecklistCount }}
Salary: {{ company.lastSalaryDate | date:'dd-MMM-yyyy' }} Attendance: {{ company.lastAttendanceDate | date:'dd-MMM-yyyy' }} Asset: {{ company.lastAssetDate | date:'dd-MMM-yyyy' }} Uniform: {{ company.lastUniformDate | date:'dd-MMM-yyyy' }} No tenant activity captured yet.
No companies are currently falling into this quadrant.

Onboarding Detail

{{ vm.onboardingSelectedRowDetail ? (vm.onboardingSelectedRowDetail.tenantCompanyName || vm.onboardingSelectedRowDetail.tenantCompanyId || ('Cross ' + vm.onboardingSelectedRowDetail.companyMasterCrossId)) : 'Select Client Row' }}

{{ vm.onboardingSelectedRowDetail ? (vm.onboardingTab === 'email-contacts' ? 'Manage onboarding recipient groups and multiple email IDs for this tenant company from one focused panel.' : 'Review checklist progress, latest remarks, and work through comments or history from one focused panel.') : 'Select a row from the current onboarding tab to open the focus panel.' }}

Select any onboarding row to keep the table on the left and the working detail on the right.
Company {{ vm.onboardingSelectedRowDetail.companyName || vm.onboardingSelectedRowDetail.companyId || '-' }} {{ vm.onboardingSelectedRowDetail.companyId || '-' }}
Tenant {{ vm.onboardingSelectedRowDetail.tenantCompanyName || vm.onboardingSelectedRowDetail.tenantCompanyId || '-' }} {{ vm.onboardingSelectedRowDetail.tenantCompanyId || '-' }}
Cross ID #{{ vm.onboardingSelectedRowDetail.companyMasterCrossId }} {{ vm.onboardingSelectedRowDetail.lastSyncedOn ? ('Synced ' + (vm.onboardingSelectedRowDetail.lastSyncedOn | date:'dd-MMM-yyyy HH:mm')) : 'Sync not available' }}

Saved Contact Emails

Use the fixed headings Admin, CEO, HR, Accounts, and IT Head so onboarding communication stays consistent.

Total Active Emails {{ vm.onboardingEmailContactsForSelectedRow().length }} {{ vm.onboardingEmailHeadingSummary(vm.selectedOnboardingCompanyMasterCrossId) }}
Heading Contact Person Email Mobile Order Action
{{ contact.contactHeading }} {{ contact.remarks }} {{ contact.contactPersonName || '-' }} {{ contact.emailAddress }} {{ contact.mobileNo || '-' }} {{ contact.displayOrder }}
No contact emails have been added for this tenant company yet.

{{ vm.isOnboardingEmailContactCreateMode ? 'Add Contact Email' : 'Edit Contact Email' }}

Each row stores one email ID under a reusable heading, so we can target the right people later without changing the schema again.

Copy same details {{ vm.hasOnboardingEmailContactCopyTargets() ? (vm.copyOnboardingEmailContactTargetCount() + ' copy target' + (vm.copyOnboardingEmailContactTargetCount() === 1 ? '' : 's')) : 'No copy target selected' }}
Saving against {{ vm.onboardingSelectedRowDetail.tenantCompanyName || vm.onboardingSelectedRowDetail.tenantCompanyId || '-' }} (Cross #{{ vm.onboardingSelectedRowDetail.companyMasterCrossId }}).
{{ vm.onboardingRowProgress(vm.onboardingSelectedRowDetail).percent }}% {{ vm.onboardingRowProgress(vm.onboardingSelectedRowDetail).completedCount }}/{{ vm.onboardingRowProgress(vm.onboardingSelectedRowDetail).totalCount }} checklists done
{{ checklist.checklistName }} {{ checklist.checklistDescription }}
{{ vm.onboardingStatusMeta(vm.getMatrixStatus(vm.onboardingSelectedRowDetail, checklist.onboardingChecklistId).onboardingStatus).label }}
{{ vm.onboardingStatusMeta(vm.getMatrixStatus(vm.onboardingSelectedRowDetail, checklist.onboardingChecklistId).onboardingStatus).icon }}
By {{ vm.getMatrixStatus(vm.onboardingSelectedRowDetail, checklist.onboardingChecklistId).updatedByLoginName }} {{ vm.getMatrixStatus(vm.onboardingSelectedRowDetail, checklist.onboardingChecklistId).statusDateTime | date:'dd-MMM-yyyy HH:mm' }} {{ vm.getMatrixStatus(vm.onboardingSelectedRowDetail, checklist.onboardingChecklistId).fetchedSummary }} Fetched on {{ vm.getMatrixStatus(vm.onboardingSelectedRowDetail, checklist.onboardingChecklistId).lastTenantFetchedOn | date:'dd-MMM-yyyy HH:mm' }} {{ vm.getMatrixStatus(vm.onboardingSelectedRowDetail, checklist.onboardingChecklistId).statusRemarks }}
{{ vm.onboardingChecklistStatusFilter === 'pending' ? 'No pending checklist items remain for this client row.' : (vm.onboardingChecklistStatusFilter === 'not required' ? 'No not-required checklist items remain for this client row.' : 'No active onboarding checklist columns are available yet.') }}

Checklist Editor

{{ vm.isOnboardingChecklistCreateMode ? 'Add Checklist Item' : 'Edit Checklist Item' }}

Checklist columns here are common and will appear for all child companies in the onboarding status matrix.

This is a system checklist. Its name stays fixed, but you can still change its display order.

Agreement Signing

Agreement Library

Upload agreement files with version and effective date before client signing workflow begins.

{{ vm.successMessage }}

Upload Agreement

Use a clear name and version so the team can identify the correct agreement later.

MSA Agreement uploads must be HTML files so they can be reviewed inside the secure signing page.
Selected file: {{ vm.selectedClientAgreementFile.name }}

Agreement Type Master

Add new agreement categories here when the signing workflow grows.

Uploaded Agreements

Open uploaded files and verify version history from here.

{{ group.agreementName }} {{ group.agreements.length }} version{{ group.agreements.length === 1 ? '' : 's' }}
Agreement Version Effective Date File Uploaded By Action
{{ item.agreementName }} #{{ item.clientAgreementId }} {{ item.versionNo }} {{ item.effectiveDate | date:'dd-MMM-yyyy' }} {{ item.originalFileName }} {{ item.uploadedByLoginName || '-' }} {{ item.createdOn | date:'dd-MMM-yyyy HH:mm' }}
No version uploaded yet.

Map MSA to Tenants

Select the active MSA version that signing-authority users will see after login.

Selected {{ vm.clientEngagementSelectedCompanyIds(vm.msaAgreementMapForm).length }} tenant rows
Upload an HTML file under MSA Agreement before mapping it to tenants.
This does not send an email. It only attaches the selected MSA to the chosen tenant rows for the clickwrap flow in the tenant Rollpay project.

Targets

Select the tenants where this MSA version should become the active agreement.

Map Company Tenant Company Current MSA Mapped By
{{ row.companyName || row.companyId }} {{ row.companyId }} {{ row.tenantCompanyName || '-' }} {{ row.tenantCompanyId || '-' }} {{ vm.tenantMsaAgreementMapForCompany(row.companyMasterCrossId).agreementName }} v{{ vm.tenantMsaAgreementMapForCompany(row.companyMasterCrossId).versionNo }} {{ vm.tenantMsaAgreementMapForCompany(row.companyMasterCrossId).effectiveDate | date:'dd-MMM-yyyy' }} Not mapped {{ vm.tenantMsaAgreementMapForCompany(row.companyMasterCrossId).mappedByLoginName || '-' }} {{ vm.tenantMsaAgreementMapForCompany(row.companyMasterCrossId).mappedOn | date:'dd-MMM-yyyy HH:mm' }} -
No target rows matched the current search.

Signed MSA Documents

Accepted HTML copies are saved under the tenant name and can be opened from here.

Signed {{ vm.acceptedMsaAgreementDocuments().length }} accepted documents
Tenant Contact Version Accepted On Evidence Action
{{ item.tenantCompanyName || item.companyName || '-' }} {{ item.companyName || '-' }} {{ item.contactPersonName || item.email || '-' }} {{ item.email || '-' }} {{ item.documentVersion || '-' }} {{ item.acceptedOnIst | date:'dd-MMM-yyyy HH:mm' }} {{ item.signedDocumentHash || item.documentHash || '-' }}
No accepted MSA documents have been saved yet.

MSA Signing Status

Track active tenant MSA mappings and see which tenants have completed acceptance.

Pending {{ vm.msaAgreementSigningStatusCount('Pending') }} awaiting action
Invitation Sent {{ vm.msaAgreementSigningStatusCount('Invitation Sent') }} invite shared
Credential Sent {{ vm.msaAgreementSigningStatusCount('Credential Sent') }} login shared
Signed {{ vm.msaAgreementSigningStatusCount('Doc Signed') }} doc available
Company Tenant Company MSA Version Mapped On Accepted By Accepted On Status Action
{{ item.companyName || item.companyId || '-' }} {{ item.companyId || '-' }} {{ item.tenantCompanyName || '-' }} {{ item.tenantCompanyId || '-' }} {{ item.agreementName || 'MSA Agreement' }} v{{ item.versionNo || '-' }} {{ item.effectiveDate | date:'dd-MMM-yyyy' }} {{ item.mappedOn | date:'dd-MMM-yyyy HH:mm' }} {{ item.mappedByLoginName || '-' }} {{ item.acceptedBy || '-' }} {{ item.email || '-' }} {{ item.acceptedOn ? (item.acceptedOn | date:'dd-MMM-yyyy HH:mm') : '-' }} {{ item.status }} {{ item.statusDate | date:'dd-MMM-yyyy HH:mm' }}
No active MSA tenant mappings found.

Client Engagement

Bulk Notification Desk

Send targeted HTML emails and annual price revision notices using the saved onboarding contact headings.

{{ vm.successMessage }}

HTML Email Body

Write the email in HTML, choose clients and headings, then send one email per matching contact.

Recipients {{ vm.clientEngagementRecipientCount(vm.clientEngagementBulkEmailForm) }} {{ vm.clientEngagementSelectedCompanyIds(vm.clientEngagementBulkEmailForm).length }} target rows
Subject will be generated automatically as Rollpay/CE/TENANTNAME/yyyyMMdd.
Email Body*
Image Size
Text Color
Highlight
RollPay Client Engagement
{{ file.name }}
{{ vm.clientEngagementBulkEmailProgress.processedTargets }} / {{ vm.clientEngagementBulkEmailProgress.totalTargets || 0 }} parties processed
Sending: {{ vm.clientEngagementBulkEmailProgress.currentLabel }} Finished
Recipients: {{ vm.clientEngagementBulkEmailProgress.recipientCount }} Sent: {{ vm.clientEngagementBulkEmailProgress.sentCount }} Skipped: {{ vm.clientEngagementBulkEmailProgress.skippedCount }} Failed: {{ vm.clientEngagementBulkEmailProgress.failedCount }}
{{ row.status }} {{ row.label }} {{ row.message }}

Targets

Select target clients and headings from saved onboarding email contacts.

Send Company Tenant Company Headings Emails
{{ item.companyName || item.companyId }} {{ item.companyId }} {{ item.tenantCompanyName || '-' }} {{ item.tenantCompanyId || '-' }} {{ vm.clientEngagementSelectedHeadingSummary(item.companyMasterCrossId, vm.clientEngagementBulkEmailForm) }} {{ vm.clientEngagementRowRecipientCount(item.companyMasterCrossId, vm.clientEngagementBulkEmailForm) }}
No target rows matched the current search.

Price Hike Campaign

Enter the effective date and revised commercial values for each selected tenant company.

Recipients {{ vm.clientEngagementRecipientCount(vm.clientEngagementPriceHikeForm) }} {{ vm.clientEngagementSelectedCompanyIds(vm.clientEngagementPriceHikeForm).length }} target rows

Tenant Rates

Select target clients and headings, then enter the revised rate before sending.

Send Company Tenant Company {{ vm.clientEngagementPriceHikeTypeLabel() }} Headings Emails
{{ item.companyName || item.companyId }} {{ item.companyId }} {{ item.tenantCompanyName || '-' }} {{ item.tenantCompanyId || '-' }} {{ vm.clientEngagementSelectedHeadingSummary(item.companyMasterCrossId, vm.clientEngagementPriceHikeForm) }} {{ vm.clientEngagementRowRecipientCount(item.companyMasterCrossId, vm.clientEngagementPriceHikeForm) }}
No tenant rows matched the current search.

Saved Price Hike History

Saved and imported campaign records by party, hike type, value, and as-on date.

Saved Rows {{ vm.clientEngagementPriceHikeVisibleRecords().length }} {{ vm.clientEngagementPriceHikeRecords.length }} total
As On Effective Company Tenant Company Price Hike Type Value Headings Email Saved By
{{ record.priceHikeAsOnDate | date:'dd-MMM-yyyy' }} {{ record.effectiveDate | date:'dd-MMM-yyyy' }} {{ record.companyName || record.companyId }} {{ record.companyId }} {{ record.tenantCompanyName || '-' }} {{ record.tenantCompanyId || '-' }} {{ record.priceHikeTypeLabel || record.priceHikeType }} {{ record.priceHikeValue }} {{ record.contactHeadings || '-' }} {{ record.emailSent ? 'Sent' : 'Saved' }} {{ record.sentRecipientCount || 0 }} recipients {{ record.createdByLoginName || '-' }} {{ record.createdOn | date:'dd-MMM-yyyy HH:mm' }}
No saved price hike records yet.

Pricing Registry

Price List Table

Current view: {{ vm.activePriceListFilterLabel() }}

ID Name Year Month Per HR Setup Fee SMS Status
{{ priceList.priceListId }} {{ priceList.priceListName }} WA {{ priceList.whatsappCharge }} | GB {{ priceList.gbCharge }} | TrackPay {{ priceList.trackPayCost }} | TaskPay {{ priceList.taskPay }} {{ priceList.priceListYear }} {{ priceList.priceListMonth }} {{ priceList.perHr }} {{ priceList.setupFee }} {{ priceList.smsCharge }} {{ priceList.isDeleted ? 'Deleted' : 'Active' }}
No price lists matched the current filter and search.

Editor

{{ vm.isPriceListCreateMode ? 'Create Price List' : 'Price List Detail Panel' }}

{{ vm.isPriceListCreateMode ? 'Add a new pricing master record.' : 'Update selected price-list settings and save changes.' }}

{{ vm.successMessage }}

Quote Registry

Quote Master Table

Current view: {{ vm.activeQuoteFilterLabel() }}

Status
Quote No Rev Quote Date Company Price List Commercials Status Remarks Action
{{ quote.quoteNo }} {{ quote.revisionNo > 0 ? ('Rev ' + quote.revisionNo) : 'Original' }} Series RP/{{ quote.quoteSeriesNo || quote.quoteNo }} {{ quote.quoteDateTime | date:'dd-MMM-yyyy HH:mm' }} {{ quote.companyName }} {{ quote.customerNumber || quote.emailId || 'No contact captured' }} {{ quote.basePriceListName || ('#' + quote.basePriceListId) }} Setup {{ quote.quotedSetupFee }} Per HR {{ quote.quotedPerHr }} | TrackPay {{ quote.quotedTrackPayCost }} | TaskPay {{ quote.quotedTaskPay }} {{ quote.quoteStatus || (quote.isDeleted ? 'Deleted' : 'Open') }} {{ quote.backendRemarks || 'No remarks' }}
No quotes matched the current filter and search.

Editor

{{ vm.isQuoteCreateMode ? (vm.isQuoteRevisionMode ? 'Create Quote Revision' : 'Create Quote') : 'Quote Detail Panel' }}

{{ vm.isQuoteCreateMode ? (vm.isQuoteRevisionMode ? 'Create a revision record while keeping the original quotation unchanged.' : 'Create a commercial proposal for a new client.') : 'Update the selected quote and preview the offer sheet.' }}

{{ vm.successMessage }}
Quote Status
Base Price List
Charge Head Not Opted-In Master Quoted
{{ row.label }} {{ row.unit }} Not opted-in Save {{ vm.quoteDiscountAmount(row) | number:2 }}
Asset Commercials
Charge Head Not Opted-In Master Quoted
{{ row.label }} {{ row.unit }} Not opted-in Save {{ vm.quoteDiscountAmount(row) | number:2 }}

Estimate Registry

Estimate Master Table

Current view: {{ vm.activeEstimateFilterLabel() }}

Estimate No Quote Ref Date Party Employees One-Time Monthly Status Action
{{ estimate.estimateNo }} {{ estimate.quoteNo ? ('RP/' + estimate.quoteNo) : '-' }} {{ estimate.estimateDateTime | date:'dd-MMM-yyyy HH:mm' }} {{ estimate.companyName }} {{ estimate.contactName || estimate.emailId || 'No contact captured' }} {{ estimate.totalEmployees }} {{ estimate.oneTimeTotal | number:2 }} {{ estimate.monthlyTotal | number:2 }} {{ estimate.isDeleted ? 'Deleted' : 'Active' }}
No estimates matched the current filter and search.

Editor

{{ vm.isEstimateCreateMode ? 'Create Estimate' : 'Estimate Detail Panel' }}

{{ vm.isEstimateCreateMode ? 'Prepare a client estimate from an existing quotation.' : 'Update the selected estimate and send the estimate sheet.' }}

{{ vm.successMessage }}
Quote Reference (Optional)
One-Time Total {{ vm.estimateOneTimeTotal() | number:2 }}
Monthly Total {{ vm.estimateMonthlyTotal() | number:2 }}

Compliance Hub

Compliance Notice Admin View

Read-only cPanel view of common notices from attdb. Tenant HR users should only receive Published notices from their RollPay UI.

{{ vm.complianceSetupMessage }}
{{ vm.successMessage }}
{{ vm.complianceDashboard.crawlerEnabledSourceCount || 0 }} crawler-enabled source{{ (vm.complianceDashboard.crawlerEnabledSourceCount || 0) === 1 ? '' : 's' }}
Last crawler: {{ vm.complianceDashboard.lastCrawlerStatus || 'Started' }} - {{ vm.complianceDashboard.lastCrawlerSourceName }} - {{ vm.complianceDashboard.lastCrawlerStartedOn | date:'dd-MMM-yyyy HH:mm' }}
Status
State
Category
Notice Status State Category Effective Impact Flags Links
{{ notice.title }} #{{ notice.noticeId }} | {{ notice.noticeNumber }} | {{ notice.gazetteId }} {{ notice.sourceName }} {{ notice.status || 'Draft' }} {{ notice.jurisdiction || '-' }} {{ notice.stateName || 'All India / Central' }} {{ notice.category || '-' }} {{ notice.effectiveFrom ? (notice.effectiveFrom | date:'dd-MMM-yyyy') : '-' }} Published: {{ notice.publishDate | date:'dd-MMM-yyyy' }} {{ notice.impactArea || '-' }} Important Payroll Wage Matrix - PDF Source -
No compliance notices matched the current filters.
Run Source Status Timing Found PDFs Drafts Duplicates Error / Message
#{{ log.runLogId }} Source #{{ log.sourceId }} {{ log.sourceName || '-' }} {{ log.sourceType || '-' }} | {{ log.jurisdiction || '-' }} | {{ log.stateName }} {{ log.sourceUrl }} {{ log.status || '-' }} {{ log.startedOn ? (log.startedOn | date:'dd-MMM-yyyy HH:mm:ss') : '-' }} Done: {{ log.completedOn | date:'dd-MMM-yyyy HH:mm:ss' }} Running / waiting {{ log.totalLinksFound || 0 }} {{ log.totalPdfDownloaded || 0 }} {{ log.totalDraftCreated || 0 }} {{ log.totalDuplicateSkipped || 0 }}

{{ log.errorMessage || '-' }}

No crawler log rows matched the current search.
{{ vm.selectedComplianceSourceCount() }} selected
Source Coverage Crawler Last Fetch Last Run Metrics Actions
{{ source.sourceName || '-' }} #{{ source.sourceId }} | {{ source.sourceType || '-' }} {{ source.sourceUrl }} {{ source.jurisdiction || '-' }} {{ source.stateName || 'All India / Central' }} {{ source.isCrawlerEnabled ? 'Enabled' : 'Disabled' }} {{ source.fetchFrequencyHours || 24 }}h frequency {{ source.lastFetchStatus || 'Never Run' }} {{ source.lastFetchedOn | date:'dd-MMM-yyyy HH:mm:ss' }}

{{ source.lastFetchMessage }}

{{ source.lastRunStatus || 'No Log' }} {{ source.lastRunStartedOn | date:'dd-MMM-yyyy HH:mm:ss' }} Links: {{ source.lastRunLinksFound || 0 }} PDFs: {{ source.lastRunPdfDownloaded || 0 }} Drafts: {{ source.lastRunDraftCreated || 0 }} Duplicates: {{ source.lastRunDuplicateSkipped || 0 }}
No compliance sources matched the current search.

Selected Notice

{{ vm.selectedComplianceNotice.title }}

{{ vm.selectedComplianceNotice.status || 'Draft' }} Payroll Impact Wage Matrix

{{ vm.selectedComplianceNotice.detailedSummary || vm.selectedComplianceNotice.shortSummary || 'No summary has been added yet.' }}

Jurisdiction{{ vm.selectedComplianceNotice.jurisdiction || '-' }}
State{{ vm.selectedComplianceNotice.stateName || 'All India / Central' }}
Category{{ vm.selectedComplianceNotice.category || '-' }}
Act{{ vm.selectedComplianceNotice.actName || '-' }}
Notice No{{ vm.selectedComplianceNotice.noticeNumber || '-' }}
Gazette ID{{ vm.selectedComplianceNotice.gazetteId || '-' }}

Extracted Notice Text

{{ vm.selectedComplianceNotice.rawExtractedText }}

No extracted notice text has been saved for this notice yet.

Minimum Wage Matrix

{{ (vm.selectedComplianceNotice.wageMatrix || []).length || 0 }} Rows

Loading notice details...
Employment Zone Skill Period Total
{{ wage.scheduledEmployment || '-' }} {{ wage.zone || '-' }} {{ wage.skillCategory || '-' }} {{ wage.wagePeriod || '-' }} {{ wage.totalAmount | number:2 }}

No wage matrix rows have been saved for this notice.

Device Registry

Device Status Table

Read-only view of all RollPay devices. Devices mapped to companies are protected from deletion.

Sort By
{{ vm.successMessage }}
Device ID Device Name Connection Last Update Action
{{ device.deviceId }} {{ device.deviceName || '-' }} {{ vm.isDeviceConnected(device) ? 'Connected' : 'Disconnected' }} {{ device.lastUpdateTime | date:'dd-MMM-yyyy HH:mm:ss' }} -
No devices matched the current search.

Company Device Registry

Company Device Table

Read-only mapping view of companies and their devices. Delete removes only the mapping row.

{{ vm.successMessage }}
Action
{{ item.cdId }} {{ item.companyId }} {{ item.companyName || '-' }} {{ item.deviceId }} {{ item.deviceName || '-' }} {{ vm.isDeviceConnected(item) ? 'Connected' : 'Disconnected' }} -
No company device mappings matched the current search.

Tenant Diagnostics

Error Logs

Admin-only view of active company dbo.tblerror records and latest database summaries.

Fetched {{ vm.tenantErrorLogDashboard.successfulCompanyCount || 0 }} of {{ vm.tenantErrorLogDashboard.activeCompanyCount || 0 }} active companies on {{ vm.tenantErrorLogDashboard.fetchedOn | date:'dd-MMM-yyyy HH:mm:ss' }}
{{ vm.successMessage }}
{{ vm.tenantErrorLogFailures.length }} company log fetch{{ vm.tenantErrorLogFailures.length === 1 ? '' : 'es' }} failed. Search or export still uses the companies that loaded successfully.
Loading tenant error logs from active company databases...
Deleting tenant error logs from active company databases...
Company Error ID Error Datetime Source Error Message Inner Message Stack Trace Action
{{ item.companyName || item.companyId || '-' }} {{ item.companyId || '-' }} {{ item.errorId || '-' }} {{ item.errorDateTime ? (item.errorDateTime | date:'dd-MMM-yyyy HH:mm:ss') : '-' }} {{ item.errorSource || '-' }}

{{ item.errorMessage || '-' }}

{{ item.innerMessage || '-' }}

{{ item.stackTrace || '-' }}

No tenant error log rows matched the current search.
Open this page to load active company error logs.
Company Total Errors Latest Error ID Latest Time Source Latest Message Action
{{ item.companyName || item.companyId || '-' }} {{ item.companyId || '-' }} {{ item.totalErrorCount || 0 }} {{ item.latestErrorId || '-' }} {{ item.latestErrorDateTime ? (item.latestErrorDateTime | date:'dd-MMM-yyyy HH:mm:ss') : '-' }} {{ item.latestErrorSource || '-' }}

{{ item.latestErrorMessage || '-' }}

No tenant log summary rows matched the current search.
Open this page to load the summary.

Fetch Failures

Companies skipped because the database connection or dbo.tblerror table could not be read.

{{ failure.companyName || failure.companyId }} {{ failure.companyId }}

{{ failure.errorMessage }}

Access Registry

Login User Table

Create users, assign login type, and control active access for the CPanel.

ID Login Name Login Type Status Created Updated
{{ user.loginId }} {{ user.loginName }} Internal access account {{ user.loginType }} {{ user.isActive ? 'Active' : 'Inactive' }} {{ user.createdOn | date:'dd-MMM-yyyy HH:mm' }} {{ user.updatedOn | date:'dd-MMM-yyyy HH:mm' }}
No users matched the current search.

Editor

{{ vm.isUserCreateMode ? 'Create Login User' : 'User Access Detail' }}

{{ vm.isUserCreateMode ? 'Add a new backend-team login for the control panel.' : 'Update login name, role, password, or active access for the selected user.' }}

{{ vm.successMessage }}
Login Type*

Menu Master

{{ vm.activeMenuTitle() }}

This panel is ready for the next backend-team module. The control-panel shell, navigation, and theme are already set up for expansion.