# Migration V6 - Notes techniques

## Colonnes de timestamp en double

La migration V6 contient volontairement des colonnes de timestamp en double pour certaines tables. Ceci n'est PAS une erreur mais un choix de design.

### transaction_approvals

**Colonnes:**
- `created_at` : Timestamp métier utilisé pour la logique d'approbation (calcul d'expiration)
- `date_creation` : Timestamp d'audit BaseEntity (créé automatiquement par JPA)

**Raison:**
L'entité TransactionApproval a besoin d'un timestamp métier (`createdAt`) pour calculer l'expiration (`expiresAt = createdAt + 7 jours`). Ce timestamp ne doit pas être confondu avec `dateCreation` qui est purement pour l'audit.

**Code Java correspondant:**
```java
@Entity
public class TransactionApproval extends BaseEntity {
    @Column(name = "created_at", nullable = false)
    private LocalDateTime createdAt;

    // Logique métier utilisant createdAt
    @PrePersist
    protected void onCreate() {
        super.onCreate();
        if (createdAt == null) {
            createdAt = LocalDateTime.now();
        }
        if (expiresAt == null && createdAt != null) {
            expiresAt = createdAt.plusDays(7);
        }
    }
}
```

### budgets

**Colonnes:**
- `created_at_budget` : Timestamp métier de création du budget (distinct de la modification de l'enregistrement)
- `date_creation` : Timestamp d'audit BaseEntity

**Raison:**
Un budget peut être créé à une date, puis modifié plusieurs fois. `created_at_budget` représente la date de création du budget lui-même (logique métier), tandis que `date_creation` représente la première insertion en base (audit).

**Code Java correspondant:**
```java
@Entity
public class Budget extends BaseEntity {
    @Column(name = "created_by_id", nullable = false)
    private UUID createdById;

    @Column(name = "created_at_budget", nullable = false)
    private LocalDateTime createdAtBudget;
}
```

## Recommandation future

Pour éviter cette confusion, on pourrait :
1. Renommer `created_at` en `requested_at` (transaction_approvals)
2. Renommer `created_at_budget` en `budget_creation_date` (budgets)

Mais cela nécessiterait une modification des entités Java et une nouvelle migration.

## Colonnes BaseEntity standard

Toutes les tables incluent les colonnes BaseEntity :
- `date_creation` : Date de création de l'enregistrement (auto)
- `date_modification` : Date de dernière modification (auto)
- `cree_par` : Utilisateur créateur
- `modifie_par` : Dernier utilisateur modificateur
- `version` : Numéro de version (optimistic locking)
- `actif` : Flag soft delete
