Standard Operating Procedure

SRM Portal

Contractor Billing & Resource Management System

This document describes the standard operating procedures for all users of the SRM Portal, including timesponge uploads, billing management, QuickBooks integration, reconciliation, and system administration.

Version1.1
Effective DateApril 2026
Prepared ForAll SRM Portal Users
ClassificationInternal Use Only
Review FrequencyQuarterly

Table of Contents

  1. System Overview
  2. Accessing the Portal
  3. User Roles & Permissions
  4. Period Management
  5. Timesponge Upload
  6. Limit Order Upload
  7. PO Details
  8. Billing Summary
  9. QuickBooks Online Integration
  10. Forecast
  11. Reconciling
  12. Analytics Dashboard
  13. Contracts
  14. User Management
  15. Billing Calculation Reference
  16. Standard Monthly Workflow
  17. Security Policy
  18. POPIA Compliance
  19. GDPR Compliance
  20. Troubleshooting
1 System Overview

The SRM Portal is an internal web application that manages the full billing lifecycle for contractors and projects. It consolidates timesheet data, purchase order limits, payroll reconciliation, and invoice generation into a single workflow.

Core Capabilities

ModulePurpose
Timesponge UploadImport contractor hours from CSV exports
Limit OrderTrack available invoiceable value per PO from SAP
PO DetailsMaintain project, client, and purchase order metadata
Billing SummaryCompute billing amounts; push invoices to QuickBooks
ForecastPlan and monitor hours vs. available PO capacity
ReconcilingMatch payroll reports against billing calculations
AnalyticsCross-period KPIs, trends, and person-level summaries
ContractsTrack contract dates, rates, and expiry status
CandidateSelf-service time entry for contractors
UsersRole-based access control and user administration

Technology Stack

2 Accessing the Portal

Logging In

  1. Navigate to the portal URL in your browser.
  2. Enter your Username and Password.
  3. Click Login. You will be redirected to the home screen.
⚠ First-Time Login Your administrator will provide your initial login credentials via a secure channel. Change your password immediately after first access via the account menu.

Sessions expire after 8 hours of inactivity. You will be automatically redirected to the login page when your session expires.

3 User Roles & Permissions

The portal enforces three access levels:

RoleDescriptionCapabilities
Admin Full system access All data CRUD operations, user management, QBO settings, period management, sync lock control, view analytics with hidden-person settings
Normal Standard operational access Create, edit, and delete all billing data; upload CSVs; push invoices to QBO; cannot manage users or change system settings
Viewer Read-only access View all data across all modules; cannot create, edit, delete, or trigger any data mutations
4 Period Management

All data in the portal is organised by period (typically a calendar month, e.g. 2026-04). The period selector is available in the top navigation bar on all data pages.

Creating a New Period

Requires: Admin role
  1. Click the period dropdown in the navigation bar.
  2. Select + Add Period.
  3. Enter the period key in YYYY-MM format (e.g. 2026-05) and a display label.
  4. Click Save. The new period is immediately available across all modules.

Switching Periods

Use the period dropdown in the navigation bar to switch between periods. All module data (timesponge, billing, limit order, reconciling) filters to the selected period.

5 Timesponge Upload

The Timesponge module imports contractor hours from a CSV file exported from your time-tracking system. This is the primary data input that drives billing.

CSV Format

The upload file must contain the following columns (header names are case-insensitive):

ColumnRequiredDescription
DateYesEntry date in YYYY-MM-DD format
PersonYesFull name of the contractor
Employee CodeYesUnique employee identifier
Hours WorkedYesTotal hours submitted
Hours ApprovedYesHours approved by the client
ProjectYesProject name (must match PO Details)
Hourly RateYesContractor's billing rate (ZAR)
ApprovalNoApproval status (defaults to Pending)
⚠ Re-upload Behaviour Uploading a new CSV for a period replaces all existing timesponge records for that period. Ensure the file contains a complete dataset for the period before uploading.

Upload Procedure

  1. Select the correct period from the navigation bar.
  2. Navigate to the Timesponge page (home / index).
  3. Drag and drop your CSV file onto the upload area, or click to browse.
  4. Review the preview table. Duplicate entries (same person + project + date) are automatically summed.
  5. Click Upload to confirm. The table updates immediately.

Manual Entries

Individual rows can be added manually by clicking + Add Row and filling in the inline form. This is useful for corrections or one-off entries.

PO Match Indicator

Each timesponge row displays a colour indicator showing whether the person + project combination has a matching record in PO Details:

6 Limit Order Upload

The Limit Order module imports the available invoiceable value per purchase order from your procurement system (e.g. SAP). This data feeds the Forecast and Billing modules to flag potential PO overruns.

CSV Format

ColumnDescription
Purchasing DocumentPO number (must match PO Details)
Short TextDescription of the PO
PlantPlant/site code
Still to be Invoiced (Value)Remaining invoiceable ZAR value

Upload Procedure

  1. Select the correct period.
  2. Navigate to the Limit Order page.
  3. Drag and drop your CSV file onto the upload area, or click to browse.
  4. Confirm the preview and click Upload.
⚠ Re-upload Behaviour Uploading replaces all limit order data for the selected period.

Rows can also be added or edited manually using the inline table editor.

7 PO Details

PO Details is the master reference table linking employees to projects, clients, and purchase orders. It must be maintained accurately for the Billing Sync to work correctly.

Fields

FieldRequiredDescription
Employee CodeYesUnique contractor identifier
PersonYesFull name
ProjectYesProject name (should match timesponge entries)
PO NumberYesPurchase Order number from procurement system
ClientYesClient/company name (must match QBO customer name if using QBO)
Send Invoice ToNoEmail address for invoice delivery via QBO
EM DetailsNoEmployment/engagement detail notes
PO LinkNoURL to the signed PO document
SOW LinkNoURL to the Statement of Work
PO DateNoPurchase order effective date
NotesNoFree-text notes

Adding a PO Detail Record

  1. Navigate to PO Details.
  2. Click + Add Record to open the modal form.
  3. Complete all required fields.
  4. Click Save.

Bulk Import via CSV

Multiple records can be imported by uploading a CSV with columns: Employee Code, Person, Project, PO Number, Client.

Matching Logic (used during Billing Sync): The system first tries to match by Employee Code. If multiple projects exist for one employee, it prefers an exact project name match. If no exact match, it uses the longest partial match (most specific sub-string).
8 Billing Summary

The Billing Summary is the central operational screen. It aggregates timesponge data with PO Details to produce one billing row per employee + project combination per period.

Syncing Billing from Timesponge

  1. Ensure Timesponge and PO Details are up to date for the period.
  2. Navigate to Billing Summary.
  3. Click Sync from Timesponge.
  4. The system aggregates hours and populates/updates billing rows. Existing manual adjustments (expense, adjustment, invoice no, etc.) are preserved.
⚠ Sync Lock Once invoices are finalised for a period, an Admin can enable the Sync Lock for that period. A locked period cannot be re-synced, protecting finalised billing data. Only an Admin can unlock it.

Key Editable Fields

FieldDescription
Hours to InvoiceThe hours actually billed. Pre-filled from approved hours; can be manually overridden.
Hourly RateZAR rate per hour for this person/project.
SDL %Skills Development Levy percentage (default per company policy).
UIF %Unemployment Insurance Fund percentage (statutory cap applies).
COIDA %Compensation for Occupational Injuries and Diseases percentage (statutory cap applies).
Management Fee %SRM management fee applied on top of labour costs.
ExpenseNon-VAT expense amount added to the invoice.
AdjustmentManual positive or negative adjustment (non-VAT).
StatusInvoice lifecycle status (see below).
Invoice NoQBO or manual invoice number.
NotesInternal notes visible on the billing row.

Invoice Status Values

StatusMeaning
Need SOWStatement of Work not yet received – cannot invoice
Need POPurchase Order not yet received – cannot invoice
Ready To InvoiceAll prerequisites met; invoice can be raised
InvoicedInvoice has been created in QBO or manually
EmailedInvoice has been sent to the client

To-Be-Approved Shortcut

The To-Be-Approved button automatically sets Hours to Invoice to the approved hours for all rows in the current period. Use this at the end of an approval cycle to quickly prepare the billing run.

Column Visibility

Click the Columns button to show or hide specific columns. This preference is saved per browser session.

9 QuickBooks Online Integration
Requires: Admin role for initial connection; Normal or Admin to push invoices.

Connecting to QuickBooks

  1. Log in as Admin.
  2. Navigate to Billing Summary and click Connect to QuickBooks in the toolbar.
  3. You will be redirected to the Intuit authorisation page. Log in with your QBO credentials and approve access.
  4. You are returned to the portal. The connection status indicator will show Connected.

The OAuth token is stored securely in the database and refreshed automatically. Re-authorisation is required if the token cannot be refreshed (typically after 100 days of inactivity).

Pushing an Invoice to QBO

  1. On the Billing Summary page, locate the billing row you want to invoice.
  2. Ensure the Status is set to Ready To Invoice.
  3. Verify the Client name exactly matches a Customer name in QBO.
  4. Click the Push to QBO button (cloud/upload icon) on the row.
  5. The system creates the invoice in QBO and stores the QBO Invoice ID and Invoice No back in the billing row.

What Gets Created in QBO

The following line items are added to the QBO invoice:

Line ItemQBO Item Code
Basic Salary6 Salaries
SDL006S
UIF006U
COIDA006C
Expense17
Management Fee1 - EY

VAT is applied at 15% on all items except Expense and Adjustment. The invoice due date is set to the 25th of the current month.

Refreshing Invoice Status from QBO

Click Refresh QBO Status in the toolbar to pull the latest payment and email status from QBO for all rows in the current period. Updated fields include:

Fetching an Invoice Number

If an invoice was raised manually in QBO and you need to pull the document number into the portal, click Fetch Invoice No on the row (requires the QBO Invoice ID to already be populated).

⚠ Push Errors If a push fails, the error message is recorded on the billing row. Common causes: Client name does not match a QBO Customer, QBO token has expired, or a required QBO item code does not exist. Fix the underlying issue and retry.
10 Forecast

The Forecast page compares actual hours worked against available PO capacity and planned forecast hours, helping identify potential overruns before invoicing.

Key Columns

ColumnDescription
Hours WorkedTotal hours from timesponge for the period
Hours ApprovedClient-approved hours for the period
Hours AvailableDerived from Limit Order: Still to be Invoiced ÷ Hourly Rate
Hours ForecastedEditable – planned hours for the period (enter your forecast here)
Hours ShortHours Available – Hours Worked (negative = PO overrun risk)

Entering Forecast Hours

  1. Navigate to Forecast.
  2. Click the Hours Forecasted cell for the relevant row.
  3. Type the planned hours and press Enter or click away to save.
Tip: Use the Show Negative Only filter to highlight rows where available PO value may be insufficient to cover hours worked.
11 Reconciling

The Reconciling module matches payroll report data (basic salary paid to contractors) against the billing calculations in the portal to identify discrepancies.

Importing the Payroll Report

  1. Select the correct period.
  2. Navigate to Reconciling.
  3. Click Upload Payroll CSV and select the payroll export file.
  4. The system matches records by Employee Code:
    • Matched records appear in the main reconciling table.
    • Unmatched records (employee codes not found in billing) appear in the Unmatched table at the bottom for manual review.

Reviewing Discrepancies

The table shows both the Payroll Report Basic (what was paid) and the Calculated Basic Salary (from billing). Rows where these values differ are highlighted in red.

Investigate and resolve any highlighted rows before finalising the period.

Editable Fields

12 Analytics Dashboard

Analytics provides a cross-period view of KPIs, trends, and per-person summaries. All periods are aggregated unless a specific filter is applied.

KPI Cards

The dashboard displays the following metrics:

Charts

Person Breakdown Table

Per-person cumulative totals across all periods (hours, salary, invoice totals).

Admin Note: Admins can configure which persons are excluded from shortfall calculations using the Hidden Persons preference setting.
13 Contracts

The Contracts module tracks contractor engagement contracts, including rate, start/end dates, and contract document links.

Fields

FieldDescription
Employee CodeUnique contractor identifier
PersonFull name
Start DateContract commencement date
End DateContract expiry date
Hourly RateRate specified in the contract (ZAR)
Contract LinkURL to the signed contract document

Status Badges

Adding / Editing a Contract

  1. Navigate to Contracts.
  2. Click + Add Contract or the Edit icon on an existing record.
  3. Complete the form and click Save.
15 User Management
Requires: Admin role

Creating a User

  1. Navigate to Users.
  2. Click + Add User.
  3. Enter a Username, Password, and select a Role.
  4. Click Save.
Password Requirements: Passwords are stored using a secure hash. Choose a strong password of at least 8 characters combining uppercase and lowercase letters, numbers, and symbols. Never share passwords or store them in plain text.

Editing a User / Changing a Password

  1. On the Users page, click the Edit icon next to the user.
  2. Update the username, password, or role as needed.
  3. Click Save.

Deleting a User

Click the Delete icon next to the user and confirm. Admins cannot delete their own account.

Changing Your Own Password

Any logged-in user can change their own password via the account menu in the navigation bar, without requiring Admin access.

16 Billing Calculation Reference

The following formulas are applied automatically by the system when calculating billing amounts. All monetary values are in South African Rand (ZAR).

// Input fields Hours to Invoice = User-entered (default: Hours Approved) Hourly Rate = From PO Details / Billing row SDL % = Configurable per row UIF % = Configurable per row COIDA % = Configurable per row Management Fee % = Configurable per row Expense = Manual entry (non-VAT) Adjustment = Manual entry (non-VAT) // Calculations Basic Salary = Hours to Invoice × Hourly Rate SDL = Basic Salary × SDL % UIF = MIN(Basic Salary × UIF %, 177.12) // monthly cap per person COIDA = MIN(Basic Salary × COIDA %, 597.33) // monthly cap per person Management Fee = (Basic Salary + SDL + UIF + COIDA + Expense) × Mgmt Fee % Subtotal = Basic Salary + SDL + UIF + COIDA + Expense + Management Fee + Adjustment VAT (15%) = (Basic Salary + SDL + UIF + COIDA + Management Fee) × 0.15 Total = Subtotal + VAT
Statutory Caps: UIF is capped at ZAR 177.12 per employee per month. COIDA is capped at ZAR 597.33 per employee per month. These caps are enforced automatically.
VAT Note: Expense and Adjustment amounts are included in Subtotal but are excluded from the VAT calculation base.
17 Standard Monthly Workflow

Follow this sequence at the start of each billing cycle:

Step 1 – Create the New Period

Admin  Add the new period (e.g. 2026-05) via the period selector.

Step 2 – Update PO Details

Add or update PO Detail records for any new contractors or projects starting this period.

Step 3 – Upload Limit Order

Export the limit order report from SAP and upload it to the Limit Order page for the new period.

Step 4 – Upload Timesponge

Export the timesheet CSV from your time-tracking system and upload it to the Timesponge page.

Step 5 – Sync Billing

Navigate to Billing Summary and click Sync from Timesponge. Review the generated rows.

Step 6 – Review Forecast

Check the Forecast page for any rows with negative Hours Short. Resolve PO overruns with the client before invoicing.

Step 7 – Adjust Billing Rows

For each billing row:

Step 8 – Push Invoices to QBO

For each row with status Ready To Invoice, click Push to QBO. Verify the Invoice No is populated.

Step 9 – Upload Payroll Report & Reconcile

Upload the payroll CSV to Reconciling and resolve any discrepancies highlighted in red.

Step 10 – Refresh QBO Status

Click Refresh QBO Status to pull payment and email status from QBO. Confirm invoices are marked Emailed.

Step 11 – Lock the Period

Admin  Once all invoices are confirmed and reconciliation is complete, enable the Sync Lock for the period to protect the data.

18 Security Policy

All users of the SRM Portal are responsible for maintaining the security and integrity of the system and the personal and financial data it contains. The following policies apply at all times.

Access & Authentication

Role-Based Access Control

Data Handling

System & Infrastructure

Cloudflare Tunnel Protection

The SRM Portal is published to authorised users over the internet via a Cloudflare Tunnel (cloudflared). This eliminates the need to open inbound firewall ports on the host machine. The layers of protection provided, in order, are:

#Protection LayerWhat It Does
1 Encrypted Tunnel (TLS) All traffic between the host machine and Cloudflare's edge is encrypted via a mutually authenticated TLS tunnel. No inbound ports are opened on the server — the connection is outbound-only.
2 HTTPS Enforcement Cloudflare terminates HTTPS for all users. Plain HTTP requests are automatically redirected to HTTPS, ensuring data in transit is always encrypted (TLS 1.2 / 1.3).
3 DDoS Protection Cloudflare automatically detects and absorbs Distributed Denial of Service (DDoS) attacks at the network and application layers before they reach the server.
4 Web Application Firewall (WAF) Cloudflare's WAF inspects incoming HTTP requests and blocks common web attack patterns including SQL injection, cross-site scripting (XSS), and OWASP Top 10 threats.
5 Bot & Crawler Protection Automated bots and malicious crawlers are identified and challenged or blocked before they reach the application.
6 IP Reputation Filtering Requests from IP addresses with known malicious reputations (based on Cloudflare's global threat intelligence) are blocked at the edge.
7 Rate Limiting Excessive request rates from a single source can be throttled or blocked, protecting against brute-force login attempts and scraping.
8 Zero Trust Access (if configured) Cloudflare Access policies can require additional identity verification (e.g. email OTP, SSO) before a user can even reach the portal login page, adding a layer of authentication in front of the application itself.

Incident Response

19 POPIA Compliance

The SRM Portal processes personal information of contractors and employees as defined under the Protection of Personal Information Act 4 of 2013 (POPIA), which governs the lawful processing of personal information in South Africa. All users must comply with the following obligations.

What Personal Information Is Processed

The portal processes the following categories of personal information:

CategoryExamples
IdentificationFull name, Employee Code
FinancialHourly rate, basic salary, payroll amounts, invoice totals
EmploymentProject assignments, hours worked, contract dates
ContactInvoice email addresses

Lawful Basis for Processing

Data Subject Rights (POPIA Section 5)

Contractors and employees have the following rights regarding their personal information:

Requests must be directed to the designated Information Officer within the organisation.

Data Retention

Breach Notification

Information Regulator (South Africa): Website: inforegulator.org.za
20 GDPR Compliance

Where the organisation operates in or processes personal data of individuals located in the European Economic Area (EEA), the General Data Protection Regulation (EU) 2016/679 (GDPR) applies in addition to POPIA. Many GDPR principles align with POPIA; the following outlines GDPR-specific obligations.

Lawful Basis for Processing (GDPR Article 6)

BasisApplication in SRM Portal
Contract performance (Art. 6(1)(b))Processing contractor hours and billing data to fulfil contractual obligations
Legal obligation (Art. 6(1)(c))Statutory deductions (UIF, SDL, COIDA) and tax record-keeping
Legitimate interests (Art. 6(1)(f))Financial management, invoicing, and business operations

Data Subject Rights (GDPR Chapter III)

RightDescription
Right of access (Art. 15)Data subjects may request confirmation of and access to their personal data
Right to rectification (Art. 16)Data subjects may request correction of inaccurate data
Right to erasure (Art. 17)"Right to be forgotten" – applicable where retention is no longer necessary
Right to restriction (Art. 18)Data subjects may request limited processing while a dispute is resolved
Right to portability (Art. 20)Data subjects may request their data in a structured, machine-readable format
Right to object (Art. 21)Data subjects may object to processing based on legitimate interests

All rights requests must be responded to within 30 days and directed to the Data Protection Officer (DPO) or designated contact.

Data Minimisation & Purpose Limitation

Data Transfers

Breach Notification (GDPR Articles 33–34)

Data Retention (GDPR Article 5(1)(e))

Note: This section provides general guidance only and does not constitute legal advice. Consult a qualified data protection advisor to confirm your specific obligations under GDPR.
21 Troubleshooting
IssueLikely CauseResolution
Timesponge rows showing orange PO indicator No matching PO Detail record for this employee + project Add the record in PO Details, then re-sync billing
Billing sync produces no rows No timesponge data for the period, or no PO Detail matches Verify timesponge upload and PO Details are correct for the period
QBO push fails with "Customer not found" Client name in Billing does not match QBO Customer name Update the Client field in Billing / PO Details to match QBO exactly
QBO push fails with "Token expired" OAuth token has expired and could not be refreshed Admin must reconnect to QBO via Connect to QuickBooks
Reconciling shows red mismatches Payroll amount differs from billing calculation Check Hours to Invoice and Hourly Rate; adjust Payroll Report Basic if the payroll figure is correct
Cannot edit data (all fields read-only) Logged in as Viewer role, or period Sync Lock is active Check your role with Admin; ask Admin to unlock the period if needed
Server not accessible Node.js server is not running Contact your administrator to restart the server
CSV upload fails or imports no records Missing required columns or incorrect column names in CSV Check column headers against the format table in this document; ensure no BOM characters in the file
Session expires unexpectedly 8-hour session timeout reached Log in again; session tokens are not persistent

SRM Portal – Standard Operating Procedure  |  Version 1.1  |  April 2026  |  Internal Use Only