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>
20 lines
873 B
Markdown
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)
|