Use the real payroll vendor logos on the provider cards
Adds the ten vendor assets and renders them in place of the lettermark placeholders. These are WORDMARKS, not square icons like the email provider set, and the...
Carry whether a ticket is one of the items the support badge counts
The navtop badge and the ticket list were answering different questions and nobody could tell. The badge counts items awaiting attention — overwhelmingly ticket...
Payroll Provider Setup, and map people to payroll on enrollment
Replaces the placeholder HRS Overview tab with the real thing. The tab is now "Provider Setup" and the screen is "Payroll Provider Setup", following the email p...
Index and REVOKE the payroll-provider tables
What Hibernate cannot express for the new hr_timecard_payroll_* tables. Two REVOKEs. PayrollDispatch and PayrollSyncIssue refuse updates and deletes in Java th...
Size an attachment by what the provider's API actually carries
The composer held every social DM to a flat 10 MB, which is Telegram's photo limit applied to four providers that do not share it. Each now gets its own ceiling...
Nightly payroll-provider sync job
Drives TimecardService's **************** which syncs every organization whose next sync is due. Cron lives here rather than in TimecardService because that de...
The authorization boundary for payroll provider setup
Relays the new **************** surface and enforces who may reach it. TimecardService holds the engine and no session; this holds the session and decides. Secu...
The payroll-provider domain behind the timecard engine
Adds the persistence spine for connecting an organization's timecards to a third-party payroll system: the connection and its encrypted per-org config, the OAut...
A wall at "now", and a card that explains a cancelled punch
Nobody can record time they have not worked yet. Dragging an edge, sliding a whole span, nudging with the arrow keys, the magnet, the right-click block and the ...
Give the support and social windows the member chat's composer
A support ticket and a social DM are the same thing as a member chat — a media session with messages on it — but they were answered through a bare text field. A...
Speed dial lists the org's department extensions
The tab shipped six invented entries — Sales Team on 1001, a Conference Room permanently ringing — so dialling one reached whatever happened to answer that exte...
Widen chat, social, ai-chat and compose windows to the support size
The support ticket window opens at 460px while member chat, social chat, AI chat and the email composer all sat at 360-420. Same dock, same kind of content — th...
Show unseen messages on every queue row, not just joined ones
The badge and the row tint were already here — they were simply never populated for most of the list. getUnreadFor read only the live per-session unread map, wh...
Stamp unseen counts on the ticket list, and keep the queue live
getTickets now bulk-loads an unseen-message count per row for the caller, beside the visitor rows it already loads that way, and getTicketDetail computes its ow...
Count unseen messages for a viewer who is not in the conversation
Unread has always been derived from the viewer's own MediaSessionMember row, so a conversation they had not joined produced no count at all. On a support queue ...
Delete, magnets, a right-click menu, and a clock that asks which
Six additions to the period graph and the nav clock. DELETE removes the focused pill. Backspace too, because on a Mac the key labelled "delete" IS Backspace an...
Relay the punch void
Passthrough for POST /punches/{id}/void, the editor's delete key and the machinery behind merging two adjacent spans. Same authority as /correct, and for the s...
A punch can be voided without being deleted
Four nullable columns and a second write-once transition on TimecardPunch. A void says the punch should never have existed — a double tap on the clock, an aband...
The void columns on hr_timecard_punch
Mirrors four new nullable columns on the TimecardPunch entity. A void is neither a delete nor a correction: it says the punch should never have existed — a doub...
Show the market onboarding panel when no CRM markets exist
/leads rendered the lead grid with an empty, disabled market tab bar for an org that had never configured a CRM market. It now shows the same onboarding panel /...
The period graph, and a timecard you edit as a draft
Replaces the one-day timeline on **************** with a whole pay period, and changes what editing one feels like. The pills carry no text. They used to carry...
Relay the editor's period range
Passthrough for GET /members/{id}/range, the period graph's read. from/to are forwarded only when present so TimecardService can resolve the member's own pay pe...
Raise a support conversation when somebody replies in it
Closing a support window is not leaving the conversation, but it was treated as if it were. ChatNotificationListener returned early on every SUPPORT_TICKET noti...
One conversation, many hands — join on open, name every message, re-open on a reply
A support ticket is worked by whoever is helping, not only by whoever it is currently stamped with. Assignment decides who the work is offered to and whose list...
Linkable tabs, a working Add Member, and a full history tab
Every tab on /account/view/{id} is a real route now — /members, /history and the rest are links somebody can send, bookmark, or land on. Old ?tab= links redirec...
Create ACCOUNT_HISTORY
Mirrors the AccountHistory entity in kamo-shared-library. Written explicitly rather than left to ddl-auto because the defaults matter: ID and DATE_CREATED carry...
Account history endpoints, real member rows, an all-members directory
The account view can now say what has happened to an account and who is on it. - Every mutation on the account surface records history: create, field edits, ...
An audit trail for accounts, and a directory that includes non-staff
ACCOUNT_HISTORY records what happens to an account the way LEAD_HISTORY records what happens to a lead — deliberately the same columns, because the internal sit...
Confirm a clock in/out before writing the punch
The nav clock punched straight off the click. Every other control in that bar is idempotent or trivially undoable; a punch is a wage record that afterwards only...
Segmented status filter in place of the select
Pending/Complete/All are three short peers that fit on one line, so a dropdown hid two of them behind a click and spent a label and a 170px well to say nothing....
Slide a crowded nav instead of crushing its options
Pinning more options than a nav can show squeezed the tiles out of shape: both strips were raw overflow boxes and the tiles are flex children with no flex-shrin...
Index the collection detail pages in 19 more languages
The sync finished, so the ~2,400 detail pages that were noindexed for having English body copy now have real translations and can be indexed. Measured across al...
Per-member overdue rollup for the compliance matrix
The HR Overview's matrix branches on `row.overdue > 0`, but the legal and training rollups shipped with that field hardcoded to 0 — a branch that could never be...
Build the Overview tab as a report over the other four
Full-width reporting console: masthead readout, four tab pillars, the needs-attention ledger, the workforce compliance matrix and an activity rail. Read-only — ...
Overview attention ledger, compliance matrix and activity rail
useMemberNames sources /api/security/members/names rather than the brief's guessed .../org-config shape: org-config never returns a member list (confirmed by re...
Overview data hook and shared visual primitives
useHrOverview fetches attendance + docs summaries with allSettled so one dead service degrades only its own sections; it skips fetches entirely for sections vis...
Bounded count/sum/recent queries for one org+assoc live set
HrResourceSummaryService was materialising an org's entire non-hidden Img collection into memory to compute a count, a byte sum and a 5-row recent slice. Adds c...
Legal, training and resource summary for the HR Overview
One read per tab domain, each block gated on its own right and omitted rather than refused when out of reach.
Attendance summary for the HR Overview
One MANAGE_TIMECARDS-gated call composing the roster and manager-queue relays with the local exception, employment and pay-period rows.
Localize the hub cards and stop bundling the English datasets
The four hub pages rendered client components that imported the collection modules directly and took no props, so every card — industry names, integration tagli...
Summary queries for the HR Overview
Status histograms, overdue slices and per-member rollups for legal and training, plus template/course status counts. No entity change.
Glow red when off the clock, green when on, and drop the bullet
Being off the clock while at work is the state that costs someone money, and it was the one state nothing announced: the indicator was simply absent, and an abs...
An Enrollment tab, and hide the member Timecard tab when not enrolled
There was no way to turn timecards on for anyone. Every read surface existed and every one of them correctly showed nothing, because no enrollment could be crea...
Relay enrollment
MANAGE_TIMECARDS to read or change who is on timecards — enrollment decides who gets paid from this system, so it is held to the HR administrator right rather t...
Translate the collection pages instead of hiding them
The 2,400 noindexed detail pages were noindexed because their body copy has no translation: competitors, industries, integrations and glossary keep their prose ...
The Approvals and Exceptions tabs actually exist now
Both backends shipped earlier but neither panel was ever written, so /hr/attendance?sub=approvals and ?sub=exceptions rendered "this tab is being built" over wo...
Relay the exception queue
MANAGE_TIMECARDS to read the queue and to waive, because the queue names every member with a problem and waiving changes what the finalize gate reads. The per-m...
The partial indexes that stop a double payment and a code collision
**************** is the teeth behind the export service's refusal to re-issue. A second committed file for one pay period double-pays an entire company, and the...
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
