8 min readReception staff, result support staff, lab managers, and owners.

Portal results

Show patients only released or published sample results, grouped by sample, test, parameter, reference range, and PDF.

What patients can see

The portal results pages show only samples that have released or published results. A patient cannot see draft, pending, processing, or unreleased results. The query also checks that the sample's order belongs to the logged-in patient and that the order branch belongs to the lab company behind the current website.

This means staff should not promise portal visibility until results have completed review and release.

There are two patient-facing result surfaces:

  • The authenticated portal lists released sample reports and structured values for the signed-in patient.
  • The invoice or receipt QR opens a temporary order tracker that can show each ordered test as Requested, Collected, Received, In progress, Under review, Approved, Partially released, Needs attention, or Released.

The QR tracker intentionally shows progress before release so a patient can see that work is moving. It never shows an unreleased value. The tracker identifies the visit with the patient name, branch, visit date and time, visit type, and order number. A test receives Open PDF only after every stored result row for that test is released.

The tracker also offers Login with mobile number. Patients can use it to open their full result history and visits instead of relying on one temporary order link.

Patient and partner result pages, progress/status pages, and the pending-PDF page follow the portal's selected interface language, including navigation, headings, actions, statuses, notifications, validation, help text, and dates; Arabic uses a right-to-left layout. Laboratory test names remain canonical English in small left-to-right islands so they match the reviewed laboratory record. Released PDFs are standalone English left-to-right documents, regardless of the portal language.

When a patient opens a protected result URL without an active patient session, Kashef redirects to that laboratory's branded Patient Portal Login, never the staff login. After a successful phone/OTP sign-in, the portal resumes the originally requested protected page. If the patient sees a staff email/password login instead, record the lab website URL and report the routing issue.

Results list

The result list shows sample-level information: sample ID, barcode, collection date, received date, result PDF path when available, number of published results, branch name, and order ID. The dashboard takes the latest five results from this same list.

Use the list when a patient wants to know whether a report is available. If a sample appears without an expected test, the details page can show which released result rows are available.

Result detail page

The detail page loads one published sample. Results are grouped by test. Each test includes its code, canonical English clinical name, and parameters. Each parameter includes result ID, parameter name, code, result type, value, unit, status flag, reference range, and metadata. The surrounding page labels and result-status wording use the selected portal language.

Reference range data can include gender, age minimum, age maximum, value minimum, value maximum, unit, and interpretation. When a stored reference range is missing, the service attempts to resolve a test reference range for the parameter.

PDFs and structured results

The sample payload can include a result PDF. Structured result rows are still important because they let the portal show test values, units, flags, and ranges directly. Depending on the frontend design, patients may see a downloadable report, structured cards, or both.

If a patient says a PDF is missing, check whether the report PDF was generated and attached to the sample. If structured values are missing, check release status for each test result.

The QR tracker PDF is prepared in the background from the same released-results report composer used by staff. It includes only the selected released test. Generation starts after release; opening a missing legacy file also places one generation request in the queue when an equivalent request is not already waiting.

If preparation is still running, the patient sees Your result PDF is being created instead of an error. Ask the patient to use Try again after a short wait. If a temporary generation problem occurs, the page explains that the report needs more time. A persistent problem shows a safe unavailable message; the patient can return later or contact the lab, and does not need to ask for release again. Once ready, each click creates a fresh short-lived private download URL. The signed tracker still controls which patient and test can request that URL, and the file is not made public.

Troubleshooting visibility

If a result does not appear, check five things: the patient profile phone and login, the order patient, the order branch's lab company, the result status, and the sample ID. A result must be in a released state such as released or published to appear.

If the wrong patient sees a result, treat it as a serious data issue. Review patient linkage, order ownership, and any duplicate patient profiles immediately.

Checklist

  • Patient is logged into the correct lab website.
  • Order belongs to the logged-in patient.
  • Order branch belongs to the same lab company.
  • Test results are released or published.
  • The invoice or receipt was printed recently enough that its temporary QR link has not expired.
  • A test must be fully released before its QR tracker row offers a PDF.
  • The queue worker is running when the patient sees the PDF preparation message for an extended period.
  • If the page says the PDF is temporarily unavailable, the patient should try again later; staff should investigate the generation queue if the message continues.
  • The generated PDF exists on local private storage in local environments or the configured private Laravel Cloud Object Storage bucket in production.
  • Reference range and status flag are checked when values need explanation.