ThreadCount Community edition
Uniform stock management for healthcare linen rooms: the coordinator app, the phone counter and the staff app, for your own server. Built from a113353 on 2026-09-15. Licensed under the Functional Source License (FSL-1.1-ALv2).
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
---
|
||||
title: Deactivating and deleting
|
||||
section: people
|
||||
order: 5
|
||||
summary: Deactivate someone who has left and keep their history, delete only a record entered by mistake, remove staff-app access, and handle a privacy request.
|
||||
screen: People › a person
|
||||
role: Admin
|
||||
keywords: deactivate, inactive, leaver, left, delete staff, remove, reactivate, history, finance, remove access, staff app account, privacy, personal information
|
||||
---
|
||||
|
||||
## Deactivate or delete
|
||||
|
||||
Someone who has left is deactivated. Their record stays, and so does everything recorded against it.
|
||||
|
||||
Delete removes the record itself. It is for a record entered by mistake, and it is refused for anyone with history.
|
||||
|
||||
## Deactivate
|
||||
|
||||
`Deactivate` is on the person's page.
|
||||
|
||||
It is refused while anyone else still active names them as manager, and the refusal says how many. Give those people a new manager first. Somebody who is only their own manager is not held up by this.
|
||||
|
||||
When it goes through:
|
||||
|
||||
- Every request for them still waiting on approval is closed as declined, with the reason that they are no longer on the register and a timeline entry. The page says how many were closed. Nobody is emailed about it.
|
||||
- The counter refuses to issue to them, and they drop out of the Counter search.
|
||||
- A request cannot be raised for them at the counter or in the staff app.
|
||||
- Their staff-app sign-in is refused with `You're no longer on the register at this facility. Ask the linen room.` Sessions already open stop working.
|
||||
- An emailed approval link about them, or sent to them as a manager, shows no details and decides nothing.
|
||||
- They leave the register's tiles and missing lists, and are hidden unless `Show inactive` is ticked.
|
||||
|
||||
`Reactivate` puts them back. Requests closed at deactivation stay closed and have to be raised again.
|
||||
|
||||
## What stays for finance
|
||||
|
||||
A deactivated record keeps its issues, orders, approvals, hand-ins, alterations, requests and notes. Each issue keeps the cost it was issued at, so reports and the [journal export](/docs/reports/journal-export) go on including it. The People export writes `Inactive` under `Register status` for them.
|
||||
|
||||
## Delete
|
||||
|
||||
`Delete` appears on the person's page only when they have no issues and no orders. The server then checks everything else, and refuses if the record has any of:
|
||||
|
||||
- issues, orders, manager approvals, alterations or hand-ins;
|
||||
- requests for them or raised by them;
|
||||
- waitlist places, kit-check answers, damage reports or queries;
|
||||
- a staff-app account.
|
||||
|
||||
The refusal lists what was found and says to deactivate instead.
|
||||
|
||||
> **Careful** A delete cannot be undone.
|
||||
|
||||
## Remove staff-app access
|
||||
|
||||
The `Staff app` panel on the person's page manages their account.
|
||||
|
||||
- **Remove access** deletes the account after a confirmation. Every session it had ends at once and any code is cleared. The register entry and history stay. To sign in again they need a new code.
|
||||
- **Cancel the code** withdraws a code that has not been used. A code also stops working 14 days after it was generated.
|
||||
|
||||
Removing access does not deactivate the person. See [the staff app](/docs/apps/staff-app).
|
||||
|
||||
## Privacy requests
|
||||
|
||||
ThreadCount has no screen that exports or erases one person's information in a single step. What it has:
|
||||
|
||||
- The staff app shows a person their own record, and a query they raise there about it reaches the linen room.
|
||||
- The People export, searched to one name, gives that person's register row without notes or start date.
|
||||
- The backup holds the whole facility. See [export and backup](/docs/account/export-and-backup).
|
||||
- Notes can be edited or cleared on the person's page.
|
||||
- A record with history cannot be deleted; it can be deactivated and its access removed.
|
||||
|
||||
The [privacy policy](/privacy) tells staff to ask their coordinator to remove their access, and says their register entry and history stay because the facility needs them for its own records. Anyone who would rather not ask their coordinator can write to privacy@threadcount.tech, and the request is routed through the facility's own privacy process.
|
||||
|
||||
Deleting a whole facility is on [delete an account](/docs/account/delete-an-account).
|
||||
|
||||
## What is written
|
||||
|
||||
| Record | Change | Undo |
|
||||
|---|---|---|
|
||||
| Deactivate | The record marked inactive; waiting requests declined. | `Reactivate`. Closed requests stay closed. |
|
||||
| Delete | The record removed. | None. |
|
||||
| Remove access | The staff-app account deleted, any code cleared. | Generate a new code. |
|
||||
| Cancel the code | The code cleared. | Generate a new code. |
|
||||
@@ -0,0 +1,82 @@
|
||||
---
|
||||
title: The entitlement rule
|
||||
section: people
|
||||
order: 3
|
||||
summary: Six sets held at any time, for every group, with no financial year. How sets held are counted, how hand-ins make room, and where overrides are recorded.
|
||||
screen: Settings › Issuing rules
|
||||
role: Admin or Issuer
|
||||
keywords: entitlement, six sets, ceiling, cap, allowance, sets held, over the ceiling, override, hand-in, credit, yearly figure, financial year
|
||||
---
|
||||
|
||||
## The rule
|
||||
|
||||
Nobody holds more than the ceiling: 6 sets unless the facility sets its own. It limits what a person holds at any one time, and it is the same for every staff group and every route. There is no financial year in it and nothing resets in July.
|
||||
|
||||
A set is one top and one pair of trousers. The ceiling applies to each half, so 6 sets means at most 6 tops and at most 6 pairs. Somebody holding 6 tops and 2 pairs can take another pair, not another top.
|
||||
|
||||
Garments that are part of no set, such as fleeces, jackets and maternity wear, have their own ceiling of the same number, counted in garments.
|
||||
|
||||
Past the ceiling, the next garment comes only after a hand-in or on a coordinator's override.
|
||||
|
||||
## How sets held are counted
|
||||
|
||||
A garment's type decides which half it is.
|
||||
|
||||
| Half | Types |
|
||||
|---|---|
|
||||
| Top | `Shirt`, `Polo`, `Tunic`, `Scrub top`, `Blouse` |
|
||||
| Trousers | `Pants`, `Trousers`, `Cargo pants`, `Shorts`, `Skort`, `Skirt` |
|
||||
|
||||
A garment with no type is judged by its name. A type typed in by hand that is not on the list counts toward no set, so pick from the list.
|
||||
|
||||
What a person holds is the total of:
|
||||
|
||||
- everything issued to them and not handed in or returned, pre-loved garments included;
|
||||
- orders placed for them, drafts included, less what has already arrived;
|
||||
- pickups waiting for them at the counter;
|
||||
- request lines a manager has approved that nobody has collected.
|
||||
|
||||
People, the person's page and the counter all use this count.
|
||||
|
||||
## At the counter
|
||||
|
||||
A bag that would take someone past either ceiling is refused, with a sentence giving what they hold, how much of it is still to come, and the ceiling. The check runs again as the issue is saved, so two counters serving one person at once cannot both pass.
|
||||
|
||||
Ticking the override lets the issue through. See [issue a garment](/docs/counter/issue-a-garment).
|
||||
|
||||
## Where overrides are recorded
|
||||
|
||||
- Each issue row that went past the ceiling is stamped as an override, pre-loved rows included. It shows as an `Override` tag in the person's `Issue history`.
|
||||
- For garments ordered in, the order's notes say the person is past the ceiling and name the coordinator who recorded the override.
|
||||
- The People screen's `Over the ceiling` tile counts everyone above it, and their row's status is `OVER`.
|
||||
- The monthly exceptions report lists `Past 6 sets on an override`.
|
||||
|
||||
The stamp is written only when the ceiling was actually passed. Garments outside a person's staff group or uniform style carry their own separate stamps.
|
||||
|
||||
## Hand-ins
|
||||
|
||||
`Record hand-in` on the person's page makes room straight away. Matched issues are marked handed in and stop counting toward what the person holds, whether or not the credit box is ticked. Where only part of an issue line comes back, the line is split.
|
||||
|
||||
- `Good` garments join the pre-loved pool. `Rag` garments are counted for disposal.
|
||||
- The credit tick gives sets back to the manager's approvals, newest first, and credits the yearly figure. Only good garments matched to new issues earn credit; pre-loved garments do not.
|
||||
|
||||
Returns and exchanges are on [exchanges and returns](/docs/counter/exchanges-and-returns).
|
||||
|
||||
## The facility's own figures
|
||||
|
||||
`Settings › Issuing rules` holds three figures:
|
||||
|
||||
| Field | What it does |
|
||||
|---|---|
|
||||
| `Ceiling, every group (sets)` | The rule on this page. A blank, nought or unreadable entry saves as 6. Fractions are rounded down. |
|
||||
| `Starting kit (sets)` | The first-day kit for groups on the starting kit. |
|
||||
| `Yearly figure for reports (garments)` | What a year's drawing is measured against on Reports. It never limits the counter. A person's own figure can be set on their record; groups on the FTE table are not measured. |
|
||||
|
||||
## What is written
|
||||
|
||||
| Record | Change | Undo |
|
||||
|---|---|---|
|
||||
| Issue with override | Issue rows stamped as an override, or a note on the order. | Return or hand in the garment. The stamp stays. |
|
||||
| Hand-in | A hand-in record, matched issues marked handed in, the pool updated. | None on screen. |
|
||||
| Credit tick | Approval balances and the yearly figure credited. | None on screen. |
|
||||
| Change the ceiling | The facility's ceiling. | Set it back. |
|
||||
@@ -0,0 +1,74 @@
|
||||
---
|
||||
title: Staff groups and routes
|
||||
section: people
|
||||
order: 2
|
||||
summary: Name your staff groups, put each on the FTE table, the starting kit or manager approval, and restrict garments by group.
|
||||
screen: Settings › Issuing rules
|
||||
role: Admin
|
||||
keywords: staff groups, groups, routes, fte table, starting kit, manager approval, initial kit, nursing, rename group, garment groups, outside group
|
||||
---
|
||||
|
||||
## Name your groups
|
||||
|
||||
Staff groups are the facility's own names, listed under `Settings › Issuing rules` in `Staff groups`. A new facility has none, and ThreadCount reads nothing into the letters of a name.
|
||||
|
||||
- **Add** a name in `New staff group`. It starts on manager approval.
|
||||
- **Rename** changes the name on the list, on its route, on every staff record filed under it and on every garment tagged for it, in one step. Renaming onto a name already in use is refused. Changing only the case or spacing is allowed.
|
||||
- **Remove** (`×`) is refused while any active staff member is filed under the group. Move them, or rename the group instead.
|
||||
|
||||
A staff import files people under whatever group the file names and adds nothing to this list. Groups on the register but not on the list are shown below it, each with an `Add` button and a head count. Their staff are on manager approval until the group is added and given another route. With no groups at all, everybody is on manager approval.
|
||||
|
||||
An Issuer can read the routes but not change them.
|
||||
|
||||
## The three routes
|
||||
|
||||
Each group takes one route, picked with the `FTE table`, `Starting kit` or `Manager approval` buttons on its row. A group cannot be on two; the server refuses the save. If a restored backup carries a group on both, it is read as being on the FTE table.
|
||||
|
||||
Every route stops at the same ceiling of sets held (see [the entitlement rule](/docs/people/entitlement-rule)). The routes differ only in how somebody gets there.
|
||||
|
||||
## The FTE table
|
||||
|
||||
The person's `Combined FTE` proposes their initial kit:
|
||||
|
||||
| FTE | Sets proposed |
|
||||
|---|---|
|
||||
| `1.0`, `0.9` | 5 |
|
||||
| `0.8`, `0.7` | 4 |
|
||||
| `0.6`, `0.5` | 3 |
|
||||
| `0.4`, `0.3` | 2 |
|
||||
| `0.2`, `0.1` | 1 |
|
||||
| `Casual` | None. The form names 1, 2 or 3 and leaves the number to the manager. |
|
||||
|
||||
A fraction not on the table, such as `0.75`, is read by the band it falls in. With no FTE recorded, no kit is proposed and the register lists the person under `No FTE`.
|
||||
|
||||
The proposal is not a limit. A manager may sign for more, and the signed form is recorded as written with a sentence added, such as `Above the FTE table: 5 sets at 0.6 FTE, where the table proposes 3.` A signature does not lift the ceiling.
|
||||
|
||||
## The starting kit
|
||||
|
||||
`Starting kit (sets)` under `Settings › Issuing rules` is what the group is handed on the first day: 3 sets unless the facility sets its own. A blank or nought saves as 3, fractions are rounded down, and a figure above the ceiling is read as the ceiling. After that, more is issued as needed up to the ceiling. Nothing has to be handed back first.
|
||||
|
||||
## Manager approval
|
||||
|
||||
There is no starting kit. The person's manager approves sets, on a signed order form recorded on the person's page or on a request in the staff app.
|
||||
|
||||
> **In plain terms** The counter refuses on the ceiling, the staff group and the uniform style. It does not refuse an issue because no approval is on file.
|
||||
|
||||
On the person's page, `Initial kit` counts every garment ever issued to them that was not pre-loved, against the kit their route gives. It is a lifetime count, and a hand-in does not give it back.
|
||||
|
||||
## Garments restricted by group
|
||||
|
||||
Each catalogue garment is tagged for one or more staff groups, or for all groups when it has no tag. See [catalogue, sizes and cuts](/docs/stock/catalogue-sizes-and-cuts).
|
||||
|
||||
- The staff app refuses a request for a garment outside the person's group. The one exception is a damage replacement for a garment they already hold.
|
||||
- A request raised at the counter is refused the same way.
|
||||
- Issuing one at the counter needs a coordinator override. Each issue row is stamped as outside the group; for a garment ordered in, the order's notes say so instead.
|
||||
- The monthly exceptions report lists these as `Outside their staff group on an override`.
|
||||
|
||||
## What is written
|
||||
|
||||
| Record | Change | Undo |
|
||||
|---|---|---|
|
||||
| Add group | The facility's group list. | Remove it while nobody active is filed under it. |
|
||||
| Pick a route | The facility's FTE-table and starting-kit lists. | Pick the old route. |
|
||||
| Rename | The list, the route, staff records and garment tags. | Rename it back. |
|
||||
| Remove | The group comes off the list and off its route. | Add it back and pick its route again. |
|
||||
@@ -0,0 +1,68 @@
|
||||
---
|
||||
title: Managers
|
||||
section: people
|
||||
order: 4
|
||||
summary: The one manager on each record approves that person's requests and signs their order forms. Self-approval, raising for others, email links and changing a manager.
|
||||
screen: People › a person › Details & access
|
||||
role: Admin
|
||||
keywords: manager, approver, approval, sign, order form, self-approved, own manager, reports to, email link, needs an approver, re-address, reassign
|
||||
---
|
||||
|
||||
## One manager, both jobs
|
||||
|
||||
Each record names at most one manager, in the `Manager` box under `Manager's approval` on the person's page. That person approves their requests in the staff app, and a signed paper order form for them is recorded as signed by that manager.
|
||||
|
||||
1. **Type a name or staff number.** Only active people on the register are offered.
|
||||
2. **Pick the name.** It saves straight away.
|
||||
|
||||
`Change` picks someone else. `Remove` clears it after a confirmation. Setting a manager who is inactive is refused. The import's `manager` column sets the same field, by staff number.
|
||||
|
||||
Nobody can raise a request, in the staff app or at the counter, without a manager set. A manager who has left the register counts as none: the request is refused with `The recorded manager is no longer on the register.`
|
||||
|
||||
`Whose requests they approve`, lower on the manager's own page, lists everyone who names them. `Add somebody who reports to them` changes that other person's record, after a card that names who they are being moved from.
|
||||
|
||||
## What a manager sees and signs
|
||||
|
||||
In the staff app, a manager has an approvals queue, oldest first. They approve or decline each garment, or the whole request. A decline needs a reason from a fixed list, and the wearer is emailed the decision if they have an account. A manager with people reporting to them also has a ward view listing those people, what they hold, and their sets against the ceiling. See [manager approvals](/docs/counter/manager-approvals) and [the staff app](/docs/apps/staff-app).
|
||||
|
||||
The linen room cannot approve on a manager's behalf.
|
||||
|
||||
On paper, `Record a signed order form` takes the sets, FTE, the date signed (not after today), an optional note and a photo of the form. It needs an active manager set, and records their name linked to their record. An Admin or Issuer can record one; only an Admin can remove one.
|
||||
|
||||
## Self-approval
|
||||
|
||||
Anyone may be recorded as their own manager. The box then shows `(themselves)` and a `Self-approved` tag.
|
||||
|
||||
- A request they decide for themselves is written into its timeline as their own request, marked `Self-approved`, naming them as both the manager and the person it is for.
|
||||
- A signed form they approved for themselves is tagged `Self-approved` on their record.
|
||||
- In the approvals queue, their own requests are set apart under `Your own request`.
|
||||
|
||||
## Raising for somebody else
|
||||
|
||||
A manager can raise a request for the people who report to them. Nobody approves a request they raised for somebody else, so it goes to the raiser's own manager instead. If there is nobody above, or the raiser is their own manager, it is created with no approver and waits under `Requests › Needs an approver`.
|
||||
|
||||
The linen room re-addresses a waiting request from there. Re-addressing it to the person who raised it is refused. Sending it to the person it is for is allowed only if they are recorded as their own manager.
|
||||
|
||||
## Email links
|
||||
|
||||
When a request is addressed to a manager who has a staff-app account, and the server is set up to send mail, the manager is emailed a link to approve or decline it.
|
||||
|
||||
- The link lasts 14 days, and works only while the request is still waiting. Once a decision is made, both links in the email stop working.
|
||||
- Opening the link shows the request. The decision is made by pressing a button on that page, not by opening the link.
|
||||
- If the manager or the wearer is no longer on the register, the page shows no details and decides nothing.
|
||||
- A request for the manager's own uniform says `Your own uniform`.
|
||||
|
||||
A manager with no staff-app account is not emailed. The request still waits for them.
|
||||
|
||||
## Changing a manager
|
||||
|
||||
New requests go to the new manager. Requests already waiting stay addressed to the old manager until the linen room re-addresses them. A manager cannot be deactivated while anyone else active still names them; give those people a new manager first. See [deactivating and deleting](/docs/people/deactivating-and-deleting).
|
||||
|
||||
## What is written
|
||||
|
||||
| Record | Change | Undo |
|
||||
|---|---|---|
|
||||
| Set or change a manager | The person's manager. | `Change` or `Remove`. |
|
||||
| Record a signed form | An approval with sets, FTE, date, signer, note and photo. | `×` on the approval (Admin). |
|
||||
| Re-address a request | The request's manager, and a timeline entry. | Re-address again while it waits. |
|
||||
| Approve or decline | Request and garment statuses, and a timeline entry. | None. |
|
||||
@@ -0,0 +1,73 @@
|
||||
---
|
||||
title: The staff register
|
||||
section: people
|
||||
order: 1
|
||||
summary: Who is on the register, what each record holds, how to add, import, edit and search it, and what a person's page shows.
|
||||
screen: People
|
||||
role: Admin
|
||||
keywords: staff register, staff, people, add staff, import, roster, csv, payroll number, sizes, fte, uniform style, search, export, missing, approver
|
||||
---
|
||||
|
||||
## What a record holds
|
||||
|
||||
Each person on the register is one record. `Add staff member` opens the form.
|
||||
|
||||
| Field | Notes |
|
||||
|---|---|
|
||||
| Staff number | Required and unique in the facility. It cannot be changed after the record is saved, because issue history and reports are keyed to it. |
|
||||
| First and last name | Both required. |
|
||||
| Phone, group, department or ward | The group decides the person's route (see [groups and routes](/docs/people/groups-and-routes)). The ward decides the cost centre unless an override is set. |
|
||||
| Top size, pants size | One of each. |
|
||||
| Uniform style | `Men's`, `Women's`, `Either`, or blank. Blank offers every style, as `Either` does. |
|
||||
| Combined FTE | `1.0` down to `0.1`, or `Casual`. Only read for groups on the FTE table. |
|
||||
| Yearly report figure | Garments. Used by reports only; the counter never refuses on it. |
|
||||
| Cost centre override, start date, notes | Optional. |
|
||||
|
||||
The manager and the `On the ward desk` tick are set on the person's page, not on this form. When the plan's staff limit is reached, a new record is refused with `The register is full for this plan`.
|
||||
|
||||
## Import from a spreadsheet
|
||||
|
||||
`Settings › Data` imports the `Staff register` template. Its columns are `num,first,last,phone,group,dept,cc,manager,fte,style,top,pants,ccoverride,ent,start,notes`.
|
||||
|
||||
- A row with no `num` or no `first` is skipped.
|
||||
- A row whose staff number is already on the register updates that record. Only cells with something in them are written; a blank cell keeps what is there.
|
||||
- `dept` with `cc` creates the department if it does not exist.
|
||||
- `manager` is the manager's staff number, not their name. Managers are linked after every row is in, so a manager can appear anywhere in the file. A number that matches nobody is reported.
|
||||
- An `fte`, `start` or `style` cell that cannot be read is reported and left blank. Dates are written `YYYY-MM-DD`.
|
||||
- At most 20,000 rows at a time. Rows past the plan's staff limit are skipped and the refusal is reported once.
|
||||
|
||||
An import does not add group names to `Settings › Issuing rules`. See [groups and routes](/docs/people/groups-and-routes) for what that means. The template itself is on [CSV templates](/docs/reference/csv-templates).
|
||||
|
||||
## Search, filter and export
|
||||
|
||||
The search box matches name, staff number or ward. Beside it are a group filter, a filter for what records are missing, and `Show inactive`.
|
||||
|
||||
The missing filter has two parts. `Has to be set` lists `No approver` (no manager, or a manager no longer on the register), `No FTE` (FTE-table groups only) and `No sizes`. `Optional` lists `No staff app` and `No uniform style`. Inactive records are never in these lists.
|
||||
|
||||
The tiles count the whole active register, whatever the search: `On the register`, `On a ward desk`, `Over the ceiling` and `Records to finish`. Each row's `Status` is `OK`, `AT LIMIT` (a full half of a set), `OVER` or `Inactive`.
|
||||
|
||||
`Export CSV` downloads the rows on screen. It uses the import's headers, so a ward's list can go to its manager, come back with `Manager number` filled in, and be imported again. `Approver name (reference only)` is ignored on import. Notes and start dates are left out of the file.
|
||||
|
||||
## Last sizes
|
||||
|
||||
The register holds one top size and one pants size. In the staff app, a request starts from the register's size for a top or trousers. For any other garment, or where the register has no size, it starts from the size of the last one that person was issued. The ward desk's raise screen does the same for garments the register has no size for.
|
||||
|
||||
## A person's page
|
||||
|
||||
Click a name to open it. It shows:
|
||||
|
||||
- `Details`, with `Edit details`, `Deactivate` and, for a record with no issues and no orders, `Delete`.
|
||||
- `Uniform held and owed`: sets held against the ceiling, room left, anything still on order, sets signed for and not collected, the `Combined FTE` picker (saved as soon as it changes) and the initial kit.
|
||||
- `Manager's approval`: the manager, `Print order form`, and the signed forms recorded. See [managers](/docs/people/managers).
|
||||
- `Previous order forms`, `Notes`, `Waiting for pickup`, `Staff app` and `Whose requests they approve`.
|
||||
- `Alterations`, `Uniform hand-ins`, `Issue history` (with an `Override` tag where one was recorded) and `Orders for this staff member`.
|
||||
|
||||
## What is written
|
||||
|
||||
| Record | Change | Undo |
|
||||
|---|---|---|
|
||||
| Add staff member | A new staff record. | Delete it while it has no history. |
|
||||
| Edit details, FTE picker | The fields on the record. | Edit again. The staff number cannot change. |
|
||||
| Import | Records created or updated, managers linked, departments created. | None. Import a corrected file, or edit by hand. |
|
||||
|
||||
Every change is listed under `Activity`.
|
||||
Reference in New Issue
Block a user