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
@@ -0,0 +1,113 @@
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: "Staff uniform entitlements and manager approvals",
description:
"How to run a uniform entitlement that holds, on a ward or in an aged-care home: what an approval needs to record, how to handle part-time and agency staff, what to do when someone asks for more.",
alternates: { canonical: "/guides/manager-approvals" },
};
const STEPS: Step[] = [
{
n: "01",
h: "Write the entitlement down before you need it",
p: <>An entitlement that exists only as custom is one you will renegotiate at the counter, individually, forever. Agree the number of sets per role, put it somewhere both the linen room and the wards, homes or clinics it serves can see, and date it. The specific number matters far less than everyone knowing what it is.</>,
},
{
n: "02",
h: "Prorate honestly, or dont prorate at all",
p: <>Part-time staff are where entitlement schemes get messy. A nurse at 0.4 FTE or a care worker on two shifts a week, or a dental assistant covering Fridays still needs enough sets to get through a week without doing laundry nightly, so a straight multiplication produces something unworkable and quietly ignored. Either set a floor below which nobody drops, or don&rsquo;t prorate and say so. What you cannot do is have a rule on paper that the counter overrides in practice, because then there is no rule.</>,
},
{
n: "03",
h: "Make the approval carry its own evidence",
p: <>An approval should record who approved it, what they approved, for whom, and when. The approver is the staff member&rsquo;s own manager the ward, clinic or team manager. &ldquo;The manager said it was fine&rdquo; is not an approval, and it is exactly what you will be holding when someone asks why a ward went over budget. Name, number of sets, FTE if it bears on the calculation, and a date.</>,
},
{
n: "04",
h: "Separate the entitlement from the issue",
p: <>Someone can be entitled to five sets and take three today. Track the entitlement and the issues against it as different things, so the balance is visible. Otherwise the only way to know what someone is still owed is to add up their history, and nobody does that at a counter with three people waiting.</>,
},
{
n: "05",
h: "Give them the balance in writing",
p: <>When a staff member takes less than their entitlement because the size isn&rsquo;t there, or they only wanted two hand over something that records the balance. A credit slip stops the same conversation happening again in a fortnight with a different person at the counter, and it stops the quiet inflation that happens when nobody can remember what was already given.</>,
},
{
n: "06",
h: "Decide what happens when someone asks for more",
p: <>They will, and often for good reason: a garment condemned after a spill, a size change, a genuine increase in hours. Have a route that isn&rsquo;t &ldquo;no&rdquo; and isn&rsquo;t &ldquo;yes, quietly&rdquo;. An over-entitlement issue with a recorded approval keeps the room helpful and the numbers honest at the same time.</>,
},
{
n: "07",
h: "Handle agency and students explicitly",
p: <>Short-term staff are the fastest route to unreturned stock, because there is often nobody to ask afterwards. Decide in advance whether they get issued at all, and if so whether it is a loan against a return date. Whatever you decide, decide it once rather than at the counter.</>,
},
];
const PITFALLS: [string, string][] = [
["Verbal approvals", "Nothing to show and nothing to reconcile. The first budget query will land on the linen room, not on the person who approved it."],
["Entitlement with no start date", "Without a date you cannot tell an annual renewal from a duplicate issue, and long-serving staff quietly accumulate."],
["Prorating below a workable minimum", "A rule that makes it impossible to get through a week will be broken at the counter, and then no rule is being followed at all."],
["No record of whats outstanding", "If the balance isnt visible, the safe answer at the counter is always to hand over another set."],
["Treating a size change as a new issue", "It doubles the persons apparent consumption and hides a real signal about how youre buying sizes."],
["No closing routine for leavers", "The entitlement was correct; nobody asked for the garments back. This is the single largest source of unreturned stock in most rooms."],
];
export default function Page() {
return (
<>
<GuideMeta
slug="manager-approvals"
title="Staff uniform entitlements and manager approvals"
description={metadata.description}
updated="2026-09-07"
/>
<GuideHead
kicker="Guide"
title="Entitlements and manager approvals"
lede="Most disputes at a uniform counter are not about uniforms. They are about a rule nobody wrote down, applied inconsistently by people trying to be helpful."
/>
<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 }}>
Where entitlements come apart
</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" }}>
Entitlement sits on the staff record and the balance is on screen at the counter, so the
person handing over garments can see what is still owed without adding anything up. An
approval records the approver, the sets approved and the FTE it was based on. Take less
than the entitlement and a credit slip prints for the balance.
</p>
<p style={{ ...small, margin: "14px 0 0", maxWidth: "62ch" }}>
Going over is allowed it just asks for the approval first, which is the only difference
between a helpful exception and an unexplained one.
</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="/how-it-works" className="btn btn-secondary">How issuing works</Link>
</div>
</Band>
<GuideFoot
related={[
["Where hospital and aged-care uniforms actually go", "/guides/uniform-loss"],
["Charging uniforms to the right cost centre", "/guides/cost-centre-reporting"],
]}
/>
</>
);
}