Patriot Platform Members 1.11 — Bulk attendance updates

INSTALL
Upload patriot-platform-1.11.zip through Plugins > Add New > Upload Plugin.
Replace the installed plugin. Full package includes all earlier additions.
No database upgrade or reactivation needed.

HOW TO USE
Open Patriot Platform > Event attendance > Attendance list.
Tick members in the new Select column, choose Attended, No-show or Not marked
from Mark selected members, then click Save selected attendance.
Select all on this page selects current registrations on the visible page only.
Clear selection unticks them. Manual checkboxes work without JavaScript.
The existing individual Save attendance controls remain available.

PAPER ROLL WORKFLOW
After your meeting, select everyone ticked Attended on the printed roll and
save them together. Then select the absent members and save them as No-show.
Work through later attendee pages as needed. Each save accepts up to 50 IDs.
Only selected members change; unselected people retain their saved attendance.
If filtering by Not marked, saved members disappear from that filter on reload.
After a successful save the page returns to the event's default attendee view;
reapply filters and navigate pages as required. Selections are not preserved.

SCOPE AND PERMISSIONS
Administrator or the event's currently approved regional organiser only.
National events remain administrator-managed. Trashed events cannot be bulk marked.
Cancelled registrations cannot be selected or changed through the bulk control.
Authenticated POST and an event-specific nonce are required.
The server verifies every selected registration belongs to this event, is still
confirmed and has the same registration generation as when the page was shown.
If any selected member cancelled/re-registered, reload and select again. No rows
are changed when preflight validation fails. All selected rows use one bounded
UPDATE under the existing event registration lock.
Audit failure blocks the save. Database failures return an explicit error; reload
the list to inspect the saved state before retrying a failed database request.
The audit records selected registration IDs, event and attendance state.
Marking records the organiser ID and UTC marking time, as individual saves do.
RSVP status, volunteer choice, mail generation and registration time are unchanged.
No email is sent merely because attendance is marked.

LOCAL TEST
1. Add several test registrations to an event.
2. Select two, mark Attended and verify only those two change.
3. Select all on this page, then Clear selection and verify both controls.
4. Reset selected members to Not marked, then try No-show.
5. Filter the list or use a second page and confirm Select all remains page-scoped.
6. Cancel/re-register a selected member in another tab, then save the old selection:
   it must ask for a reload without changing the other selected registrations.
7. Test as an approved regional organiser; other-region access must be refused.

VALIDATION
219 isolated PHP behaviour/render checks passed, including all previous suites.
New checks cover selection bounds, duplicates, permissions, wrong-event/cancelled
rows, registration generations, audit/lock/database failures and unchanged RSVP
fields. JavaScript select/clear scoping checked with a simulated document.
All 28 PHP files parse as PHP 8.0; JavaScript syntax and ZIP integrity checked.
Live WordPress database, form submission and browser behaviour still need local
verification. Simulated checks do not replace your integration tests.
