22 Commits

Author SHA1 Message Date
shahondin1624 19adf0ba87 chore: move issue-204 plan to done 2026-04-30 08:13:11 +02:00
shahondin1624 bfb57b4e1e refactor(MemberService): extract generic syncSubEntities() method
Factor out the duplicated sync logic from syncAddresses(), syncPhones(),
and syncEmails() into a single generic syncSubEntities() method that
accepts callables for fetch/update/create/delete operations. Each
specialized sync method is now a thin ~10-line wrapper.

(Closes #204)
2026-04-30 08:12:35 +02:00
shahondin1624 0ffc993d3f chore: move issue-203 plan to done
Database Portability Tests / Unit Tests (PlatformHelper) (pull_request) Failing after 37s
Database Portability Tests / Integration (mysql) (pull_request) Has been skipped
Database Portability Tests / Integration (postgres) (pull_request) Has been skipped
Database Portability Tests / Integration (sqlite) (pull_request) Has been skipped
Database Portability Tests / Verify no MySQL-specific SQL (pull_request) Successful in 5s
2026-04-29 22:09:20 +02:00
shahondin1624 e1d24d4d54 fix(MemberService): wrap multi-step writes in database transactions
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)
2026-04-29 22:08:38 +02:00
shahondin1624 d4e25fe739 Fix countArchived() loading all members into memory (Closes #201)
Database Portability Tests / Unit Tests (PlatformHelper) (pull_request) Failing after 38s
Database Portability Tests / Integration (mysql) (pull_request) Has been skipped
Database Portability Tests / Integration (postgres) (pull_request) Has been skipped
Database Portability Tests / Integration (sqlite) (pull_request) Has been skipped
Database Portability Tests / Verify no MySQL-specific SQL (pull_request) Successful in 5s
Replace in-memory filtering with a SQL COUNT(*) query in the mapper,
matching the pattern of the existing countAll() method.
2026-04-29 19:13:52 +02:00
shahondin1624 ee569250ad Fix N+1 query problem in MemberService (Closes #200)
Database Portability Tests / Unit Tests (PlatformHelper) (push) Failing after 40s
Database Portability Tests / Integration (mysql) (push) Has been skipped
Database Portability Tests / Integration (postgres) (push) Has been skipped
Database Portability Tests / Integration (sqlite) (push) Has been skipped
Database Portability Tests / Verify no MySQL-specific SQL (push) Successful in 5s
- 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/
2026-04-28 21:35:42 +02:00
shahondin1624 b29a268b1d Restructure .plans/ into done/ and open/ subdirectories
- 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
2026-04-28 20:30:55 +02:00
shahondin1624 9ed69b78ca feat: database portability — support PostgreSQL and SQLite (Closes #192)
Database Portability Tests / Unit Tests (PlatformHelper) (push) Failing after 45s
Database Portability Tests / Integration (mysql) (push) Has been skipped
Database Portability Tests / Integration (postgres) (push) Has been skipped
Database Portability Tests / Integration (sqlite) (push) Has been skipped
Database Portability Tests / Verify no MySQL-specific SQL (push) Successful in 4s
2026-04-12 13:46:22 +02:00
shahondin1624 7b582639e1 Commit possible fixes for build 2026-04-07 21:46:41 +02:00
shahondin1624 c4712b12bc feat: Import wizard with CSV parsing and duplicate detection (Closes #58) 2026-04-07 16:27:39 +02:00
shahondin1624 bbbc5fab0c feat: Visual query builder with AST-to-SQL engine (Closes #53) 2026-04-07 16:22:15 +02:00
shahondin1624 af2eaeffd7 feat: FileLinkService + FileExplorer component (Closes #52) 2026-04-07 16:16:25 +02:00
shahondin1624 1abae92b38 feat: add ReportService and PDF generation with TCPDF (Closes #46) 2026-04-07 14:58:56 +02:00
shahondin1624 a1dce160c4 feat: add encrypted export with password-protected ZIP (Closes #48) 2026-04-07 14:55:25 +02:00
shahondin1624 187a2d667e test: add comprehensive unit tests for FeeCalculationService (Closes #45) 2026-04-07 13:38:02 +02:00
shahondin1624 c903faf6a4 feat: add FeeCalculationService with family discounts and batch processing (Closes #42) (#83) 2026-04-07 12:48:47 +02:00
shahondin1624 1f16161c6c feat: add Member detail Vue component with tabbed form (Closes #24) (#73) 2026-04-07 11:58:20 +02:00
shahondin1624 34576e896d feat: add Member list Vue component with store and router (Closes #23) (#72) 2026-04-07 11:55:34 +02:00
shahondin1624 17bdf7e54a feat: add MemberController REST API endpoints (Closes #22) (#71) 2026-04-07 11:41:37 +02:00
shahondin1624 938dc79a04 feat: add MemberService with CRUD, validation, and soft-delete (Closes #21) (#70) 2026-04-07 11:39:42 +02:00
shahondin1624 fec34f2aa9 feat: add Member entity, mapper, and sub-entity classes (Closes #20) (#69) 2026-04-07 11:37:05 +02:00
shahondin1624 b01b375e72 feat: add DB migrations for addresses, phones, emails tables (Closes #19) (#68) 2026-04-07 11:34:39 +02:00