# Meridian Care Service — Product Requirements (v1.0)

Meridian Care Service is a server-rendered healthcare appointment site. Visitors see a landing page and sign in with a demo account shown on the login page; signed-in users book a visit at one of three care centers, receive a confirmation, and review the appointments of their own browser session in History. A sidebar menu adapts to the sign-in state.

**Problem.** Patients need a simple way to request a visit and to see what they have booked, without anyone else being able to see or create appointments on their behalf.

## Users
- **Visitor** — Understand the service and find the way to sign in.
- **Patient** — Book a visit with a facility, program and date, get a clear confirmation and review earlier bookings.

## Goals
- Booking and history are reachable only after signing in.
- The confirmation repeats exactly what the patient chose.
- Each browser session sees only its own appointments.

## Landing page (LND)

Public home page.

- **FR-LND-01** (Must) An anonymous visitor sees the hero and a way to sign in, but no booking form.
  - Heading "Meridian Care Service", sub-heading "Care That Fits Your Schedule", button "Make Appointment" leading to the login form
  - No "Book Appointment" button is rendered
  - The three centers are listed: Tokyo, Hongkong and Seoul Meridian Care Center
  - The footer shows the service name, a postal address and a copyright line

## Sign in and out (AUT)

Demo account login, failures, access control and logout.

- **FR-AUT-01** (Must) The login page shows the demo account in read-only fields; signing in with it opens the booking form.
  - Heading "Login" and "Please login to make appointment."
  - Valid sign-in redirects to /meridian/#appointment with heading "Make Appointment" and the booking form
- **FR-AUT-02** (Must) Any failed sign-in (wrong password, wrong case in the username, empty fields) shows the same message and keeps the login form.
  - "Login failed! Please ensure the username and password are valid."
  - The username is case-sensitive
  - Both fields empty gives the same message
- **FR-AUT-03** (Must) History and appointment creation require a signed-in session; otherwise the request is redirected to the login form and nothing is created.
  - Opening /meridian/history.php without a session redirects to /meridian/profile.php#login
  - Posting to /meridian/appointment.php without a session returns 302 to the login form and creates no appointment
- **FR-AUT-04** (Should) Logout ends the session: the booking form and History are no longer reachable.
  - After Logout the browser returns to /meridian/ with no booking form
  - The menu then lists only Home and Login
  - History redirects to the login form

## Sidebar menu (MNU)

Hamburger menu with state-dependent links.

- **FR-MNU-01** (Could) The menu button opens a sidebar that can be closed; its links depend on the sign-in state.
  - Signed out: Meridian Care, Home, Login
  - Signed in: Meridian Care, Home, History, Profile, Logout
  - "Close menu" hides the sidebar
  - Profile shows "Under construction." and a "Logout" button

## Book an appointment (BKG)

Booking form, date picker and confirmation.

- **FR-BKG-01** (Should) The booking form starts with documented defaults.
  - Facility "Tokyo Meridian Care Center" (options Tokyo, Hongkong, Seoul)
  - "Apply for hospital readmission" unchecked
  - Healthcare Program "Medicare" selected (Medicare, Medicaid, None)
  - Visit Date empty with placeholder "mm/dd/yyyy"; Comment empty
- **FR-BKG-02** (Must) Booking shows a confirmation that repeats every chosen value.
  - Seoul Meridian Care Center, readmission ticked, Medicaid, 12/24/2026, comment "Follow-up visit"
  - Heading "Appointment Confirmation" and "Please be informed that your appointment has been booked as following:"
  - Rows: Facility Seoul Meridian Care Center; Apply for hospital readmission Yes; Healthcare Program Medicaid; Visit Date 12/24/2026; Comment Follow-up visit
  - "Go to Homepage" returns to /meridian/ with the booking form
- **FR-BKG-03** (Should) Only the visit date is required; omitted fields take the defaults.
  - Visit Date 01/15/2027 only: Tokyo Meridian Care Center; readmission No; program Medicare; empty comment
- **FR-BKG-04** (Must) A visit date is required, in the browser and on the server; an empty date creates no appointment.
  - Submitting with Visit Date empty shows the browser required-field message and no confirmation
  - A direct post with an empty date returns 302 to /meridian/#appointment and adds nothing to History
- **FR-BKG-05** (Should) The visit date must be a real calendar date in mm/dd/yyyy; values that match the pattern but do not exist are rejected and not booked.
  - 99/99/2026 is rejected: no confirmation and no entry in History
- **FR-BKG-06** (Could) The calendar popup fills the visit date in mm/dd/yyyy.
  - Clicking Visit Date opens dialog "Choose date" with the current month, weekdays Su to Sa and today highlighted
  - "Next month" then day 15 closes the popup and fills mm/15/yyyy for the next month
  - Escape closes the popup and keeps the value
- **FR-BKG-07** (Should) The comment is displayed as plain text everywhere; markup is escaped.
  - Comment "<b>x</b>" appears literally on the confirmation and in History, not bold

## History (HST)

Appointments of the current session.

- **FR-HST-01** (Must) History lists the current session’s appointments in booking order, each as a panel headed by its visit date.
  - Empty: heading "History" and "No appointment."
  - After booking 12/24/2026 then 01/15/2027: panels "12/24/2026" then "01/15/2027", each with Facility, Apply for hospital readmission, Healthcare Program and Comment
- **FR-HST-02** (Must) History is isolated per browser session: another session never sees these appointments.
  - A new browser context that signs in and opens History sees "No appointment."
  - The first context still shows its panel "12/24/2026"

## Non-functional requirements

- **NFR-01** (Could) On a 375 px wide screen the hero heading shrinks, form labels sit left-aligned above their fields, nothing scrolls sideways, and the sidebar overlays the page and can be closed.

## Glossary and rules

- **Session** — A browser cookie that carries the sign-in state and scopes appointments.

## Out of scope

- Profile page content (under construction)
- Email and phone links in the footer
