= Use-case 0002 — Log in =

'''Initiating actor:''' Visitor

'''Other actors:''' —

A registered user authenticates so the system can treat subsequent actions as a Trader.

== Scenario ==

 1. Visitor chooses "Login" from the anonymous menu.
 2. System prompts for username and password.
 3. Visitor enters values.
 4. System looks up the user:

{{{
SELECT id, password_hash
  FROM project.users
 WHERE username = $1;
}}}

 5. If no row is returned, system responds "Invalid credentials." and scenario ends.
 6. If a row is returned, system compares the stored hash against sha256 of the entered password. On mismatch it responds "Invalid credentials." and ends.
 7. On match, system records the returned `id` and username in the session and displays the authenticated menu.

=== Alternate flow 4a — authenticated lookup with live balance ===

The system may combine identity lookup with live balance in a single query, for use cases that need both:

{{{
SELECT id, available_balance, invested_balance
  FROM project.users
 WHERE username = $1
   AND password_hash = encode(digest($2, 'sha256'), 'hex');
}}}
