Skip to content

Acceptance Criteria — Lawyer (LAW)

User Story

As a Repair Check web-app user who has had an accident I want to browse a list of lawyers reached from "Unfall Rechtsberatung", narrow it by rating, and book an appointment with one So that I can find and engage suitable legal representation for my accident claim without leaving the app

Source: RC-116 — Web App – Fix Lawyer page (child of Epic RC-101 Web App), plus its clarifying comments (rating-filter semantics — Dai Luong 2026-07-09; sort order — Ann 2026-07-14; iPad display defect — PM-AiVan 2026-07-08).

Not grounded against Figma. The screenshot folder 01_Features/lawyer/wa_lawyer/screens is empty, so no UI states were available. Every element named below ("Unfall Rechtsberatung", "Terminierungsoptionen", "Termin vereinbaren", rating filter) comes from the ticket text only. Confirmed 2026-08-06: a lawyer entry displays whatever data fields the design shows — photo, firm name, specialisation, location, distance, contact, and review count all confirmed as part of the entry; exact visual layout still pending a real Figma/screenshot. The filter control type remains unconfirmed; empty/error-state copy is confirmed as not a priority (no specific requirement — see Confirmed Decisions).

Scope boundary: this feature stays separate from expert_call_appointment (RC-112) by stakeholder decision, even though both share the list + rating-filter + Calendly pattern. Do not merge or cross-reference their AC.

Scenario-based AC — Given / When / Then

AC ID Scenario Jira Type Criticality Given (context) When (action / trigger) Then (expected outcome) Linked TCs Status
AC-LAW-01 Open the lawyer list from "Unfall Rechtsberatung" RC-116 Happy 🔴 Critical A user is on the Web App
And the "Unfall Rechtsberatung" entry point is available
And at least one lawyer exists
The user selects "Unfall Rechtsberatung" The Lawyer list page is shown
And every available lawyer appears as a list entry
And each entry shows at least the lawyer's name and rating
TC-LAW-001 Draft
AC-LAW-02 Order the list with the highest rating first RC-116 Happy 🟠 High The lawyer list contains lawyers rated 5★, 4★ and 3★
And no rating filter is applied
The Lawyer list page is displayed Lawyers are ordered by rating descending — the 5★ lawyer appears above the 4★ lawyer, which appears above the 3★ lawyer TC-LAW-003 Draft
AC-LAW-03 Filter by rating returns the rating and above RC-116 Happy 🔴 Critical The lawyer list contains lawyers rated 1★, 2★, 3★ and 4★ The user applies the 2★ rating filter The 2★, 3★ and 4★ lawyers are shown
And the 1★ lawyer is not shown
And the result stays ordered by rating descending
TC-LAW-005 Draft
AC-LAW-04 Raise the filter to narrow the result RC-116 Alternate 🟡 Medium The 2★ filter is applied, showing lawyers rated 2★, 3★ and 4★ The user changes the rating filter to 4★ Only the 4★ lawyer remains listed
And the 2★ and 3★ lawyers are removed from the result
TC-LAW-006 Draft
AC-LAW-05 Clear the rating filter to restore the full list RC-116 Alternate 🟡 Medium A 4★ rating filter is applied, showing a subset of the lawyers The user clears / resets the rating filter All available lawyers are listed again
And the order is rating descending
And the filter control shows no active selection
TC-LAW-007 Draft
AC-LAW-06 Filter matches no lawyer RC-116 Edge 🟠 High No lawyer in the list has a rating of 5★ The user applies the 5★ rating filter No lawyer entry is listed
And an explicit "no results" state is shown instead of a blank page
And the filter remains set to 5★ so the user can change it
TC-LAW-008 Draft
AC-LAW-07 Lowest filter value keeps every rated lawyer RC-116 Edge 🟡 Medium The lawyer list contains lawyers spanning 1★ to 5★ The user applies the lowest available rating filter (1★) Every lawyer rated 1★ or higher is listed — the result equals the unfiltered list TC-LAW-009 Draft
AC-LAW-08 Equal ratings keep a stable order RC-116 Edge ⚪ Low Two lawyers both have a 4★ rating The user reloads the Lawyer list page Both 4★ lawyers appear consecutively in the list
And their relative order is identical on every reload
TC-LAW-004 Draft
AC-LAW-09 Present the scheduling options for a lawyer RC-116 Happy 🟠 High The Lawyer list page is shown
And a lawyer entry offers "Terminierungsoptionen"
The user selects "Terminierungsoptionen" on that entry "Termin vereinbaren" is presented as the only scheduling option for that lawyer (confirmed: no callback-request option, unlike expert_call_appointment) TC-LAW-011 Draft
AC-LAW-10 Open Calendly via "Termin vereinbaren" RC-116 Happy 🔴 Critical The "Terminierungsoptionen" options are presented for a lawyer The user selects "Termin vereinbaren" The Calendly scheduling page opens in a new browser tab
And the user can select an available appointment slot there
TC-LAW-012 Draft
AC-LAW-11 Return to the list after opening Calendly RC-116 Alternate 🟡 Medium The user opened Calendly from a lawyer entry with a 3★ filter applied (Calendly opened in a new tab, per AC-LAW-10) The user switches back to the original Lawyer-list browser tab The Lawyer list page is still usable
And the 3★ filter is still applied with the same result set
TC-LAW-013 Draft
AC-LAW-12 Calendly cannot be reached RC-116 Negative 🟡 Medium The Calendly scheduling page is unreachable or fails to load The user selects "Termin vereinbaren" The failure is reported to the user with a way to retry
And the Lawyer list page remains usable with its filter intact
TC-LAW-015 Draft
AC-LAW-13 Lawyer list cannot be loaded RC-116 Negative 🟠 High The lawyer data source is unavailable or returns an error The user opens the Lawyer list page An error state with a retry action is shown
And no empty or partial list is presented as a valid result
TC-LAW-014 Draft
AC-LAW-14 Reach every lawyer beyond the first screen RC-116 Edge 🟠 High 25 lawyers are available — more than fit on one screen The user scrolls to the end of the loaded list Further lawyers are lazy-loaded as the user scrolls
And all 25 lawyers are eventually reachable — none is silently dropped or hard-capped (confirmed: no 20-item cap, per bug RC-124)
TC-LAW-002 Draft
AC-LAW-15 Operate the page on a phone RC-116 Non-functional 🔴 Critical A user is on a phone-sized viewport The user opens the Lawyer list page The list entries, the rating filter and "Terminierungsoptionen" are fully visible and operable
And no content is clipped, overlapping, or requires horizontal scrolling
TC-LAW-016 Draft
AC-LAW-16 Operate the page on a tablet in both orientations RC-116 Non-functional 🔴 Critical A user is on a tablet, including iPad Pro
And the device is in portrait, then in landscape
The user opens the Lawyer list page The layout renders correctly in both orientations with no clipped, overlapping or misaligned elements
And the rating filter and "Terminierungsoptionen" stay operable
TC-LAW-017 Draft
AC-LAW-17 Keep the filter across an orientation change RC-116 Edge 🟡 Medium A 3★ rating filter is applied on a tablet in portrait orientation The device is rotated to landscape The 3★ filter is still applied
And the same lawyers are listed in the same order
TC-LAW-018 Draft
AC-LAW-18 Lawyer page requires an authenticated user RC-116 Permission 🔴 Critical A user is not logged in
And the Lawyer feature is currently Admin-configured "login required"
The user attempts to access the Lawyer page The user cannot view the lawyer list
And is redirected to the Login page
TC-LAW-020 Draft
AC-LAW-19 Rating filter resets on returning to the page RC-116 Edge 🟡 Medium A 3★ rating filter is applied on the Lawyer list page The user navigates away and back to the Lawyer page (or reloads it) The filter is reset to its default (no filter) — unlike an orientation change (AC-LAW-17), navigation away/reload does not preserve the filter TC-LAW-021 Draft
AC-LAW-20 A lawyer added in the Web Portal appears on the Lawyer Web app — Happy 🔴 Critical Admin has added a new lawyer via the Web Portal (Manage Lawyers → Add Lawyer) with valid Full Name, Full address, Rate, and Company name A user opens the Lawyer Web app list ("Unfall Rechtsberatung") The new lawyer appears as a list entry, with name, firm/company, rating, and address matching exactly what the admin entered in the Web Portal TC-LAW-022 Draft
AC-LAW-21 Lawyer details edited in the Web Portal are reflected on the Lawyer Web app — Happy 🟠 High Admin has edited an existing lawyer's Full Name, Full address, Rate, and/or Company name via the Web Portal (Manage Lawyers → Edit) and selected Save A user views that lawyer's entry on the Lawyer Web app list The name, firm, rating, and address shown to the user match the values last saved in the Web Portal — never stale/previous data TC-LAW-023 Draft
AC-LAW-22 A lawyer deleted in the Web Portal no longer appears on the Lawyer Web app — Happy 🟠 High Admin has deleted a lawyer via the Web Portal (Manage Lawyers → Delete → Yes, I'm sure) A user views the Lawyer Web app list The deleted lawyer no longer appears as a list entry TC-LAW-024 Draft

Business Rules (rule-based AC)

Rule ID Business Rule Jira Rationale / Source Criticality Linked TCs Status
BR-LAW-01 The rating filter is a minimum-rating filter: selecting N★ returns every lawyer whose rating is ≥ N (filter 2★ → lawyers rated 2★, 3★ and 4★ are all returned). It is not an exact-match filter. RC-116 Dev clarification (Dai Luong, 2026-07-09) resolving the defect PM-AiVan reported on 2026-07-08. Confirmed by stakeholder 2026-08-06 ("2★ → shows result ≥2★"). 🔴 Critical TC-LAW-005 Draft
BR-LAW-02 The default order of the lawyer list is rating descending — the highest-rated lawyer is always at the top, both unfiltered and within a filtered result. Lawyers with no rating yet are not excluded from the default (unfiltered) list; they appear alongside rated lawyers, following the same descending-rating rule (assumed to sort last, since they have no rating value — exact position not explicitly confirmed). No secondary sort key (name, distance, review count) is required to break ties between equally-rated lawyers — any consistent order is acceptable. RC-116 Stakeholder request (Ann, 2026-07-14: "highest rate should on top"). Unrated-lawyer inclusion and tie-break confirmed by stakeholder 2026-08-06 ("default hiện tất cả, có rule giảm dần" — by default show all, ordered descending; "không, hiện sao cũng được" — no, any order is acceptable). 🟠 High TC-LAW-003, TC-LAW-004, TC-LAW-005 Draft
BR-LAW-03 Individual lawyer ratings are submitted as whole stars (1–5). The displayed/aggregate rating (average of reviews) may show a decimal value (e.g. "3.25★"). There is no minimum review count required before a rating displays — a rating shows regardless of how many (or few) reviews back it. RC-116 Whole-star input + decimal display + no minimum-review-count confirmed by stakeholder 2026-08-06 ("bao nhiêu cũng được, không có review vẫn hiện" — any review count is fine; a lawyer with no reviews is still shown). 🟡 Medium TC-LAW-010 Draft
BR-LAW-04 Appointment booking for accident legal advice is performed entirely on the external Calendly page. Whether that Calendly page is one link shared across all lawyers or a distinct link per lawyer is not a strict rule — either implementation is acceptable; QA verifies the correct scheduling page opens, without asserting a single-link-vs-per-lawyer-link scheme. The app does not collect appointment details or store the booking itself. RC-116 RC-116 description (Story 3 + the Calendly link https://calendly.com/alextyl/jaekelgmbh as the baseline example). Flexibility on shared-vs-per-lawyer link confirmed by stakeholder 2026-08-06 ("không, sao cũng được" — no, either way is acceptable). 🔴 Critical TC-LAW-012 Draft
BR-LAW-05 The Lawyer page must be fully functional on phone and tablet viewports in both orientations, explicitly including iPad Pro landscape. RC-116 RC-116 description ("Should work on phone and tablet") + the iPad display defect fixed under this ticket. 🔴 Critical TC-LAW-016, TC-LAW-017 Draft
BR-LAW-06 Access to the Lawyer page is governed by the same Admin feature-config mechanism as the Home page's enabled + loginRequired flags per feature. Current config: login required — a guest cannot view the lawyer list. RC-116 Confirmed by stakeholder 2026-08-06 ("theo config, hiện tại phải đăng nhập mới coi được" — driven by config; today you must be logged in to view it). Mirrors homepage BR-HOME-01 and expert BR-ECA-07. 🔴 Critical TC-LAW-020 Draft
BR-LAW-07 The rating filter persists only across a device orientation change (AC-LAW-17). It does not persist when the user navigates away from the Lawyer page and returns, or reloads the page — the filter resets to default (no filter) in those cases. RC-116 Confirmed by stakeholder 2026-08-06 ("không giữ filter, mỗi lần quay lại là mới" — the filter is not kept; it starts fresh on every return). 🟡 Medium TC-LAW-021 Draft
BR-LAW-08 The Web Portal — Manage Lawyers screen (feature wp_lawyer) is the single source of truth for a lawyer's Full Name, Address, Rate, and Company; every add, edit, and delete made there must propagate to and be reflected by the consumer-facing Lawyer Web app (this feature). — Stakeholder confirmation (chat, 2026-08-10) 🟠 High TC-LAW-022, TC-LAW-023, TC-LAW-024 Draft

Confirmed Decisions (resolved 2026-08-06 — all 14 prior open questions answered)

# Item Decision
1 Lawyer entry composition (no Figma available) All listed fields confirmed as part of an entry: photo, firm name, specialisation, location, distance, contact, review count — displayed per the design once available. Updated grounding note above.
2 Filter semantics Confirmed ≥ N★ minimum-rating filter (e.g. 2★ filter → shows ≥2★ results). Updated BR-LAW-01.
3 Minimum review count to show a rating No minimum — a rating displays regardless of review count, even zero. Updated BR-LAW-03.
4 Unrated lawyers Not excluded from the default (unfiltered) list — shown alongside rated lawyers, following the descending-rating sort. Updated BR-LAW-02.
5 Tie-break for equal ratings No secondary sort key (name/distance/review count) required — any order among equally-rated lawyers is acceptable. Updated BR-LAW-02.
6 Calendly link scheme Flexible — shared or per-lawyer link both acceptable, not a strict rule to test. Updated BR-LAW-04.
7 How Calendly opens Confirmed: opens in a new browser tab. Updated AC-LAW-10/11.
8 "Terminierungsoptionen" contents Confirmed: "Termin vereinbaren" is the only option — no callback-request option like expert_call_appointment. Updated AC-LAW-09.
9 Permissions Access follows the Admin feature-config mechanism (same as homepage/expert); current config requires login. Added AC-LAW-18, BR-LAW-06.
10 Empty and error states Not a priority — no specific copy/behaviour required beyond an explicit state existing (already asserted in AC-LAW-06/12/13).
11 List completeness / paging Confirmed: no hard cap — uses lazy loading (infinite scroll). The RC-124 20-item cap is a bug, not intended behaviour. Updated AC-LAW-14.
12 Filter persistence Confirmed: the filter persists only across an orientation change (AC-LAW-17) — it resets on navigating away/back or on reload. Added AC-LAW-19, BR-LAW-07.
13 Localisation German is the priority/primary language for this ticket's scope; other locales not required.
14 Backend scope Keep separate — RC-29/RC-63 API AC are not merged into this feature spec (same decision as expert).

Column Guide

Column Description Values / Format
AC ID Unique scenario id — TCs trace back to this AC-LAW-NN
Rule ID Unique business-rule id — TCs trace back to this BR-LAW-NN
Scenario Short title of the behaviour, start with an action verb Plain text
Jira The ticket this AC came from [RC-116](url)
Type Class of scenario Happy / Alternate / Negative / Edge / Non-functional / Permission
Criticality Impact if this AC fails — drives the verifying TC's priority 🔴 Critical / 🟠 High / 🟡 Medium / ⚪ Low
Given Precondition / context true before the action One state per clause; <br>And … to compound
When The single action or event that triggers behaviour One trigger
Then Observable, verifiable outcome — pass/fail must be objective Include error code / message / state where relevant
Linked TCs TCs in 01_Features/lawyer/wa_lawyer/wa_lawyer_tc.md that verify this AC TC-LAW-NNN, comma-separated
Status Review state of the criterion Draft / Reviewed / Approved

Traceability

Jira ticket (RC-116, child of Epic RC-101)  ──▶  AC-LAW-NN / BR-LAW-NN  ──▶  TC-LAW-NNN
 (the why)                                        (the what — this file)        (the how to verify)
  • Upward: header SRS ref + each row's Jira column link back to RC-116 (Epic RC-101).
  • Downward: the Linked TCs column lists the verifying test cases in 01_Features/lawyer/wa_lawyer/./wa_lawyer_tc.md — filled by /gen-tc.
  • Coverage rule: every Critical/High AC and every business rule needs ≥1 Linked TC (BR-LAW-06 verified indirectly at the Home-page tile level — see homepage.md).

Scenario classes intentionally not covered (§3 of the AC technique guide):

Class Why skipped
State transitions Browsing, filtering and opening an external scheduling page change no entity lifecycle in the app; the booking state lives in Calendly (BR-LAW-04).
Performance, security, accessibility, observability No target, threshold or requirement is stated anywhere in RC-116; inventing one would be unverifiable.
Localisation / i18n Confirmed German is the priority language for this ticket's scope; other locales not required.