Bridge many channel together using originate command

I have the following requirement:
My system has 3 type of users

1. Admin
2. Sales
3. Customer

  • One sale person can only call one customer per time. This is a private conversation
  • If the sale call the customer putting 9 in front of the number the admin can say a message to both sales person and customer later on. If sales do not put 9 in front admins are not entitled to speak into the channel
  • Admin must not hear what both sales and customer says. Never
  • If the sales person close the call the customer call should drop

I am aware this is too complex for a blog like this but I am on my own and I do not have any support to complete this.

What I have done so far

Firstly, I asked 2 questions on this forum that helped me a lot on how to do this but now I have some issues

;Anyone who dials out with 9 can be spied later on
exten => _90XXXXXXXX.,1,Noop()  ;whatever starts with nine
   same => n,Set(SPYGROUP=8005)       
   same => n,Dial(SIP/${EXTEN:1}@mytrunk)
   same => n,Hangup()

;Spy exten dialed with 9 
exten => 8009,1,NoOp()
   same => n,ChanSpy(,g(8005),qWB)

This works fine with 1 active call and another phone spying it in whisper mode. This unfortunately bridge only the first channel not all of them with SPYGROUP label set to 8005
Now I am trying to improve this to make it working with many phones. Everyone is pointing to create a conference before any call and then barge every sales person and customer into that conference.

Good but I have the following problems

  1. When either the user or the customer leave the conference one of them still stay in the conference

Below my example

;Anyone who dials out with 9 can be spied later on
 exten => _90XXXXXXXX.,1,Noop()  ;whatever starts with nine       
   same => n,Dial(SIP/${EXTEN:1}@mytrunk,360,G(default,8007,2))
   same => n,Hangup()

exten => 8007,1,NoOp()
    same => 2,Goto(setconference1)
    same => 3,Goto(setconference2)
    same => n(setconference1),Set(CONFBRIDGE(user,admin)=no)
    same => n,Set(CONFBRIDGE(user,startmuted)=yes)
    same => n,Set(CONFBRIDGE(user,announce_only_user)=no)
    same => n,ConfBridge(conf)
    same => n(setconference2),Set(CONFBRIDGE(user,admin)=no)
    same => n,Set(CONFBRIDGE(user,startmuted)=yes)
    same => n,Set(CONFBRIDGE(user,announce_only_user)=no)
    same => n,ConfBridge(conf)

exten => 8008,1,NoOp()same => n,ConfBridge(conf)
    same => n(setconference1),Set(CONFBRIDGE(user,admin)=yes)
    same => n,Set(CONFBRIDGE(user,startmuted)=no)
    same => n,ConfBridge(conf)

In this example sales guys call customers dialing with 9 whereas admin use extension 8008 to say the message
The admin extension works fine but in order to prevent that customers will hear other customers or sales guy everyone join the call muted and they can only hear what the admin say

I believe that is getting complicated and I need to create a dialplan that does 3 things

When the admin dial it checks all live channels and barge them in a conference all muted. The admin should be the only person able to speak in that conference. When the admin leaves the conference should be destroyed

Thank you for your patient

Regards