I got a reasonably user friendly hot-desking setup. dial plan is a bit crude but you should get the idea:
[hotdesks]
;hotdesk login
exten => 501,1,Answer
exten => 501,n,Read(USER,sc_enter_extension,4)
exten => 501,n,Read(USERc,sc_enter_extension_confirm,4)
exten => 501,n,GotoIf($[${USER} = ${USERc}]?20:70)
;lookup old user stuff before loggin new usesr in - TODO: store in DB!
exten => 501,20,Set(OLDCID=${EXTMAPU_${USER}})
exten => 501,n,Set(OLDUSER=${EXTMAPC_${CALLERID}})
exten => 501,n,SetGlobalVar(EXTMAPU_${OLDUSER}=0)
exten => 501,n,SetGlobalVar(EXTMAPC_${OLDCID}=0)
exten => 501,n,RemoveQueueMember(uk_sales_team)
exten => 501,n,RemoveQueueMember(uk_sales_admin)
exten => 501,n,RemoveQueueMember(eu_sales_admin)
exten => 501,n,RemoveQueueMember(eu_sales_team)
exten => 501,n,RemoveQueueMember(prof_serv_admin)
exten => 501,n,RemoveQueueMember(marketing_admin)
exten => 501,n,RemoveQueueMember(finance_admin)
exten => 501,n,RemoveQueueMember(support_admin)
exten => 501,n,RemoveQueueMember(support_team)
exten => 501,n,RemoveQueueMember(scuk_ts)
exten => 501,n,RemoveQueueMember(sceu_ts)
exten => 501,n,RemoveQueueMember(other)
; set Extension Map var EXTMAP by User and EXTMAP by CALLERID (actual sip extension)
exten => 501,n,SetGlobalVar(EXTMAPU_${USER}=${CALLERID})
exten => 501,n,SetGlobalVar(EXTMAPC_${CALLERID}=${USER})
; log user in to relevant queue
exten => 501,n,Set(QUEUE=${DB(queues/${USER})})
exten => 501,n,Set(OTHERQUEUE=${DB(otherqueue/${USER})})
exten => 501,n,GotoIf(${QUEUE}?50:60)
exten => 501,50,AddQueueMember(${QUEUE},SIP/${CALLERID})
exten => 501,n,AddQueueMember(${OTHERQUEUE},SIP/${CALLERID})
exten => 501,n,Playback(sc_user_logged_in)
exten => 501,60,Playback(sc_user_logged_in)
exten => 501,n,Hangup()
;Loging extensions didn't match
exten => 501,70,Playback(sc_extensions_dont_match)
exten => 501,n,Goto(hotdesks,501,1)
;hotdesk logout
exten => 502,1,Answer()
exten => 502,n,Set(USER=${EXTMAPC_${CALLERID}})
exten => 502,n,SetGlobalVar(EXTMAPU_${USER}=0)
exten => 502,n,SetGlobalVar(EXTMAPC_${CALLERID}=0)
exten => 502,n,RemoveQueueMember(uk_sales_team)
exten => 502,n,RemoveQueueMember(uk_sales_admin)
exten => 502,n,RemoveQueueMember(eu_sales_admin)
exten => 502,n,RemoveQueueMember(eu_sales_team)
exten => 502,n,RemoveQueueMember(prof_serv_admin)
exten => 502,n,RemoveQueueMember(marketing_admin)
exten => 502,n,RemoveQueueMember(finance_admin)
exten => 502,n,RemoveQueueMember(support_admin)
exten => 502,n,RemoveQueueMember(support_team)
exten => 502,n,RemoveQueueMember(scuk_ts)
exten => 502,n,RemoveQueueMember(sceu_ts)
exten => 502,n,RemoveQueueMember(other)
exten => 502,n,Playback(sc_user_logged_out)
exten => 502,n,Hangup()
exten => 503,1,SayDigits(${EXTMAPC_${CALLERID}})
exten => 503,n,Hangup
;call hotdesk extension with proper CID
exten => _09XX,1,Answer()
exten => _09XX,n,GotoIf(${EXTMAPC_${CALLERID}}?10:20)
exten => _09XX,10,SetCallerID(${DB(users/${EXTMAPC_${CALLERID}})})
exten => _09XX,n,Dial(SIP/${EXTMAPU_${EXTEN}},8)
exten => _09XX,n,Voicemail(u${EXTEN})
exten => _09XX,20,Playback(sc_login_first)
;actual sip extensions
exten => _XX,1,SetCallerID(${DB(users/${EXTMAPC_${CALLERID}})})
exten => _XX,n,Dial(SIP/${EXTEN})