Add IDBConnection dependency to MemberService and wrap create(),
update(), and softDelete() in transactions (beginTransaction/commit/
rollback). This ensures atomicity when inserting/updating members
alongside sub-entities (addresses, phones, emails) — a failure at
any step now rolls back the entire operation instead of leaving
orphaned records.
(Closes#203)
- MemberMapper: 8 new *WithRelations() methods that fetch members with
addresses, phones, and emails in a single query using LEFT JOINs
- MemberMapper: addJoinClauses() and fetchWithRelations() private helpers
that handle JOIN duplication (one member × multiple sub-entities)
- MemberService: refactored findAll, findByFamily, findByStatus, search,
findByBirthdayThisMonth, findWithUnpaidFees, findFiltered, fullTextSearch
to delegate to joined mapper methods
- MemberService: added arrayToMember() and arrayToAddress() helpers so
buildMatchContext() works with flat-array results from fullTextSearch
- MemberServiceTest: updated all existing tests to mock new method names
and return flat-array format with nested sub-entities
- MemberServiceTest: added 10 new tests covering joined methods, backward
compatibility, and correct shape of returned data
- Moved issue-200 plan from open/ to done/
- Move completed plan files to .plans/done/
- Move 18 open plan files to .plans/open/
- Update .gitignore to exclude .verified_plans temp file
- Verified all 18 open plans still describe unimplemented issues