Notifications
The Notifications screen is the portal inbox that surfaces every notification routed to the current user. Each row is a single delivery — one invoice status change matched by a Notification Rule, wrapped with the right subject, message and metadata, and persisted in the F564253 table.
The page is the read side of the notification system. The write side — which event triggers what notification, sent to whom, on which channels — lives in the Notification Rules editor.
A complementary bell in the top utility bar polls the unread count every 30 s and previews the last six entries without leaving the current page; clicking a preview opens the linked invoice modal directly.
The page applies regardless of source system — JD Edwards, SAP, NetSuite or a custom ERP — since the notification payload is built from the persisted UBL invoice, not from the raw source XML.
Opening the inbox
- Sidebar → Management → Notifications.
- Or click the 🔔 bell in the top utility bar, then View all at the bottom of the dropdown.
- The inbox always opens on the All tab; switch to Unread to focus on what has not been acknowledged yet.
At a glance
A notification row carries five visual cues: the status badge at the left (colour from the statuses catalogue), the subject (default Invoice {doc} {dct} {kco} — {statusLabel}), the message (the rule's body or the dispatcher's default), the meta line with the canonical identifiers, and a right column with relative time + the dismiss button.
Toolbar actions
| Action | Effect |
|---|---|
| Refresh | Re-fetches the inbox from /api/notifications, honouring the active tab filter (All vs Unread). |
| Mark all read | Posts to /api/notifications/mark-all-read. Every row that was unread switches to read; the bell badge clears at the next 30 s poll, or immediately on the next focus event. Disabled when there are no unread rows. |
| Filter tabs | All shows every undismissed row; Unread keeps only the rows where read = false. The unread tab carries the ( N ) count next to its label. |
A row, in detail
| Element | Source | Meaning |
|---|---|---|
| Left accent stripe + tinted background | read = false | Unread rows. The stripe disappears the moment the row is marked read. |
| Status badge | NTEV01 joined to the statuses catalogue | The status that fired the notification. The badge background, foreground and border come from the catalogue colours, so 9904 / PA Reject is red, 10 / Deposited is green, 9906 / PA Pending is orange, etc. |
| Subject (top line) | NTSUBJ (rule's emailSubject, or the dispatcher default) | Short, human-readable headline. The default is Invoice {doc} {dct} {kco} — {statusLabel}. |
| Message (second line) | NTMSGE (rule's emailBody, or the dispatcher default) | The fuller body text. Truncated on overflow; the modal that opens on click carries the full lifecycle. |
| Meta line | NTDOC · NTDCT · NTKCO · reason · action · rule | Canonical invoice identifiers, plus the PA rejection reason / expected action / rule name when present. The reason and action are resolved against the rejection-reason-codes and action-codes catalogues, so the user reads the human label, not the bare code. |
| Relative time | NTUPMJ + NTTDAY | just now, 2 min ago, 14:32 (today), Yesterday, then the absolute dd/mm/yyyy hh:mm for older entries. |
| Dismiss button | per-row | Removes the row from the inbox without marking the rest as read. |
Clicking anywhere in the row body opens the invoice detail modal for the linked (doc, dct, kco) triplet — same seven tabs as the E-Invoicing page (Summary, Parties, Lines, VAT, Notes, History, PDF). The row is marked read on the way through.
The 🔔 bell in the navbar
A complementary entry sits in the top utility bar of every page. Three things it does:
- Polls every 30 s the unread count (
GET /api/notifications/unread-count). A red badge shows the count when greater than zero. - Drops down the last 6 entries on click — same shape as an inbox row, but condensed: subject, message, doc reference, relative time. Unread rows carry the same blue dot used in the inbox.
- Clicking a preview marks the entry read and opens the invoice modal directly. The bell uses a small dance to handle both cases: when the user is already on the inbox, it dispatches a
nomaubl:open-notificationwindow event so the modal opens without a remount; otherwise it stores the payload insessionStorageundernotif-auto-openand navigates to/notifications, which drains the entry on cold mount.
A View all footer at the bottom of the dropdown links to /notifications for the full inbox.
The bell stays visible regardless of authentication state: when global.authEnabled != "Y", the inbox shows the broadcast notifications written under the NTUSER='*' sentinel, and the bell counts them.
Storage & retention
Every delivered notification is one row in F564253 (Oracle + Postgres). The columns the inbox cares about are:
| Column | Type | Role |
|---|---|---|
NTUKID | numeric | Primary key. Unique across the whole table — the row addresses no longer carry the (doc, dct, kco) triplet. |
NTUSER | string | Resolved username, or * when running with auth disabled (broadcast). |
NTEV01 | string | 0 for unread, 1 for read. The bell badge counts rows where NTEV01 = 0. |
NTSUBJ / NTMSGE | string | Subject / message body. |
NTDOC / NTDCT / NTKCO | mixed | The invoice triplet; nullable for system-level alerts that don't link to a specific invoice. |
NTUPMJ / NTTDAY | jul / hms | Issue date and time. The composite index on (NTUSER, NTEV01, NTUPMJ DESC) keeps the bell badge query and the inbox sort fast. |
A daily retention sweep in BackgroundScheduler deletes rows older than global.notificationsRetentionDays (default 90 days). Set the property to 0 to disable the sweep — useful for installations that want to keep notifications indefinitely or that drive their own retention policy.
Tips & best practices
- Triage with the Unread tab. Switching to Unread is faster than scrolling the All feed; Mark all read clears every row in one click when the day-end review is done.
- Use the meta line for context. The
reason · action · rulefragment tells you why a notification fired — useful when several rules cover overlapping status codes. - The bell is a peek, not the inbox. It only shows the last six entries; for triage of every undismissed row, open Notifications. The View all footer of the dropdown is the one-click shortcut.
- Dismissing is not the same as marking read. Dismiss removes the row from your inbox; Mark read leaves it in All with no accent. Use Dismiss for entries that don't need an audit trail.
- For PA rejections, click through. A
9904 / PA Rejectrow carries the reason in the meta line, but the lifecycle on the invoice modal's History tab carries the full PA payload and the expected action. - Configure retention. Notifications can grow fast — every status change of every invoice produces a row when a matching rule fires. The 90-day default fits most installations; raise or lower it via
global.notificationsRetentionDays.