Okay, the method I give you will require one variable for each valid phone number, and a common event that will handle all the "make a call" logic for all numbers. Using a variable means we can have multiple states for each number - the number is not available, the number is available but hasn't been called, and the number has been called. You could also use switches, but it would mean two switches for each phone number.
So for the events that will 'enable' each phone number, do a Control Variables command and set the variable that controls that phone number to 1. You will need to make sure this event page can only be run once, otherwise you might end up enabling a phone number, calling that number, then coming back to this event and enabling it again.
On your starting map, create an event with a parallel process trigger. In this event, do a Control Variables command to set all the variables that control the side quest phone numbers to 1, and turn on Self Switch A. Then create a second event page and set its condition to Self Switch A without changing anything else on the page. This will make it run only at the very start of the game, to make all the side quest phone numbers available. If you have the variables grouped - say, all the main quest phone numbers will be controlled by variables 100-199, and all the side quest phone numbers will be controlled by variables 200-299, then you can just do a single Control Variables command for the side quests, using 200-299 as the range to set to 1, rather than repeating the command for 100 individual variables.
Now create a common event for the "phone call". Leave its trigger as none. We'll come back to this in a minute.
Finally on every phone event, simply add a Common Event command and specify this "phone call" common event. This means no matter what phone you interact with on what map, the same processing will happen.
Now back to the common event. Add commands to it that look like this (these are event commands, not a script call - don't get confused by the word "code" here):
Code:
Input Number: "Phone Number" (new variable) - 8 digits
Conditional Branch: Phone Number = 12345678 (your first valid phone number)
Conditional Branch: 12345678 (the variable that controls that number) = 1
Play SE: 12345678 message
Wait X frames
Control Variables: 12345678 (the variable that controls that number) = 2
Exit Event Processing
Else
Jump to Label: Bad Number
End
End
Conditional Branch: Phone Number = 11223344 (your second valid phone number)
Conditional Branch: 11223344 (the variable that controls that number) = 1
Play SE: 11223344 message
Wait X frames
Control Variables: 11223344 (the variable that controls that number) = 2
Exit Event Processing
Else
Jump to Label: Bad Number
End
End
... repeat the above block for each phone number
Label: Bad Number
Play SE: Invalid Number message
Wait X frames
Okay, let's go through this.
First, we are getting the phone number from the player.
Then we are comparing it to each valid phone number.
Once we've found a valid phone number, we're checking to see if the player is actually allowed to call that number at this point in the game.
If they are allowed, we play the appropriate SE for that message (note you said BGS, but it is not a BGS, as that will loop/repeat until you tell it to stop, which we don't want; it needs to be an SE which will play once and then stop).
Then we wait an appropriate number of frames for that message to play (60 frames is 1 second, so if the SE takes 5 seconds to play, you will wait for 60 x 5 = 300 frames - you might need to experiment a bit with this). This is what makes the player stand there until the message has finished.
Then we change the variable to 2, which indicates they've called that number and are no longer allowed to call it anymore.
Finally the Exit Event Processing is just an early exit point - they've called a good number, we've done what needed to be done, and there's no need to check for any more numbers.
If it's a valid number but they're either not allowed to call it yet, or they've already called it, the event will fall through to the Else statement, and because we want the same thing to happen here no matter what the number was, we'll just jump to a label at the bottom of the event so we only have to add the commands once.
Now for the Bad Number label ... this will be processed if the player called a valid number when they're not allowed to or after they've already called it, and we've told it to jump down here. It will also be processed if the number the player entered didn't match any of the valid numbers.
Here we just play the SE for the "wrong number" message and wait the appropriate number of frames for the message SE to finish.
Because we're already at the bottom of the common event, we don't need to worry about an Exit command, as that's going to happen by default anyway.
So that's the non-script way to do it. There IS another way that involves a single variable to hold an array of ALL the phone numbers that can be called, and script calls that will reduce the common event to just a single block. If you would prefer to do that and feel comfortable about doing some script calls, say so and I'll give you that method as well.