A test catalogue with reference ranges, requests raised against a patient and a doctor, and a result entered per test.

A request shows how many of its tests are back.
One row per test, which is the point
The old schema stored the tests on a request as one text field and the whole report as another. A request was therefore either done or not done, with nothing in between, which is not how a laboratory works.
Now each test on a request carries its own result, status and reported time. The full blood count comes back in an hour and the blood culture is still growing at 48 hours, and the screen shows exactly that. The request status is worked out from its tests rather than set by hand, so it cannot disagree with them.
The reference range travels with the result

Fill in the reference range. It is copied onto the test when it is requested.
When a test is requested, the range in force that day is copied onto it. Change the range next year and last year’s result still reads against the range it was measured under. A result without the range that applied when it was taken is a number without a meaning.
What is waiting, oldest first
The outstanding lab work report lists every test requested and not yet reported, oldest first, and marks anything past three days. It also groups by test, which is how you notice that the delay is one assay rather than the whole department.

Tests waiting, with the ones past three days marked.
A requested test stays in the catalogue
The request keeps its own copy of the test name and range, so old results still read correctly. The catalogue entry holds the description and procedure reference a technician may need when reading one, so it is kept rather than removed.
See it rather than read about it. The laboratory screens are in the user guide.
The user guide walks the whole system in the order you would meet it, and the screenshots page has every screen. The source is on GitHub under the GPL v3.