Files
clubber/openspec/changes/support-organization-members/proposal.md
T
gurixandClaude 5053b80998 feat: Add organization member support with memberType field
Implements support for both individual persons and organizations as members.

Changes:
- Added MemberType enum (INDIVIDUAL, ORGANIZATION) to distinguish member types
- Added member_type column to database (defaults to INDIVIDUAL for backward compatibility)
- Added company_name field for organizations
- Made first_name nullable (required for individuals, optional for organizations)
- Implemented conditional validation:
  - INDIVIDUAL members require first_name
  - ORGANIZATION members require company_name
- Updated GraphQL schema with new memberType and companyName fields
- Updated all resolvers to handle new fields and validation
- Added comprehensive unit tests for validation logic
- Updated existing tests to work with new fields
- All 53 tests passing

Technical notes:
- Using memberType instead of 'kind' to avoid GraphQL introspection conflicts
- Using native_enum=False for SQLite compatibility
- Using batch_alter_table for SQLite ALTER COLUMN compatibility
- Backward compatible: existing members automatically become INDIVIDUAL type

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 12:15:55 +01:00

20 lines
873 B
Markdown

# Proposal: Support Organization Members
## Summary
Update the member data model to support both individual persons and organizations. Organizations will have a company name instead of a mandatory first name.
## Background
Currently, the system only supports individual members with a mandatory first name. We need to accommodate organizational members (companies, associations, etc.) where the primary identifier is the organization name.
## Goals
- Allow distinguishing between individual and organization members.
- Make `first_name` optional for organizations.
- Add `company_name` field, mandatory for organizations.
- Ensure data integrity based on member type.
## Non-Goals
- Complex hierarchy of organizations and contacts (for now, just a simple distinction).
## Technical Note
- Field name: `memberType` (not `kind` to avoid GraphQL introspection conflicts)