GET /services/professional returns all statuses including cancelled. After unblocking (self_booked → cancelled), _isOccupied matched the cancelled service because it only excluded selfBooked. Exclude cancelled and denied from _isOccupied so unblocked slots correctly revert to Disponible. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>