_isOccupied matched any service on the slot regardless of status. Unblocking sets the service to cancelled, so a released slot still rendered as occupied and the unblock looked like it did nothing. Cancelled and denied services are now ignored, and self-booked slots get their own "Bloqueado" state with a release action, mirroring the web. Self-booking now spans the professional's configured slot duration instead of a hardcoded two hours, which no longer matched the generated slots. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>