Water Utility Reference Public

Administration & Controls

Administering ERPat Water Utility: the fourteen module settings, the thirty-eight permission keys and the duty separations they enforce, building and approving an effective-dated tariff, official-receipt numbering, the scheduled jobs, the audit trail, and the Field Service, portal, SMS and API integrations.

Guide version: r1 Module version: 2.0.0 Updated: 2026-08-23 Estimated time: 11 min 6 views 0% helpful
Running the utility

Administration & Controls

The settings, permissions, rate schedules, receipt controls, scheduled jobs and integrations that sit behind the daily procedures — and the reasoning behind the ones that look inconvenient on purpose.

Module settings

Settings → Water Utility. Fourteen keys, grouped into tabs. They arrive with the schema rather than with the demo data, because the module reads them while it runs — a database that has migrated always has them, whether or not anyone loaded sample data.

SettingShips asWhat it controls
App nameMyWaterThe brand shown in the customer app and portal.
Official receipt modemanualmanual: the teller types a number from the printed booklet and the system only checks it is unused. system: the module issues the next number itself.
Due days15Due date = end of period + N days.
Penalty rate10%Percentage applied once to an overdue amount.
Disconnection grace days7Days past due before an account may be raised for disconnection.
Reconnection threshold00 = the balance must be settled in full before reconnection. A positive figure allows reconnection once the balance is at or below it.
Senior discount enabled1 (on)RA 9994 is a statutory entitlement, so this ships on. The rate and ceiling are tariff configuration — see the note below.
Reader app enabled0 (off)The route-book capture app for meter readers.
Portal enabled0 (off)The OTP customer portal and the MyWater app.
SMS providernoneThe platform ships no SMS gateway. Choose and configure one before relying on text notices or OTP by SMS.
Field Service bridge0 (off)Mirrors service orders into Field Service work orders.
Core invoice mirror0 (off)Optionally mirrors a posted bill as a draft invoice in the core finance ledger.
AI assist0 (off)Assisted reading review. Off by design.
AI data-privacy acknowledgement0Not granted until an administrator acknowledges it in the UI.
ℹ️
Every integration ships OFF. A freshly migrated district never silently activates a gateway, a portal, an external bridge or an AI surface. You turn each one on deliberately, once you have configured what sits behind it.

Permissions and the duty separations

Thirty-eight keys in nine categories, declared by the module and injected into the Roles editor while it is enabled — disable the module and they disappear from the editor rather than lingering as unassignable clutter.

CategoryBase keyCovers
Accountswater_utility_accountBilling accounts — and, deliberately, zones and service connections too: someone who may manage accounts may manage the taps they sit on. There is no separate connection permission.
Meters & Connectionswater_utility_meterThe meter registry and its installation history.
Readingwater_utility_readingCycles, route books, and capturing reads.
Readingwater_utility_reading_validateValidating and rejecting reads, resolving exceptions, closing cycles.
Billingwater_utility_tariffDrafting tariffs, versions and tiers.
Billingwater_utility_tariff_approveApproving a tariff version.
Billingwater_utility_bill_runCreating and computing bill runs.
Billingwater_utility_bill_run_approveApproving and posting a run; cancelling a posted bill.
Collectionswater_utility_cashieringReceipts, teller batches, promises to pay.
Collectionswater_utility_payment_voidVoiding an official receipt.
Enforcementwater_utility_service_orderService orders, notices, disconnection and reconnection.
Advisorieswater_utility_advisoryDrafting and publishing advisories.
Reportswater_utility_reportsThe reports hub, the exports, and the KPI dashboard.
Administrationwater_utility_settingsThe module settings, OR mode, booklet ranges.

Most base keys also carry explicit _create, _update and _delete children, which the Roles editor groups underneath them.

The three separations that matter

????
Compute ≠ approve

A billing clerk computes a run; a supervisor approves and posts it. Give one person both and nobody checks the month's money before it reaches customers.

????
Receipt ≠ void

A teller writes receipts; voiding one is a supervisor's act, with a mandatory reason. The voided number is retained forever.

????
Draft ≠ approve a rate

A tariff version prices every peso billed under it, so approving one is a checker's act. The system additionally refuses to let the person who drafted a version approve their own.

⚠️
Permission keys are frozen once shipped. They are stored by name against every role and user, so renaming one silently revokes access for everybody who had it, with no error anywhere. New capability arrives as a new key, never as a rename.

Building and approving a tariff

A tariff belongs to a customer class. It holds versions, each with an effective date and a board-resolution reference; each version holds tiers. The version whose effective date is the latest one on or before the billing date is the one that prices the bill.

The LWUA shape

Charge typeMeter sizeFromToAmountMeaning
minimum010₱235.00Fallback minimum for any size with no row of its own.
minimum1/2"010₱235.00Covers the first 10 cu.m for a half-inch meter.
minimum3/4"010₱470.00Larger connection, larger minimum.
per_cum1020₱25.50Shared consumption block.
per_cum2030₱28.00
per_cum3040₱31.00
per_cum40(open)₱34.00The open-ended top block.

That is the shape the demo ships, and it is worth understanding because it is not obvious: the minimum varies by meter size, while the consumption blocks are shared across all sizes. The two are resolved independently — a size-specific minimum does not hide the shared blocks.

  • Block bounds: from is inclusive, to is exclusive. Consumption sitting exactly on a boundary bills entirely in the lower block.
  • The catch-all minimum is not optional. Validation also checks the set a meter size with no rows of its own would fall back to. Without a minimum at meter_size = —, that set has no minimum and does not start at zero, and the version will not validate.
  • Exactly one open-ended top block, and it must be last — otherwise consumption above the last bound has no rate.

Approving a version

  1. Draft it

    Create the version with its effective date, board resolution reference and approving authority, then enter the tiers. You can copy the tiers from an earlier version and edit the amounts.

  2. Validate

    Run the validator. It checks every meter size for gaps, overlaps, a block that ends before it starts, a missing or duplicated minimum, and the open-ended top block. The database cannot express these rules, so this check is the only thing between a mis-keyed tier set and a month of wrong bills.

  3. Simulate

    Price a sample consumption against the draft and read the resulting lines. Do this with a real customer's last month before you approve.

  4. Approve

    Needs water_utility_tariff_approve, and cannot be done by the person who drafted it.

⚠️
An approved version is immutable. There is deliberately no way back to draft. A mistake is corrected by creating a new version with a later effective date — which is exactly what a board resolution does in real life, and it keeps every already-issued bill reproducible.

The senior citizen discount

The module ships the discount enabled but with no rate configured, and no ceiling. That is not an oversight. The statutory percentage and the consumption ceiling under RA 9994 must be verified per district against the current implementing rules, so the module refuses to invent them — an unconfigured rate produces no discount line at all rather than a plausible-looking guess.

Until you configure it, a flagged senior account's bill records the refusal reason no_rate_configured in its snapshot, so anyone reviewing the bill can see exactly why the discount was withheld. Configure the rate and ceiling in your tariff and the line appears on the next run.

Official receipts and numbering

The module keeps its own number sequences for accounts, bills, receipts and service orders. The receipt series is the one under external scrutiny.

ModeBehaviourUse when
manual (ships as)The teller types the number from a pre-printed booklet. The system verifies it is not already used and does not advance any internal counter.Your district issues accountable forms on paper — the usual Philippine posture.
systemThe module issues the next number in the series itself.Your OR posture has been signed off for system-generated numbering.

Two rules hold in either mode: a receipt number is never reissued, and a void keeps the number — the row stays, marked voided, with its reason and the person who voided it.

Scheduled jobs

SlugScheduleResponsibility
wu_daily_servicing20 1 * * *Ages receivables, breaks promises whose date has passed, refreshes the enforcement candidate list. It never writes a penalty — the penalty is derived for display and materialises once, as a line on the next bill.
wu_expire_portal_tokens*/30 * * * *Sweeps expired customer-portal OTP and session tokens.
wu_field_sync*/15 * * * *Reconciles service orders with Field Service work orders. No-ops when the bridge is off.
wu_portal_payment_sync*/10 * * * *Reconciles payments started from the customer app. No-ops when the portal is off.

Inspect them with php erpat cron:list; run one by hand with php erpat cron:run <slug>.

Notifications

Nine events are sent automatically. Seven go to the customer, two to your staff. They arrive in the ERPat bell and by email, and are grouped under the Water Utility category in Settings → Notifications.

EventGoes toSent when
Bill is readyCustomerA bill is posted.
Bill due soonCustomerThe nightly sweep, a set number of days before the due date. Skipped for accounts already on the enforcement ladder.
Bill past dueCustomerAn overdue notice is issued. Not repeated once the notice is on file.
Payment receivedCustomerA receipt is issued — at the teller window or from an imported gateway settlement.
Disconnection noticeCustomerA disconnection order is raised.
Service reconnectedCustomerA reconnection order is completed.
Advisory publishedCustomers in the targeted zonesAn advisory is published, from the screen or over the API.
Bill run awaiting approvalStaff who can approve a bill runA run finishes computing. Whoever computed it usually cannot approve it, so this is how the approver finds out.
Reading flaggedStaff who can validate readingsA reading fails a plausibility check. Sent once per finding, not once per cycle.

Who actually receives a customer notification

The account's portal login, plus the client's primary contact. An account that has neither — only a billing email or mobile number on the account record — receives nothing, because ERPat's notification system addresses people, not bare addresses. If your customers should be notified, give them a portal login.

An advisory reaches every portal user in the targeted zones, up to 500 per advisory. Beyond that the notification stops and the shortfall is written to the application log. The advisory itself still appears for everyone on the customer portal and in MyWater, which remain the complete surface for it.

????
The per-event Web and Email switches in Settings → Notifications do not apply to these nine events. Their delivery is fixed by the module, and the setting rows exist only to carry the category. Each person's own notification preferences on their profile are honoured.

Text messages are separate. There is no SMS notification channel — SMS is used only for customer-portal one-time passcodes, and only when you configure a provider (see Module settings).

The audit trail

Roughly seventy distinct events are recorded to the system log — every create, update, status change, approval, posting, void, notice service and settings change, each with the acting user and the before/after values. A sample of what is captured:

approve:tariff_version post:bill_run post:bill cancel:bill create:payment void:payment allocate:payment open / close / remit:collection_batch issue:notice serve:notice dispatch:service_order resolve:reading_exception view:evidence issue / consume:portal_token update:settings

Note that even viewing a meter-reading photo is logged. Evidence images are customer-premises photographs, and who looked at one is a privacy-relevant fact.

Integrations

Field Service

Service orders always live in this module's own ledger. When the bridge is enabled, raising one also creates a Field Service work order and remembers the link on the Water Utility side only — so the module continues to work exactly the same with Field Service switched off or uninstalled.

Core invoice mirror

Off by default. When enabled, a posted bill is also mirrored as a draft invoice in the core finance ledger for districts that consolidate there. The water bill remains the source of truth either way.

Customer portal and the MyWater app

Two tiers. A guest customer verifies by OTP and gets a scoped, expiring token that can view bills and pay. A customer with a full account signs in properly and gets the offline-capable MyWater app. Either way, every request is scoped to the accounts that customer actually owns.

SMS

The platform ships no SMS gateway. Until you choose and configure a provider, OTP-by-SMS and text notices are unavailable — email and printed service remain.

The two API surfaces

SurfacePrefixWho calls itAuthorised by
Integration API/api/v1/water-utility/*Another system — a cash-collection partner, a reporting warehouseOAuth scopes water_utility:read / water_utility:write
End-User API/v1/api/water-utility/*The customer app, on behalf of one signed-in personThe signed-in identity, scoped to the accounts they own

Data protection

  • Meter photographs are premises imagery. They default to internal visibility and every view is logged.
  • Reader GPS is captured to confirm a read happened at the tap, not to track staff. Treat the retention period as a policy decision your district must make.
  • Portal tokens are credentials. They are stored as digests, are short-lived, and are swept on a schedule. They are never exported and never included in demo data.
  • Senior citizen IDs are sensitive personal information. They are collected only where the discount is claimed.

Next steps

Was this guide helpful?

Report a content problem