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,119 @@
|
||||
---
|
||||
title: CSV templates
|
||||
section: reference
|
||||
order: 1
|
||||
summary: The six import files, the columns each one reads, how a row is matched to a record, and what every importer message means.
|
||||
screen: Settings › Data & audit log
|
||||
role: Admin
|
||||
keywords: csv, import, template, spreadsheet, columns, headers, upload, catalogue, staff register, departments, barcodes, reorder levels, opening balances, bulk load
|
||||
---
|
||||
|
||||
## Load order and the basics
|
||||
|
||||
Under `Settings › Data › Import from CSV`, an Admin picks a file kind, presses `Download template` for `threadcount-<kind>-template.csv` (header row plus one example row), fills it in, saves it as CSV and presses `Import CSV`.
|
||||
|
||||
Load in this order, because later files look up what earlier ones created:
|
||||
|
||||
1. **Departments & cost centres** (`depts`)
|
||||
2. **Catalogue** (`catalog`)
|
||||
3. **Staff register** (`staff`)
|
||||
4. **Supplier barcodes** (`barcodes`)
|
||||
5. **Opening balances** (`opening`)
|
||||
6. **Reorder levels** (`reorder`)
|
||||
|
||||
For every file:
|
||||
|
||||
- Headers are matched ignoring case, spaces and punctuation, so `Staff no.` reads as `staffno`. Unknown columns are ignored.
|
||||
- Cells are trimmed and cut at 400 characters. Blank lines are skipped.
|
||||
- The apostrophe ThreadCount's exports put before `=`, `+`, `-`, `@` or a space is removed, so an exported file imports back unchanged.
|
||||
- On a re-import a blank cell keeps what the record holds. An import cannot clear a field.
|
||||
|
||||
## Departments and catalogue
|
||||
|
||||
**Departments & cost centres.** Matched by exact name. The row order becomes the list's order.
|
||||
|
||||
| Column | Required | Rule | Example |
|
||||
|---|---|---|---|
|
||||
| `dept` | Yes | Also `department`, `name`, `ward`. | `Harbour Ward` |
|
||||
| `cc` | No | Also `costcentre`, `costcenter`, `code`. Blank keeps the existing one. | `RGH-4010` |
|
||||
|
||||
**Catalogue.** Updates the garment with the same `item` and gender, and the same `sku` when given; otherwise creates one.
|
||||
|
||||
| Column | Required | Rule | Example |
|
||||
|---|---|---|---|
|
||||
| `item` | Yes | Also `name`, `itemname`, `garment`. | `Scrub Top` |
|
||||
| `gender` | No | Starts `m`: men's. Starts `f` or `w`: women's. Anything else or blank: Unisex. | `Women's` |
|
||||
| `sku` | No | Also `code`, `productcode`. | `NW-ST-220` |
|
||||
| `supplier` | No | Also `vendor`. A new name is added to the supplier directory; a known one, in any case, takes the directory's spelling. | `Northline Workwear` |
|
||||
| `cost` | No | Also `unitcost`, `price`. Non-digits dropped. Blank or 0 keeps the existing cost. | `31.50` |
|
||||
| `group` | No | Also `staffgroup`. Several separated by a pipe; `All` is every group. Blank: All when new, unchanged on update. | `Midwife` |
|
||||
| `sizes` | New garments | Also `size`. Separated by a pipe, `,`, `;` or `/`. An update adds new sizes and removes none. | `S/M/L/XL` |
|
||||
| `notes` | No | Also `note`. | `Navy` |
|
||||
| `type` | No | Not in the template. Also `producttype`, `garmenttype`. Decides top, trousers or neither. | `Scrub top` |
|
||||
|
||||
## Staff register
|
||||
|
||||
Updates the person with the same staff number, or creates one. Managers are linked after every row is written, so a manager can sit anywhere in the file. A row without a staff number or first name is skipped.
|
||||
|
||||
| Column | Required | Rule | Example |
|
||||
|---|---|---|---|
|
||||
| `num` | Yes | Also `staffnumber`, `staffno`, `number`, `payroll`, `payrollnumber`, `id`. | `00400127` |
|
||||
| `first` | Yes | Also `firstname`, `given`. A `name` or `fullname` column is split at the first space if first and last are blank. | `Amira` |
|
||||
| `last` | No | Also `lastname`, `surname`, `family`. | `Hassan` |
|
||||
| `phone` | No | Also `mobile`, `contact`. | `0400 000 000` |
|
||||
| `group` | No | Also `staffgroup`, `classification`. Not checked against `Settings › Issuing rules`. | `Registered Nurse` |
|
||||
| `dept` | No | Also `department`, `ward`, `wardunit`. | `Harbour Ward` |
|
||||
| `cc` | No | Also `costcentre`, `costcenter`, `departmentcostcentre`. With `dept`, creates a missing department. Never changes an existing one. | `RGH-4010` |
|
||||
| `manager` | No | Also `managernum`, `managernumber`, `approver`, `reportsto`. A staff number, not a name. | `00400019` |
|
||||
| `fte` | No | Also `combinedfte`, `totalcombinedfte`, `totalfte`, `employmentfraction`, `fraction`. Above 0, or `Casual`. | `0.8` |
|
||||
| `style` | No | Also `uniformstyle`, `uniform`, `cut`, `gender`. `m`, `male`, `men's`: Men's. `f`, `w`, `female`, `women's`, `ladies`: Women's. `either`, `both`, `any`, `all`, `unisex`: Either. | `Women's` |
|
||||
| `top` | No | Also `topsize`, `shirt`, `shirtsize`. | `M` |
|
||||
| `pants` | No | Also `pantsize`, `pant`, `trouser`. | `12` |
|
||||
| `ccoverride` | No | Also `costcentreoverride`. | `RGH-4090` |
|
||||
| `ent` | No | Also `entitlement`, `annualentitlement`. Whole number for the yearly report; limits nothing. | `10` |
|
||||
| `start` | No | Also `startdate`, `commenced`. `YYYY-MM-DD`, or day first as `11/03/2024`. | `2026-02-02` |
|
||||
| `notes` | No | Also `note`. | `Night shift` |
|
||||
|
||||
The `People` export uses headers that read back onto these columns. See [the staff register](/docs/people/staff-register) and [managers](/docs/people/managers).
|
||||
|
||||
## Barcodes, opening balances, reorder levels
|
||||
|
||||
Each row must match exactly one garment on whichever of `sku` (also `code`, `productcode`), `item` (also `name`, `itemname`, `garment`) and `gender` it fills in, then a `size` spelt as on the garment. Blank `gender` matches any. A header named `code` is read as the SKU.
|
||||
|
||||
| File | Column | Rule | Example |
|
||||
|---|---|---|---|
|
||||
| Supplier barcodes | `barcode` | Also `ean`, `code128`, `scan`. Blank skips the row. | `9300000000017` |
|
||||
| Opening balances | `opening` | Also `qty`, `quantity`, `onhand`, `count`. Overwrites; blank leaves the size alone. | `14` |
|
||||
| Opening balances | `reorder` | Optional. Also `reorderat`, `reorderlevel`. Not a number: sets 0. | `4` |
|
||||
| Reorder levels | `reorder` | Also `reorderat`, `reorderlevel`, `level`. Overwrites; not a whole number skips the row. | `4` |
|
||||
|
||||
Negative figures are stored as 0. Every row these files write counts as created. See [barcodes](/docs/stock/barcodes) and [reorder levels](/docs/stock/reorder-levels).
|
||||
|
||||
## Messages and what to do
|
||||
|
||||
The result reads like `Catalogue: 12 created, 3 updated, 1 skipped.`, then up to 40 row messages. `Row 1` is the first row under the header, blank lines not counted; the two whole-file refusals give the file's line number.
|
||||
|
||||
| Message | Meaning | Fix |
|
||||
|---|---|---|
|
||||
| `Line N: a quote is opened and never closed…` | Nothing imported. | Fix the quote. |
|
||||
| `Lines N: the wrong number of columns…` | Nothing imported; usually a stray `"`. | Fix those lines. |
|
||||
| `No rows found — check the header row.` | Nothing under the header. | Save the right sheet. |
|
||||
| `Row N: X has no sizes` | New garment skipped. | Add `sizes`. |
|
||||
| `Row N: start date “X” isn't a date…` | Stored blank. | Write `YYYY-MM-DD`. |
|
||||
| `Row N: FTE “X” isn't a fraction…` | Stored blank. | Write `0.75` or `Casual`. |
|
||||
| `Row N: uniform style “X” isn't…` | Stored blank. | Use Men's, Women's or Either. |
|
||||
| `Row N: no staff member with number X to be the manager` | Not linked. | Add or fix the manager's row. |
|
||||
| `The register is full for this plan — 60 staff records…` | Said once; further new people skipped, updates applied. | See [plan and billing](/docs/account/plan-and-billing). |
|
||||
| `Row N: no catalogue items match…` or `several…` | Skipped. | Fill in `item` or `gender`. |
|
||||
| `Row N: size X not on Y` | Skipped. | Match the size's spelling. |
|
||||
| `Row N: opening “X” isn't a number…` | Size left alone. | Write a whole number. |
|
||||
| `X is already on Y · size Z…` | Code bound to another size, as a one-code-per-style list does. | One code per size. |
|
||||
| `X is the generated code for Y…` | Refused. | Use the printed label's code. |
|
||||
|
||||
## Limits
|
||||
|
||||
- 20,000 rows a file: `Import at most 20,000 rows at a time`.
|
||||
- 20 imports and backup restores together per person in 10 minutes: `Too many imports — wait a few minutes.`
|
||||
- Over 60 MB: `Request too large`.
|
||||
- An Issuer gets `Admin only`. A read-only facility gets the read-only message pointing to `Settings › Plan`.
|
||||
- Hosted Small holds 60 staff records (`PRICES.freeStaff`). Other plans and the Community edition have no ceiling.
|
||||
@@ -0,0 +1,116 @@
|
||||
---
|
||||
title: Glossary
|
||||
section: reference
|
||||
order: 2
|
||||
summary: The words ThreadCount's screens use, in alphabetical order, each with a line of meaning and the page that explains it.
|
||||
role: Anyone
|
||||
keywords: glossary, terms, definitions, words, meaning, vocabulary, what does it mean
|
||||
---
|
||||
|
||||
## A–C
|
||||
|
||||
**Activity** — The screen listing every change in the facility, newest first, with who made it. Managed by [admins](/docs/account/users).
|
||||
|
||||
**Admin** — The [coordinator role](/docs/start/the-two-roles) that manages settings, the staff register, the catalogue, pricing, suppliers and departments.
|
||||
|
||||
**Back Order** — An order status for stock the supplier has not yet sent. See [receiving](/docs/stock/receiving-and-back-orders).
|
||||
|
||||
**Barcode** — The code bound to one size of one garment, so a scan finds that size. See [barcodes](/docs/stock/barcodes).
|
||||
|
||||
**Casual** — The FTE for someone with no fixed fraction; the [FTE table](/docs/people/groups-and-routes) leaves their kit to the manager.
|
||||
|
||||
**Catalogue** — The garments stocked, each with [sizes, SKU, supplier, cost, type and groups](/docs/stock/catalogue-sizes-and-cuts).
|
||||
|
||||
**Ceiling** — The most sets anyone may hold at once, 6 unless changed under `Settings › Issuing rules`, the same for every group. See [the entitlement rule](/docs/people/entitlement-rule).
|
||||
|
||||
**Collection code** — The 4-digit code on a bag waiting at the counter, read out at [hand-over](/docs/counter/pickup-call-list).
|
||||
|
||||
**Cost centre** — The finance code a department's issues are [charged to](/docs/reports/cost-centres).
|
||||
|
||||
**Cost centre override** — A [cost centre](/docs/reports/cost-centres) on one person's record, used instead of their department's.
|
||||
|
||||
## D–G
|
||||
|
||||
**Damage report** — A garment reported damaged; the replacement starts when it is [handed in](/docs/counter/exchanges-and-returns).
|
||||
|
||||
**Delivery round** — Requests going out to wards, grouped by ward and [signed for on screen](/docs/counter/delivery-rounds).
|
||||
|
||||
**Department** — A ward or unit, with its [cost centre](/docs/reports/cost-centres).
|
||||
|
||||
**Draft** — An order not yet placed with the supplier. See [the order list](/docs/stock/order-list).
|
||||
|
||||
**Either** — The uniform style offered [both cuts](/docs/stock/catalogue-sizes-and-cuts).
|
||||
|
||||
**FTE** — A person's combined employment fraction, such as 0.8, or Casual. See [groups and routes](/docs/people/groups-and-routes).
|
||||
|
||||
**FTE table** — The [route](/docs/people/groups-and-routes) where FTE proposes the starting kit: 5 sets at 1.0 and 0.9, 4 at 0.8 and 0.7, 3 at 0.6 and 0.5, 2 at 0.4 and 0.3, 1 at 0.2 and 0.1.
|
||||
|
||||
**Grace** — The 14 days after a trial or paid period ends, when changes are still accepted. See [plan and billing](/docs/account/plan-and-billing).
|
||||
|
||||
**Grandfathered** — A facility created before plans existed, [hosted free](/docs/account/plan-and-billing) with everything for as long as it exists.
|
||||
|
||||
**Group** — A staff group, such as Registered Nurse. Each is on one [route](/docs/people/groups-and-routes), and garments are tagged for the groups that wear them.
|
||||
|
||||
## H–M
|
||||
|
||||
**Hand-in** — Garments returned: good ones join the pre-loved pool, rags are counted for disposal. See [exchanges and returns](/docs/counter/exchanges-and-returns).
|
||||
|
||||
**Issue anyway** — The override for an issue past the ceiling, outside the person's group or not their uniform style, noted on the record. See [issue a garment](/docs/counter/issue-a-garment).
|
||||
|
||||
**Issuer** — The [coordinator role](/docs/start/the-two-roles) that issues stock, runs stocktakes and receives deliveries, and cannot edit a price or a past issue.
|
||||
|
||||
**Items (FY)** — What someone has drawn since 1 July. It feeds the [reports](/docs/reports/the-nine-reports) and never limits the counter.
|
||||
|
||||
**Kit check** — A facility-wide round asking people whether their locker matches the record; a shortfall is written off, never charged. See [the staff app](/docs/apps/staff-app).
|
||||
|
||||
**Manager** — The person, recorded by staff number, who [approves someone's requests](/docs/people/managers) and signs their order form.
|
||||
|
||||
**Manager approval** — The route with no starting kit, where the manager [approves each set](/docs/counter/manager-approvals).
|
||||
|
||||
## N–R
|
||||
|
||||
**Needs an approver** — Where a request waits under `Requests` when nobody is above the manager who [raised it](/docs/counter/requests-from-staff).
|
||||
|
||||
**Opening balance** — The count a size starts from before any movement. See [stocktakes](/docs/stock/stocktakes).
|
||||
|
||||
**Order list** — Under `Orders`, every size at or below its reorder level, topped up to twice the level less what is on order, grouped by supplier. See [the order list](/docs/stock/order-list).
|
||||
|
||||
**Pre-loved** — Good handed-in garments, reissued free, which count toward the ceiling like new ones. See [exchanges and returns](/docs/counter/exchanges-and-returns).
|
||||
|
||||
**Rag** — A handed-in garment counted for [disposal](/docs/counter/exchanges-and-returns).
|
||||
|
||||
**Read-only** — After grace: reports, exports, printing and the backup work and nothing is deleted, but changes are refused except for the plan, your own password and profile, and deleting your account. See [plan and billing](/docs/account/plan-and-billing).
|
||||
|
||||
**Reorder level** — The count at or below which a size joins the order list. See [reorder levels](/docs/stock/reorder-levels).
|
||||
|
||||
**Request** — Garments asked for in the staff app, numbered like `R-0001`, moving from Awaiting approval to Collected or Delivered. See [requests from staff](/docs/counter/requests-from-staff).
|
||||
|
||||
**Route** — How a group's garments are decided: FTE table, Starting kit or Manager approval. See [groups and routes](/docs/people/groups-and-routes).
|
||||
|
||||
## S
|
||||
|
||||
**Self-approved** — A request approved by someone who is [their own manager](/docs/people/managers).
|
||||
|
||||
**Set** — One top and one pair of trousers; the garment's type decides which half it is. See [the entitlement rule](/docs/people/entitlement-rule).
|
||||
|
||||
**Slip** — A printed collection or delivery slip, or the slip with a staff app code, which works once and expires after 14 days. See [slips and signatures](/docs/counter/slips-and-signatures).
|
||||
|
||||
**Starting kit** — The [route](/docs/people/groups-and-routes) giving sets on the first day, 3 by default, then more as needed.
|
||||
|
||||
**Stock on hand** — The live count of each size on the shelf. See [stocktakes](/docs/stock/stocktakes).
|
||||
|
||||
**Stock take** — A count of the shelf against the system figure, normal or blind. See [stocktakes](/docs/stock/stocktakes).
|
||||
|
||||
## T–Z
|
||||
|
||||
**Trial** — 30 days for a new hosted facility, no card taken. See [plan and billing](/docs/account/plan-and-billing).
|
||||
|
||||
**Uniform style** — The cut a person is offered, Men's, Women's or Either, plus everything unisex; blank offers every style. See [the staff register](/docs/people/staff-register).
|
||||
|
||||
**Variance** — The difference between a stock take's count and the system figure. See [stocktakes](/docs/stock/stocktakes).
|
||||
|
||||
**Waitlist** — A queue for a size not on the shelf; joining needs no approval. See [the staff app](/docs/apps/staff-app).
|
||||
|
||||
**Ward desk** — A flag on a staff record letting that person sign for bags a round leaves at their ward. See [delivery rounds](/docs/counter/delivery-rounds).
|
||||
|
||||
**Ward Requests** — The old name of `Requests`, the screen where the linen room works through [staff requests](/docs/counter/requests-from-staff).
|
||||
@@ -0,0 +1,86 @@
|
||||
---
|
||||
title: Keyboard and scanner
|
||||
section: reference
|
||||
order: 3
|
||||
summary: Setting up a USB barcode scanner, the symbologies ThreadCount reads and prints, the keys the screens answer to, and how printing works.
|
||||
screen: Counter, Stock › Count, Stock › On hand
|
||||
role: Admin or Issuer
|
||||
keywords: usb scanner, keyboard wedge, enter, suffix, barcode, ean-13, code 128, keyboard, shortcut, escape, tab, print, labels, slip, pop-up
|
||||
---
|
||||
|
||||
## Setting up a USB scanner
|
||||
|
||||
ThreadCount has no scanner driver. A USB scanner in keyboard mode (keyboard wedge) types the code into whichever field has focus, and the field acts when it receives Enter.
|
||||
|
||||
1. **Set the scanner to keyboard mode.** Most are out of the box; the scanner's own manual has the setup barcode.
|
||||
2. **Set the suffix to Enter (carriage return).** A Tab suffix moves focus instead, and nothing is recorded.
|
||||
3. **Click into the scan field first.** Keystrokes that land anywhere else do nothing. No screen listens for a scan outside its field.
|
||||
4. **Scan a known garment to test.** On `Stock › Count` its count goes up by 1.
|
||||
|
||||
Spaces before and after the code are trimmed.
|
||||
|
||||
## Where a scan goes
|
||||
|
||||
| Screen | Field | What Enter does |
|
||||
|---|---|---|
|
||||
| `Counter` | `Scan barcode, then Enter`, under `2 · Scan items` | Adds 1 of that size to the pickup; a repeat scan adds another |
|
||||
| `Stock › Count` | `Scan barcode to count +1, then Enter`, focused on arrival | Adds 1 to that size's count |
|
||||
| `Stock › On hand › Scan to add` | `Scan with a USB scanner, or type the code and press Enter`, focused on open | Finds the garment, or offers to add it |
|
||||
| A garment's page, `Scan sizes` | The size prompt, focused on open | Binds the code to the chosen size |
|
||||
| A garment's page, a size's barcode field | The code | Saves it |
|
||||
|
||||
A code nobody has bound, or one bound to an archived garment, opens `Unknown barcode` on `Counter` and `Stock › Count`. An Admin picks the garment and size to bind it; an Issuer is told only an Admin can. See [barcodes](/docs/stock/barcodes).
|
||||
|
||||
## Formats
|
||||
|
||||
| Where | Formats |
|
||||
|---|---|
|
||||
| USB scanner | Whatever the scanner types. A binding keeps up to 64 characters. |
|
||||
| Camera, in the browser and the counter app | EAN-13, EAN-8, UPC-A, UPC-E, Code 128, Code 39, Code 93 |
|
||||
| Printed labels | EAN-13 for a valid 13-digit code, Code 128 for anything else |
|
||||
|
||||
`Generate barcodes` on a garment's page gives each size with no code a 13-digit EAN-13 starting `29`, the GS1 range reserved for use inside one organisation, so any scanner reads it.
|
||||
|
||||
At a window 780 pixels wide or narrower, a `SCAN` button sits at the bottom right. On `Counter` and `Stock › Count` it opens the camera for that screen; anywhere else it opens search with the camera running, to find a person, a garment or an order. It hides while a dialog is open. Which browsers can use the camera is on [scanning and browsers](/docs/apps/scanning-and-browsers).
|
||||
|
||||
## Keys the screens answer to
|
||||
|
||||
ThreadCount has no single-key shortcuts. These are the keys the screens handle.
|
||||
|
||||
| Key | Where | Does |
|
||||
|---|---|---|
|
||||
| Enter | The scan fields above | Records the scan |
|
||||
| Enter | `Settings › Issuing rules`, `New staff group` | Adds the group |
|
||||
| Enter | A `Rename` dialog, `New name` | Saves |
|
||||
| Enter | A garment's page, `Add a size` | Adds the size |
|
||||
| Escape | Any dialog | Closes it |
|
||||
| Tab, Shift+Tab | Any dialog | Moves round the dialog's controls without leaving it |
|
||||
| Down arrow | Staff record, `Manager` search | Moves from the search box to the first match |
|
||||
| Up and Down arrows | The manager matches | Move between names |
|
||||
| Escape | `Manager` search while changing | Cancels the change |
|
||||
|
||||
## Keys in this manual
|
||||
|
||||
The manual has its own keys, on the website at `/docs` and inside the app under `Help`.
|
||||
|
||||
| Key | Where | Does |
|
||||
|---|---|---|
|
||||
| / | Any manual page, when you are not typing in a field | Puts the cursor in the search box |
|
||||
| Up and Down arrows | The search results | Move between results |
|
||||
| Enter | The search results | Opens the highlighted page, at the matching section when the match was a heading |
|
||||
| Escape | The search box | Closes the results |
|
||||
|
||||
Every manual page also has `Print` and `Copy link` in the rail beside the page, on a wide enough screen. A printed manual page leaves off the section tree and the rail.
|
||||
|
||||
## Printing
|
||||
|
||||
Printing uses the browser's own print dialog. Two routes lead there.
|
||||
|
||||
- **A print page in a new tab** opens the dialog after half a second and keeps a `Print` button for another try. These are the collection or delivery slip (1 to 3 copies), the order form (`Print the form` on a staff record or a request), the supplier order sheet (`Print` in the order list, `Order sheet` on an order) and labels (`Print labels` on a garment's page).
|
||||
- **A print window** carries the document itself: `Print` on `Reports`, which prints the selected tab, `Print count sheet` on `Stock › Count`, `Print credit slip` on `Counter`, and the hand-in receipt. If the browser blocks it, ThreadCount says `Pop-up blocked — allow pop-ups for ThreadCount to print.`
|
||||
|
||||
The label sheet holds 6 labels to an A4 page. From a garment's page it prints one label per garment on hand for each size with a code, after you confirm the number. A single code prints 1 to 24 copies, 6 unless set.
|
||||
|
||||
The menu, the mobile bar and the `SCAN` button are left off a printed screen.
|
||||
|
||||
> **Careful** The counter app cannot print. A print page opened there says `This app can't print. Open this page in a browser — on the computer at the counter — to print it.`
|
||||
Reference in New Issue
Block a user