Files
HealthLog/prisma/migrations/0181_v1189_qualitative_lab_results/migration.sql
T
Marc-André Bombeck a5b3715a46 feat(labs): record qualitative lab results
Add first-class qualitative lab findings (positive / negative / borderline
serology) alongside the existing numeric path. A LabResult is now EITHER a
numeric reading (value + unit, optional reference bounds) OR a qualitative one
(valueText, e.g. "negativ"), never both, never neither.

- schema: make `value` nullable, add `value_text`; migration 0181 is additive
  (DROP NOT NULL + ADD COLUMN), every existing numeric row is untouched.
- validation: numeric-XOR-qualitative refine on create + update; unit/bounds
  apply to the numeric path only; valueText capped at 120 chars. The single
  resource PUT rejects a cross-type edit.
- serialise: carry valueText through both DTOs; a qualitative row reports the
  neutral `unknown` range verdict (no number to classify).
- FHIR: a qualitative result emits valueCodeableConcept — SNOMED qualifier
  value for confidently-known terms (Negative 260385009, Positive 10828004,
  Not detected 260415000, Detected 260373001), text-only for borderline /
  grenzwertig and any unrecognised term. The raw text always rides .text.
- UI: a numeric/qualitative toggle in the lab form; list, history, detail,
  chart, sparkline, and the doctor-report PDF all render qualitative readings
  as their text and never plot or divide on a null value.
- i18n: new labs.form keys across all six locales.
- openapi: response carries a nullable value + valueText; regenerated.
2026-06-20 11:17:43 +02:00

15 lines
801 B
SQL

-- v1.18.9 — qualitative lab results (positive/negative/borderline serology).
--
-- A LabResult was numeric-only (`value` NOT NULL). Qualitative findings
-- ("Hepatitis Bs-Antigen: negativ") have no number to store. This migration is
-- ADDITIVE and preserves every existing numeric row:
--
-- 1. `value` becomes nullable so a qualitative row can omit it. Existing rows
-- keep their numeric value untouched (DROP NOT NULL never rewrites data).
-- 2. `value_text` is added (nullable) to hold the qualitative result string.
--
-- A row is QUANTITATIVE when `value IS NOT NULL`, QUALITATIVE when
-- `value_text IS NOT NULL`. The application layer enforces the exclusive-or.
ALTER TABLE "lab_results" ALTER COLUMN "value" DROP NOT NULL;
ALTER TABLE "lab_results" ADD COLUMN "value_text" text;