# Palisade Air — Product Requirements (v4.0)

Palisade Air is an airline booking site. Travellers search one-way, return and multi-city trips, compare Basic, Standard and Flex fares, pick seats, add bags and extras, pay by card and receive a booking reference. Members sign in to Manage booking to review their trips, change seats and cancel with fare-based refunds. The clock is fixed at Monday 2 Nov 2026, 12:00.

**Problem.** Travellers must see one honest price for every passenger type, be stopped from choosing seats they are not allowed to take, and know exactly what a cancellation refunds before they confirm it.

## Users
- **Guest traveller** — Find a flight, see the full price and book without creating an account.
- **Family traveller** — Book adults, a child and an infant together at the correct rates and with seats that obey safety rules.
- **Member** — Review upcoming and cancelled trips and cancel with a clear refund breakdown.

## Goals
- The total shown at payment equals fares plus taxes plus seats plus bags, with nothing omitted.
- Safety seating rules (exit rows) are always enforced.
- A refund always equals what was paid minus the fee and any non-refundable amounts shown in the cancel dialog.

## Search and results (SRC)

Trip search, fare calendar and the flight list.

- **FR-SRC-01** (Must) The Book a flight screen shows the Palisade Air brand, a single heading "Book a flight", the trip types One-way, Return and Multi-city, "Popular routes" and the three fare families as cards.
  - Fare families Basic, Standard and Flex are shown under "Three fares on every flight"
- **FR-SRC-02** (Must) A one-way search lists every flight of the day, cheapest first, each with three fares.
  - ALQ to BKW on 2026-11-10 shows heading "Albuquerque to Brookwater" and "8 of 8 flights"
  - First row SK 474, 05:30 to 07:24, Nonstop, from $67.00; fares Basic $67.00, Standard $112.00, Flex $187.00; "6 seats left"
- **FR-SRC-03** (Should) A seven-day fare calendar centred on the searched date shows each day's lowest fare and marks the cheapest day "Lowest". Days before today have no price and cannot be selected.
  - Search 10 Nov shows 7 Nov to 13 Nov; 10 Nov $67.00 (Lowest), 8 Nov $79.00, 13 Nov $90.00
  - Search 2 Nov: 30 Oct to 1 Nov show no price; 2 to 5 Nov are $78.00, $75.00, $66.00, $72.00
  - Clicking a day reloads the list for that day
- **FR-SRC-04** (Should) Origin and destination must differ.
  - "Origin and destination must be different" beside the To field and no results
- **FR-SRC-05** (Must) A return trip cannot return before it departs.
  - Depart 2026-11-10 and Return 2026-11-09 shows "Return date cannot be before the departure date" and lists no flights
- **FR-SRC-06** (Should) The earliest searchable date is today (2 Nov 2026) and the latest is 330 days ahead.
  - A search for today returns results
  - 2027-12-10 shows "Flights can be booked up to 330 days ahead" beside the date
- **FR-SRC-07** (Could) Long routes mix nonstop and one-stop flights and name the stop airport and the total duration.
  - ALQ to LMZ on 2026-11-10: CM 252 05:15 to 08:12 Nonstop 5 h 57 min, Basic $271.00
  - SK 837 15:40 to 20:22 "1 stop · GRV", Basic $225.00
  - CM 147 09:15, "1 stop · CVX", 7 h 42 min, Basic $249.00
- **FR-SRC-08** (Could) The results screen uses a framed-sheet layout: fare calendar on top, filters on the left, flight list on the right, with one heading; an opened row shows three fare cards with prices and rules.

## Pricing (PRC)

Fares, passenger-type rates, taxes and bags.

- **FR-PRC-01** (Must) Fares are priced per passenger type: adult 100%, child 75%, infant 10% of the adult fare. Taxes and fees are 12% of the fare plus $18.50 per paying passenger, plus $12.00 per infant.
  - 1 adult on SK 474 Basic: fare $67.00, taxes $26.54, total $93.54
  - 2 adults, 1 child, 1 infant: fares $134.00 + $50.25 + $6.70, taxes $89.61, total $280.56
  - 1 adult + 1 child: fares $67.00 + $50.25, taxes $51.07, total $168.32
- **FR-PRC-02** (Must) Extra checked bags cost $40.00 each beyond the fare allowance (Basic 0, Standard 1, Flex 2), up to 4 bags per passenger, and the order total includes the fee.
  - 3 bags on Basic: line "Extra checked bags $120.00"; total $213.54 (fare $67.00 + taxes $26.54 + bags $120.00)
  - The add button stops at 4; removing bags reduces the line and the total ($80.00 at 2 bags; line gone and $93.54 at 0)
- **FR-PRC-03** (Should) Passenger rules: an infant needs an adult (infants cannot outnumber adults) and an infant does not get a seat.
  - "Infants travel on an adult's lap" is shown in place of a seat for the infant

## Passenger details (PAX)

Names, dates of birth and contact details.

- **FR-PAX-01** (Should) Each passenger field refuses bad input with its own message and the screen only advances when all fields are valid.
  - "First name is required"
  - "First name can only contain letters, spaces, hyphens and apostrophes"
  - "Date of birth is required"
  - "Adults must be 16 or older on the travel date"

## Seat selection (SET)

Priced seat map with safety rules.

- **FR-SET-01** (Should) Legroom seats cost $35.00, exit-row seats $28.00 and standard seats $12.00 on Basic; occupied seats cannot be selected; selecting a new seat releases the previous one and Clear seat removes the charge.
  - 2A (legroom) $35.00; 14A (exit row) $28.00 and 2A is released
  - 14B and 9A are occupied and not selectable
  - After Clear seat the total is $93.54
- **FR-SET-02** (Must) Passengers under 16 cannot take an exit-row seat.
  - "Passengers under 16 cannot sit in an exit row" and the seat is not assigned
  - Row 12 is allowed for the child; an adult without an infant may take 14A
- **FR-SET-03** (Must) An adult travelling with an infant cannot take an exit-row seat.
  - "Passengers travelling with an infant cannot sit in an exit row" and 14A is not assigned
- **FR-SET-04** (Could) The seat map shows a 3-3 grid with an aisle, row numbers, a legend and distinct looks for free, occupied, exit-row and legroom seats.

## Payment (PAY)

Card payment with priced summary.

- **FR-PAY-01** (Should) Card number, expiry and security code are validated before payment.
  - Failing check digit: "Enter a valid 16-digit card number"
  - Expiry 10/26: "This card has expired"
  - Expiry 13/29: "Use the format MM/YY"
  - Two-digit code: "Security code must be 3 digits"
- **FR-PAY-02** (Should) A declined card shows an error, keeps the traveller on Payment and creates no booking.
  - Card number 4000 0000 0000 0002 shows "Your card was declined. Try another card." on the card number
  - Retrying with a valid card confirms the booking
- **FR-PAY-03** (Could) The payment form sits beside a sticky price summary (Fares, Taxes and fees, Total) with all text at least 12px.

## Booking and confirmation (BKG)

End-to-end booking and the confirmation receipt.

- **FR-BKG-01** (Must) A guest can book a one-way flight with a seat and receives a six-character booking reference and a receipt whose total equals the amount at payment.
  - SK 474 Basic with seat 14A: Payment total $121.54 (fare $67.00, taxes $26.54, seat $28.00)
  - "Booking confirmed"; Total paid $121.54; "Paid with card ending 4242"; passenger and seat 14A listed
- **FR-BKG-02** (Must) A return booking prices both flights, each with its own fare family, in one total.
  - SK 474 Standard out + SK 606 Basic back with seat 14A: Fares $206.00, taxes $61.72, seat $28.00, total $295.72
  - Both flights are listed on the confirmation; seats are chosen per flight on tabs
- **FR-BKG-03** (Must) A family booking prices every passenger at their own rate and the confirmation total matches the payment total.
  - 2 adults, 1 child, 1 infant on SK 474 Basic: total paid $280.56
- **FR-BKG-04** (Could) The confirmation shows the booking reference in a bordered box, then the itinerary card, then the passengers card with price lines and a right-aligned "Total paid" row.

## Manage booking (MNG)

Member sign-in and booking list.

- **FR-MNG-01** (Must) A member signs in and sees their own bookings split into Upcoming and Cancelled.
  - Heading "Manage booking", "Signed in as" the member name
  - Upcoming: PX4K7M, QT9W2C, ZL6R3N; Cancelled: MB2D8H
- **FR-MNG-02** (Must) Bad credentials are refused with specific messages.
  - Empty: "Enter your username or email and your password"
  - Wrong password: "Invalid credentials" and the screen stays on sign-in
- **FR-MNG-03** (Should) A booking detail shows its flights, fares, seats per passenger and payment.
  - PX4K7M: Confirmed; ALQ to BKW 12 Nov CM 953 09:20 Standard and BKW to ALQ 16 Nov PA 459 11:30 Standard
  - Amelia Hart 9C out / 9D back; Noah Hart 9B out / 9E back; Total $660.88, card ending 4242
- **FR-MNG-04** (Should) A member can only open their own bookings.
  - Looking up a reference of another member shows "Booking RC5V1T was not found" and reveals nothing
- **FR-MNG-05** (Could) Manage pages require sign-in; a signed-out visit to a booking shows "Sign in to manage your booking" and returns to that booking after login.

## Cancellation and seat changes (CAN)

Fare-based refunds and the seat-change window.

- **FR-CAN-01** (Must) Cancelling a Standard booking deducts a $75.00 fee per paying passenger per flight from the fare; taxes and seats are refunded. Refund = amount paid minus fee. The dialog shows Paid, Cancellation fee and Refund to card, and nothing changes until confirmed.
  - PX4K7M: Paid $660.88; Cancellation fee $300.00; Refund to card $360.88
  - Escape or "Keep booking" closes the dialog; status stays Confirmed
  - Confirming: status Cancelled and note "Refunded $360.88 to the card ending 4242, after a $300.00 cancellation fee"
  - The booking moves to the Cancelled tab (2 cancelled, 2 upcoming)
- **FR-CAN-02** (Should) Cancelling a Basic booking refunds taxes only; the fare and seats are kept. Flex refunds in full.
  - QT9W2C: Paid $132.42; Cancellation fee $0.00; Not refundable $103.00; Refund to card $29.42
- **FR-CAN-03** (Could) Seat changes close 24 hours before departure.
  - QT9W2C (departs next day 05:05): "Seat changes close 24 hours before departure" and the seat is unchanged
- **FR-CAN-04** (Could) The bookings table has Reference, Trip, Departs, Passengers, Status and Total columns with right-aligned totals; the cancel dialog is centred over a dimmed page with "Keep booking" as the quiet button and "Cancel booking" as the danger button.

## Non-functional requirements

- **NFR-01** (Could) At 390px width the sidebar collapses behind a Menu button (with a drawer that "Close menu" dismisses), results stack with filters above the list and there is no horizontal page scroll.

## Glossary and rules

- **Fare family** — Basic (no bags, no changes, taxes-only refund), Standard (1 bag, $75 fee), Flex (2 bags, free changes, full refund).
- **Exit row** — Row 14; not available to passengers under 16 or adults travelling with an infant.

## Out of scope

- Real payment networks
- Loyalty points
- Check-in and boarding passes
