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/screensis 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'sJiracolumn link back toRC-116(EpicRC-101). - Downward: the
Linked TCscolumn lists the verifying test cases in01_Features/lawyer/wa_lawyer/./wa_lawyer_tc.md— filled by/gen-tc. - Coverage rule: every
Critical/HighAC and every business rule needs ≥1 Linked TC (BR-LAW-06 verified indirectly at the Home-page tile level — seehomepage.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. |