autocomit
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
# Story 3: Contact Management
|
||||
|
||||
## Story Overview
|
||||
|
||||
**As a** system user
|
||||
**I want** to manage contacts and their roles
|
||||
**So that** I can associate stakeholders with applications and business units
|
||||
|
||||
**Story Type**: Feature
|
||||
**Priority**: Medium
|
||||
**Estimated Effort**: 3-5 days
|
||||
**Dependencies**: Story 0 (Foundation)
|
||||
|
||||
---
|
||||
|
||||
## Business Value
|
||||
|
||||
Contacts represent stakeholders (Product Owners, Developers, etc.) and their roles. This enables:
|
||||
- Tracking who is responsible for what
|
||||
- Contact information management
|
||||
- Foundation for application stakeholder mapping (used in later stories)
|
||||
|
||||
---
|
||||
|
||||
## Scope
|
||||
|
||||
### In Scope
|
||||
✅ Contact role management (predefined roles)
|
||||
✅ Person management (individuals)
|
||||
✅ Contact-Person associations
|
||||
✅ Basic CRUD for all entities
|
||||
|
||||
### Out of Scope (Story 2, 6)
|
||||
❌ Application-Contact associations (added when Story 2 needs it)
|
||||
❌ Business Unit-Contact associations
|
||||
❌ SLA-Contact associations (Phase 2)
|
||||
|
||||
---
|
||||
|
||||
## Database Schema
|
||||
|
||||
```sql
|
||||
-- Contact Roles (predefined)
|
||||
CREATE TABLE contact_role (
|
||||
id UUID PRIMARY KEY,
|
||||
role_name VARCHAR(100) UNIQUE NOT NULL,
|
||||
description TEXT,
|
||||
created_at TIMESTAMP NOT NULL,
|
||||
updated_at TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
-- Persons (individuals)
|
||||
CREATE TABLE person (
|
||||
id UUID PRIMARY KEY,
|
||||
first_name VARCHAR(100) NOT NULL,
|
||||
last_name VARCHAR(100) NOT NULL,
|
||||
email VARCHAR(255) UNIQUE NOT NULL,
|
||||
phone VARCHAR(50),
|
||||
created_at TIMESTAMP NOT NULL,
|
||||
updated_at TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
-- Contacts (functional roles)
|
||||
CREATE TABLE contact (
|
||||
id UUID PRIMARY KEY,
|
||||
contact_role_id UUID NOT NULL REFERENCES contact_role(id),
|
||||
created_at TIMESTAMP NOT NULL,
|
||||
updated_at TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
-- Contact-Person junction (many-to-many)
|
||||
CREATE TABLE contact_person (
|
||||
contact_id UUID NOT NULL REFERENCES contact(id) ON DELETE CASCADE,
|
||||
person_id UUID NOT NULL REFERENCES person(id) ON DELETE CASCADE,
|
||||
is_primary BOOLEAN NOT NULL DEFAULT false,
|
||||
PRIMARY KEY (contact_id, person_id)
|
||||
);
|
||||
|
||||
-- Indexes
|
||||
CREATE INDEX idx_person_email ON person(email);
|
||||
CREATE INDEX idx_contact_role ON contact(contact_role_id);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Key Endpoints
|
||||
|
||||
### Contact Roles
|
||||
- `GET /api/contact-roles` - List all roles
|
||||
- `POST /api/contact-roles` - Create role (admin only)
|
||||
|
||||
### Persons
|
||||
- `GET /api/persons` - List all persons
|
||||
- `GET /api/persons/{id}` - Get person details
|
||||
- `POST /api/persons` - Create person
|
||||
- `PUT /api/persons/{id}` - Update person
|
||||
- `DELETE /api/persons/{id}` - Delete person
|
||||
|
||||
### Contacts
|
||||
- `GET /api/contacts` - List all contacts
|
||||
- `GET /api/contacts/{id}` - Get contact with persons
|
||||
- `POST /api/contacts` - Create contact (with person IDs)
|
||||
- `PUT /api/contacts/{id}` - Update contact
|
||||
- `POST /api/contacts/{id}/persons/{personId}` - Add person to contact
|
||||
- `DELETE /api/contacts/{id}/persons/{personId}` - Remove person from contact
|
||||
- `PATCH /api/contacts/{id}/persons/{personId}/primary` - Set as primary
|
||||
|
||||
---
|
||||
|
||||
## Frontend Components
|
||||
|
||||
### PersonListComponent
|
||||
- Table: First Name, Last Name, Email, Phone, Actions
|
||||
- CRUD operations
|
||||
|
||||
### ContactRoleListComponent
|
||||
- Simple list of roles (mostly read-only for regular users)
|
||||
|
||||
### ContactFormComponent
|
||||
- Select contact role (dropdown)
|
||||
- Multi-select persons (with primary designation)
|
||||
- Add/remove persons dynamically
|
||||
|
||||
---
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [ ] Contact roles can be created and listed
|
||||
- [ ] Persons can be created with unique email
|
||||
- [ ] Contacts can be created with role and persons
|
||||
- [ ] One person per contact can be marked as primary
|
||||
- [ ] Person can be associated with multiple contacts
|
||||
- [ ] All CRUD operations work via UI
|
||||
- [ ] Email uniqueness enforced
|
||||
- [ ] Tests pass (>80% backend, >70% frontend)
|
||||
|
||||
---
|
||||
|
||||
## Testing Scenarios
|
||||
|
||||
1. **Create Person**: Add new person with unique email
|
||||
2. **Duplicate Email**: Attempt to create person with existing email (should fail)
|
||||
3. **Create Contact**: Create contact with role and multiple persons
|
||||
4. **Set Primary**: Mark one person as primary contact
|
||||
5. **Remove Person**: Remove person from contact
|
||||
6. **Delete Person**: Delete person (should remove from all contacts)
|
||||
|
||||
---
|
||||
|
||||
**Story Status**: Ready for Development
|
||||
**Estimated Completion**: 3-5 days
|
||||
Reference in New Issue
Block a user