Phase 6: Q.C. inspection, project folders, packet documents and the digital ITP
ci / frontend (push) Successful in 37s
ci / server (push) Successful in 9m18s
ci / image (push) Successful in 35s
ci / e2e (push) Successful in 2m17s

The Q.C. screen (KPIs, boards, project folders), the Q.C. tab on the packet
page (check items from the qc_check_items settings row, visual exam per weld,
NDE, hardness with the NACE label, notes), accept with a route and a
signature gated by qc_missing_empty, reject with a reason or an NCR number
closing the inspection into qc_history, Q.C. folder documents per project and
unit with superseding revisions, packet documents as a closed set with
take-out reasons, the digital ITP per unit from the frozen template (line
initials with CAS, unsign, N/A, customer codes, rejects with NCR, block
signatures, sign-off with the PDF hook, admin reopen, the ITP log), hold-point
warnings by department page group, the scoped policy check for unit and
project writes, migration 0007, tests, Playwright scenarios and docs.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
2026-10-17 20:08:53 -06:00
co-authored by Claude Fable 5.1
parent 8bb1f7ae4d
commit 00531cb329
64 changed files with 11715 additions and 260 deletions
+27
View File
@@ -0,0 +1,27 @@
import { Link } from "react-router";
import type { PacketRead } from "../api/types";
import { holdItemsText, holdText } from "../lib/qc";
/**
* The open ITP hold, witness or rejected points for this packet's department (the old itpHoldNote). A warning
* only: nothing is blocked by it. Users with the Q.C. screen get a link to the ITP.
*/
export function HoldCallout({ p, qcScreen }: { p: PacketRead; qcScreen: boolean }) {
const hold = p.itp_hold;
if (!hold || p.status === "filed" || !hold.count) return null;
const items = holdItemsText(hold);
return (
<div className="callout warn itphold" role="note">
<b>{holdText(hold)}</b>
{items ? ` ${items}.` : ""} Check with Q.C. before moving past these points.
{qcScreen ? (
<>
{" "}
<Link className="lnk" to={`/qc/units/${p.unit.id}/itp`}>
Open ITP
</Link>
</>
) : null}
</div>
);
}