Issue #51: feat: Board tools (Polls, task management, issue reporting)

State:

CLOSED

Milestone:

Jalon 2: Conformité Légale Belge 📋

Labels:

phase:vps,track:software priority:high

Assignees:

Unassigned

Created:

2025-10-27

Updated:

2025-11-18

URL:

View on GitHub

Description

## Context

Le conseil de copropriété (Syndic + membres élus) a besoin d'outils pour gérer les décisions courantes entre les AG :
- Consulter les résidents rapidement (sondages)
- Suivre les tâches du conseil
- Gérer les signalements de problèmes
- Documenter les décisions

**Cas d'usage :**
- \"Quelle couleur pour repeindre le hall ?\"
- \"Quel entrepreneur choisir pour la toiture ?\"
- \"Qui s'occupe d'obtenir 3 devis pour le chauffage ?\"
- \"Fuite d'eau signalée au 3ème étage\"

## Features

### 1. Sondages (Polls)

**Types :**
- Oui/Non
- Choix multiples
- Note (1-5 étoiles)
- Question ouverte

**Exemple :**
```
Titre: Choix entrepreneur toiture
Options:
  - Entrepreneur A (€15,000) [PDF devis]
  - Entrepreneur B (€18,000) [PDF devis]
  - Entrepreneur C (€16,500) [PDF devis]
Fin: 7 jours
Résultat: 45/60 votes, Entrepreneur B choisi (52%)
```

**Entité :**
```rust
pub struct Poll {
    pub id: Uuid,
    pub building_id: Uuid,
    pub title: String,
    pub poll_type: PollType, // YesNo, MultipleChoice, Rating, OpenEnded
    pub options: Vec<PollOption>,
    pub is_anonymous: bool,
    pub ends_at: DateTime<Utc>,
    pub status: PollStatus,
}
```

### 2. Gestion de Tâches (Board Tasks)

**Tableau Kanban :** À faire | En cours | Terminé

**Tâches typiques :**
- Obtenir 3 devis toiture → Pierre
- Réviser police assurance → Marie
- Organiser AG annuelle → Syndic
- Suivre retard entrepreneur → Jacques

**Entité :**
```rust
pub struct BoardTask {
    pub id: Uuid,
    pub title: String,
    pub assigned_to: Option<Uuid>,
    pub priority: TaskPriority, // Urgent, High, Normal, Low
    pub status: TaskStatus, // Todo, InProgress, Completed
    pub due_date: Option<DateTime<Utc>>,
}
```

### 3. Signalements (Issue Reporting)

**Résidents signalent problèmes :**
- Fuite d'eau
- Lumière cassée
- Ascenseur en panne
- Nuisance sonore
- Problème parking

**Workflow :**
1. Résident signale avec photos
2. Syndic voit notification
3. Assigne tâche à conseil/entrepreneur
4. Suit résolution
5. Notifie résident quand résolu

**Entité :**
```rust
pub struct BuildingIssue {
    pub id: Uuid,
    pub reported_by: Uuid,
    pub title: String,
    pub category: IssueCategory, // Plumbing, Electricity, Heating, Security
    pub severity: IssueSeverity, // Critical, High, Medium, Low
    pub status: IssueStatus, // Reported, InProgress, Resolved
    pub photos: Vec<String>,
}
```

### 4. Journal Décisions (Decision Log)

**Transparence décisions conseil :**
- \"Conseil a choisi Entrepreneur X (€5,000)\"
- \"Nouvelle règle : interdiction fumer espaces communs\"
- \"Décision reportée à prochaine AG : panneaux solaires\"

**Entité :**
```rust
pub struct BoardDecision {
    pub id: Uuid,
    pub title: String,
    pub description: String,
    pub decision_date: DateTime<Utc>,
    pub vote_summary: String, // \"Unanime\" ou \"4 pour, 1 contre\"
    pub is_public: bool,
}
```

## Permissions

| Action | Résident | Membre Conseil | Syndic |
|--------|----------|----------------|--------|
| Voir sondages | ✅ | ✅ | ✅ |
| Créer sondages | ❌ | ✅ | ✅ |
| Voter | ✅ | ✅ | ✅ |
| Gérer tâches | ❌ | ✅ | ✅ |
| Signaler problème | ✅ | ✅ | ✅ |
| Assigner problème | ❌ | ✅ | ✅ |

**Nouveau rôle :** `BoardMember` (membre élu du conseil)

## API Endpoints

**Polls :**
- POST /api/v1/buildings/:id/polls
- GET /api/v1/polls/:id/results
- POST /api/v1/polls/:id/vote

**Tasks :**
- POST /api/v1/buildings/:id/board-tasks
- PUT /api/v1/board-tasks/:id/status

**Issues :**
- POST /api/v1/buildings/:id/issues
- PUT /api/v1/issues/:id/resolve

**Decisions :**
- POST /api/v1/buildings/:id/board-decisions
- GET /api/v1/buildings/:id/board-decisions

## Effort

**Large** (8-10 jours)

## Related

- Complète: #46 (votes AG formels)
- Dépend: #28 (multi-rôles pour BoardMember)