ThreadCount Community edition

Uniform stock management for healthcare linen rooms. Licensed under the GNU AGPL v3.
This commit is contained in:
ThreadCount
2026-09-13 08:45:19 +10:00
commit 1bc2de655a
505 changed files with 56223 additions and 0 deletions
+104
View File
@@ -0,0 +1,104 @@
import Link from "next/link";
import { Band, body, small } from "@/components/site";
import { GuideFoot, GuideHead, GuideMeta, Pitfalls, Steps, type Step } from "@/components/guide";
export const metadata = {
title: "Where hospital and aged-care uniforms actually go",
description:
"Uniform loss is rarely theft. The honest causes — starters who never return a set, sizes swapped at the shelf, laundry that never comes back, leavers nobody closed off — and what to record so you can tell them apart.",
alternates: { canonical: "/guides/uniform-loss" },
};
const STEPS: Step[] = [
{
n: "01",
h: "Stop calling it shrinkage",
p: <>Borrowing the retail word imports the retail assumption, which is that stock is being stolen. In a linen room that is almost never the main cause, and starting there sours every conversation you need to have with the ward, wing or practice manager. What you have is unreturned stock, and most of it left through a door you can name.</>,
},
{
n: "02",
h: "Leavers who were never closed off",
p: <>The single largest cause in most rooms. Someone is issued three sets on their first day, works for two years, resigns, and nobody tells the linen room. The sets are gone and the record still shows them holding stock. This is a process gap, not a stock problem: what you need is a reliable signal from HR, the ward or the practice when someone leaves, and a routine for closing the record and asking for the garments back while there is still someone to ask.</>,
},
{
n: "03",
h: "Size changes that were never recorded",
p: <>A staff member takes a medium, finds it tight, and swaps it at the shelf for a large. Two garments have now moved and the record shows one. Do it a hundred times a year and your per-size figures drift far enough that ordering becomes guesswork. The fix is cheap: make the exchange a recorded action the old size back, the new size out, in one movement rather than something people do quietly because the proper route is slow.</>,
},
{
n: "04",
h: "Laundry that never came back",
p: <>Garments sent for washing are stock in transit, and transit is where things vanish without anyone noticing, because nobody owns the gap. If you send in bulk and receive in bulk, count both ends. A persistent difference between what went and what returned is a conversation with the laundry provider, and it is a conversation you can only have with numbers.</>,
},
{
n: "05",
h: "Damage that was never written off",
p: <>Torn, stained beyond use, or condemned on infection-control grounds. This is legitimate loss and should be recorded as such. If it isn&rsquo;t, it lands in the same bucket as unreturned stock and makes your genuine problem look worse than it is which costs you credibility exactly when you are asking for something.</>,
},
{
n: "06",
h: "Then, and only then, the small remainder",
p: <>When the four causes above are recorded properly, what is left is usually a modest number. That remainder is worth attention, and it is now attention you can direct, because you know it is not laundry, not leavers, not swaps and not damage.</>,
},
];
const PITFALLS: [string, string][] = [
["Issuing to a ward instead of a person", "Stock issued to “Ward 3A” can never be returned by anyone, because nobody holds it. Issue to a named person or accept that it is a write-off."],
["No opening entitlement", "If nobody agreed how many sets a role gets, there is no such thing as too many, and every request is reasonable."],
["Counting loss only in units", "A hundred lost XS gowns and a hundred lost theatre sets are the same number and very different money. Value it, or the case for change wont land."],
["Chasing individuals first", "Going after named staff before fixing the leaver process makes the room unpopular and recovers very little. Fix the doors before the people."],
["Annual review only", "A number produced once a year is a post-mortem. Monthly, it is a control, and you still remember what happened."],
["No agreed definition of loss", "If finance, the ward and the linen room each mean something different by it, the meeting is about definitions rather than uniforms."],
];
export default function Page() {
return (
<>
<GuideMeta
slug="uniform-loss"
title="Where hospital and aged-care uniforms actually go"
description={metadata.description}
updated="2026-09-07"
/>
<GuideHead
kicker="Guide"
title="Where the uniforms actually go"
lede="Almost every linen room — in a hospital, an aged-care home or a clinic — has a gap between what it bought and what it can find. Naming the causes honestly is what turns that gap from an accusation into a work plan."
/>
<Band>
<Steps steps={STEPS} />
</Band>
<Band tone="surface">
<div style={{ fontSize: 11.5, letterSpacing: "0.12em", textTransform: "uppercase", fontWeight: 800, borderBottom: "2px solid var(--color-text)", paddingBottom: 9 }}>
What makes it worse
</div>
<Pitfalls items={PITFALLS} />
</Band>
<Band>
<h2 style={{ fontFamily: "var(--font-heading)", fontWeight: 800, fontSize: "clamp(24px,3vw,36px)", letterSpacing: "-0.02em", margin: 0 }}>
Doing this in ThreadCount
</h2>
<p style={{ ...body, margin: "16px 0 0", maxWidth: "62ch" }}>
Every issue is against a named person, so a leaver&rsquo;s outstanding sets are a list
rather than a mystery. A size change is one recorded exchange rather than two movements
nobody made. Returns carry a condition, so damage is written off as damage. What remains
unexplained stays visible instead of being averaged away.
</p>
<div style={{ display: "flex", gap: 12, marginTop: 24, flexWrap: "wrap" }}>
<Link href="/demo" data-umami-event="open-demo" data-umami-event-placement="guide" className="btn btn-primary">Open the demo</Link>
<Link href="/reporting" className="btn btn-secondary">What the reports show</Link>
</div>
</Band>
<GuideFoot
related={[
["How to run a uniform stocktake", "/guides/uniform-stocktake"],
["Staff entitlements and manager approvals", "/guides/manager-approvals"],
]}
/>
</>
);
}