We've Moved! Please visit our new and improved forum over at our new portal: https://portal.plumvoice.com/hc/en-us/community/topics

ASP.Net Support

Questions and answers about IVR programming for Plum DEV

Moderators: admin, support

support
Posts: 3632
Joined: Mon Jun 02, 2003 3:47 pm
Location: Boston, MA
Contact:

current limitation of the trunks the IVR platform is using

Post by support »

Hi,

There is no way to get the local number associated with the session.telephone.dnis. This is due to the current limitation of the trunks the IVR platform is using. However, for production accounts, toll-free numbers are given, which provide you with the full 10-digit DNIS. These toll-free numbers run over separate trunk lines.

Regards,
Plum Support
Last edited by support on Mon Dec 28, 2009 3:51 pm, edited 1 time in total.

acadenilla
Posts: 55
Joined: Wed Oct 31, 2007 11:02 am

Post by acadenilla »

Alright i just have to changed it programmatically in code behind while i am in development mode

Can you check out this code

Code: Select all

<?xml version="1.0"?>
<vxml version="2.0">

<form id="asdfadsF">

           <field name="confirm" type="boolean">
                   <prompt>
                          Say Yes or No
                   </prompt>  
                   <grammar type="application/x-jsgf" mode="voice">
                               ( yes | no )
                   </grammar>               
           </field>

           <filled namelist="confirm" mode="all">
                   <if cond="confirm">
                            You said Yes
                   <else />
                            You said No
                   </if>
           </filled>

</form>
</vxml>
I am getting "Error .Semantic .ECMAType" What is wrong with the grammer?

Thanks

Allan

support
Posts: 3632
Joined: Mon Jun 02, 2003 3:47 pm
Location: Boston, MA
Contact:

IVR code should not contain built-in and inline grammar

Post by support »

Hi,

The reason why you are getting this IVR error is because you are specifying both a built-in IVR grammar (type="boolean") and an inline IVR grammar (the code using the grammar tags). Since you are already specifying a built-in grammar, I would just remove the inline IVR grammar. So, your IVR code should look like this:

Code: Select all

<?xml version="1.0"?>
<vxml version="2.0">

<form id="asdfadsF">

           <field name="confirm" type="boolean">
                   <prompt>
                          Say Yes or No
                   </prompt>        
           </field>

           <filled namelist="confirm" mode="all">
                   <if cond="confirm">
                            You said Yes
                   <else />
                            You said No
                   </if>
           </filled>

</form>
</vxml>
Regards,
Plum Support
Last edited by support on Fri Feb 26, 2010 11:02 am, edited 4 times in total.

acadenilla
Posts: 55
Joined: Wed Oct 31, 2007 11:02 am

Post by acadenilla »

One long question please bare with me ill try and be clear

First the code

Code: Select all

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SpecialtyAdd.aspx.cs" Inherits="Braveline.WRS.Voice.SpecialtyAdd" %>
<?xml version="1.0" encoding="UTF-8" ?>
<vxml version="2.0" application="AppRoot.vxml">	
<meta name="maintainer" content="<%=Braveline.WRS.BusinessObjects.Globals.IVR.IVRMaintainer%>" />

<script> 
    <![CDATA[ 

    function getSpecialtyUID(specialtyValue) 
    { 
       specialtyValue=specialtyValue.replace(/'/gi, "");
       var arrStatus=specialtyValue.split(",");
       return arrStatus[0];
    }
    
    function getSpecialty(specialtyValue) 
    {
        specialtyValue=specialtyValue.replace(/'/gi, "");
        var arrStatus=specialtyValue.split(",");
        if( arrStatus.length > 1 ) 
            return arrStatus[1];
        else 
            return "Error";
    }
    ]]> 
 </script>
 
    <form id="frmIntro">
         <block>
            <% if (NumOfSpecialties == 0)
               {  %>
                    <audio src="audio/Prophecy/ThereAreNoMoreSpecialtiesYouCanAdd_Prophecy.wav"  fetchhint="prefetch">	
	                    There are no more specialties that you can add at this time
	                </audio>
                    <goto next="SpecialtyManagement.aspx"></goto>
            <% } %>
        </block>
        <field name="whichSpecialty" type="digits?maxlength=3">
            <prompt bargein="true">
                <audio src="audio/Prophecy/SelectSpecialty_Prophecy.wav"  fetchhint="prefetch">	
	                You may advertise any specialty by speaking its name or pressing the three digit code you will hear before each name. Press 9 at any time to return to the Specialties menu
	            </audio>
                <%Response.Write(Prompt);%>
	            
	            <% if (OperationalHours == true)
                   { %>
                    <audio src="audio/Prophecy/RepeatSpecialtyList_Prophecy.wav"  fetchhint="prefetch">	
	                    To Repeat the list say AGAIN or press 1. If you have a specialty that did not appear on the list say OPERATOR or press 2 for immediate assistance. Say Main Menu or press star to exit specialties
	                </audio>    
                <% } else { %>
                    <audio src="audio/Prophecy/ToRepeatTheListSayAgainOrPressOne_Prophecy.wav"  fetchhint="prefetch">	
	                    To repeat the list, say AGAIN or press 1. If you have a specialty that did not appear in the list, Please call back between 9 am and 8 pm for operator assistance. Say Main Menu or press * to exit specialties
	                </audio>
                <% } %>   
	            
            </prompt>
            <%Response.Write(OptionList);%>
            <grammar type="text/gsl">
            <![CDATA[[
            [again]       {  <whichSpecialty  "again"> }
            [operator]       {  <whichSpecialty  "operator"> }
            [specialty]       {  <whichSpecialty  "specialty"> }
            ]]]>
            </grammar>
        </field>
        
        <block>
            <if cond="getSpecialty(whichSpecialty) == 'Error'">
                <audio src="audio/Prophecy/ThereIsNoMatchForThatSpecialty_Prophecy.wav"  fetchhint="prefetch">	
	                There is no match for that specialty
	            </audio>
                <goto next="SpecialtyAdd.aspx"></goto>  
            </if>
        </block>
        
        <filled namelist="whichSpecialty" mode="all">
            <if cond="whichSpecialty == '1'">
                <goto next="#frmIntro"></goto> 
            </if>
            <if cond="whichSpecialty == 'again'">
                <goto next="#frmIntro"></goto> 
            </if>
            <if cond="whichSpecialty == '2'">
                <goto next="OperatorMenu.aspx"></goto>
            </if>
            <if cond="whichSpecialty == 'operator'">
                <goto next="OperatorMenu.aspx"></goto>
            </if>
            <if cond="whichSpecialty == '9'">
                <goto next="SpecialtyManagement.aspx"></goto>
            </if>
            <if cond="whichSpecialty == 'specialty'">
                <goto next="SpecialtyManagement.aspx"></goto>
            </if>
            <%Response.Write(DtmfList);%>
        </filled>
        
        <field name="confirm" slot="confirm">
            <prompt>
                <audio src="audio/ConfirmAddSpecialty_beforeD_Prophecy.wav"  fetchhint="prefetch">	
	                You are Adding
	            </audio> 
                <value expr="getSpecialty(whichSpecialty)" />
                <audio src="audio/Prophecy/ConfirmAddSpecialty_afterD_Prophecy.wav"  fetchhint="prefetch">	
	                to your advertised specialties. Say ADD or press 1 to continue. Say Cancel or press 2 to hear more specialties instead
	            </audio> 
            </prompt>
            <grammar type="text/gsl">
            <![CDATA[[
            [add]       {  <confirm  "yes"> }
            [cancel]    {  <confirm  "no">  }
            ]]]>
            </grammar>
            <grammar type="text/gsl">
            <![CDATA[[
            [dtmf-1]    {  <confirm  "yes"> }
            [dtmf-2]    {  <confirm  "no">  }
            ]]]>
            </grammar>
        </field>
        
        <filled namelist="whichSpecialty confirm" mode="all">
            <if cond="confirm == 'yes'">
                <assign name="specialtyUID" expr="getSpecialtyUID(whichSpecialty)" />
                <assign name="specialtyName" expr="getSpecialty(whichSpecialty)" />
                <audio src="audio/Prophecy/PleaseWaitWhileWeUpdateInfo_Prophecy.wav"  fetchhint="prefetch">	
	                Please wait while we update your information
	            </audio> 
                <submit next="SpecialtyAdd.aspx#frmUpdate" method="post" namelist="confirm specialtyUID specialtyName"></submit>
            <else />
                <audio src="audio/Prophecy/YouDidNotAddTheSpecialty_Prophecy.wav"  fetchhint="prefetch">	
	                You did not add the Specialty
	            </audio> 
                <clear namelist="whichSpecialty confirm" />
                <goto next="SpecialtyAdd.aspx"></goto>    
            </if>
        </filled>
    </form>
    
    <form id="frmUpdate">
        <log expr="'************Updating Member Specialty List**********'" label="trace:?level=VD_INFO"/>
        <block>
            <audio src="audio/Prophecy/YourSpecialtyHasNowBeenUpdated_Prophecy.wav"  fetchhint="prefetch">	
	                Your Specialty has now been updated
	        </audio> 
            <goto next="SpecialtyManagement.aspx"></goto>
        </block>
    </form>

</vxml>
Code - Behind

Code: Select all

public partial class SpecialtyAdd : System.Web.UI.Page
    {
        public string Prompt = "";
        public string OptionList = "";
        public bool OperationalHours = false;
        public string DtmfList = "";
        public int NumOfSpecialties = 0;
        protected UnionMember CurrentMember = null;

        protected void Page_Load(object sender, EventArgs e)
        {
            string callSessionId = MemberController.GetCallSessionID();
            CurrentMember = MemberController.GetCurrentMember(callSessionId);

            if (!Page.IsPostBack)
            {
                this.BuildIntro();
                MemberController.LogMemberCallActivity(callSessionId, "Retrieved Specialty List Information Successfully");

            }

            if (Request.Form["specialtyUID"] != null && Request.Form["specialtyName"] != null)
            {
                int specialtyId = int.Parse(Request.Form["specialtyUID"].Trim());
                string specialtyName = Request.Form["specialtyName"].Trim().Replace("'", "");

                int result = MemberController.AddNewSpecialty(CurrentMember.ID, specialtyId );
                if (result > 0)
                {
                    MemberController.RefreshMemberSessionData(callSessionId);
                    MemberController.LogMemberCallActivity(callSessionId, "Successfully Added the Specialty " + specialtyName + " to the List");
                }
                else
                {
                    MemberController.LogMemberCallActivity(callSessionId, "Failed to Add Specialty");
                }
            }
        }

        protected void BuildIntro()
        {
            StringBuilder prompt = new StringBuilder();
            StringBuilder options = new StringBuilder();
            StringBuilder dtmf = new StringBuilder();

            List<Specialty> specList = MemberController.GetSpecialtyActiveIVR( CurrentMember.ID );
            NumOfSpecialties = specList.Count;

            if (specList.Count == 0)
            {
                Prompt = "There are currently no Specialty that is posted on the Interactive Voice System";
                return;
            }

            foreach (Specialty sp in specList)
            {
                string specialtyName = sp.IVRSpecialtyName != String.Empty ? sp.IVRSpecialtyName : sp.SpecialtyName;
                specialtyName = specialtyName.Replace("/", " ");
                specialtyName = specialtyName.Replace("-", " ");
                specialtyName = specialtyName.Replace("&", " and ");

                int keyPress = sp.SpecialtyIVRCode;                

                prompt.Append("<break time=\"750\"/><say-as interpret-as=\"number\" format=\"digits\">" + keyPress + "</say-as><break time=\"500\"/>" + specialtyName);
                options.Append(@"<option dtmf=""" + keyPress + @""" value=""'" + sp.SpecialtyID.ToString() + "," + specialtyName.Replace("&", " and ") + @"'""" + @">" + specialtyName.Replace("&", " and ") + "</option>");
                dtmf.Append("<if cond=\"whichSpecialty == '" + keyPress + "'\">" + "<assign name=\"whichSpecialty\" expr=\"'" + sp.SpecialtyID + "," + specialtyName + "'\" /></if>");
            }

            DateTime start = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 9, 0, 0);
            DateTime end = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 20, 0, 0);

            if (DateTime.Compare(start, DateTime.Now) < 0 && DateTime.Compare(end, DateTime.Now) > 0)
                OperationalHours = true;
            else
                OperationalHours = false;

            
            DtmfList = dtmf.ToString();
            Prompt = prompt.ToString();
            OptionList = options.ToString();
        }
    }

Here is what i need it to do.

1) I need it to list the specialties a user has. The list is dynamically built and it has the form of "101,Specialty1 104,Specialty2, 105,Specialty3, etc. Note that for this example user already has specialty 102 and 103. Along with the specialty the caller is prompted that he/she can repeat the list by press 1 or saying again, talk to an operator by pressing 2 or saying operator, or go back to the specialty menu by pressing 9 or saying specialty.

Example

"You may advertise any specialty by speaking its name or pressing the three digit code you will hear before each name. Press 9 at any time to return to the Specialties menu"

"101,Welder" "103,Shop" "105,Testing and Balancing"

"To Repeat the list say AGAIN or press 1. If you have a specialty that did not appear on the list say OPERATOR or press 2 for immediate assistance. Say Main Menu or press star to exit specialties"

If caller say 1 or again it will repeat from the top, If caller say 2 or operator it will connect to operator, if caller press * will go back to specialty menu.

if caller does not press 101, 103, or 105 or does not utter Welder, Shop or Testing and Balancing it will prompt that it could not find specialty and repeat from the top

if they press or say one of those thing it will go to the next form.

Problem. I think the problem is that my <option> is not getting recognized or the use of <grammer> syntax is wrong.

While i wait for your response. I will try and reorder my statements.

Thanks

Allan

support
Posts: 3632
Joined: Mon Jun 02, 2003 3:47 pm
Location: Boston, MA
Contact:

IVR Platform recognizes SRGS+XML grammars or JSGF grammars

Post by support »

Hi,

Looking at your IVR code, it appears that you are using GSL grammars. This is shown in these lines:

Code: Select all

            <grammar type="text/gsl">
            <![CDATA[[
            [again]       {  <whichSpecialty  "again"> }
            [operator]       {  <whichSpecialty  "operator"> }
            [specialty]       {  <whichSpecialty  "specialty"> }
            ]]]>
            </grammar> 
However, the Plum Voice Platform only recognizes SRGS+XML grammars or JSGF grammars. You should rewrite your IVR code to use either SRGS+XML or JSGF grammars.

Regards,
Plum Support
Last edited by support on Fri Feb 19, 2010 1:54 pm, edited 3 times in total.

acadenilla
Posts: 55
Joined: Wed Oct 31, 2007 11:02 am

Post by acadenilla »

Thanks I had changed the grammar and reorder some of the statements to get it to work

acadenilla
Posts: 55
Joined: Wed Oct 31, 2007 11:02 am

Post by acadenilla »

Is there a way to initiate a call into the plum network from a web page.

Lets say an operator uses a web application. The operator clicks on an image to initiate a call. Then the application would then call the person if the person picks up the he/she is connected to operator and this call would then be recorded

Would this be possible through plum

Thanks

Allan

acadenilla
Posts: 55
Joined: Wed Oct 31, 2007 11:02 am

Post by acadenilla »

if the last post was not clear. I need something like this

Call Start Tokens, also known as Outbound Dialing Tokens, allow you to initiate phone calls with an HTTP fetch. For example, you could use a Call Start Token to place a phone call by clicking a button on a web page.

Thanks

Allan

support
Posts: 3632
Joined: Mon Jun 02, 2003 3:47 pm
Location: Boston, MA
Contact:

Contact IVR account manager to activate Outbound

Post by support »

Hi,

You can use the Plum IVR Outbound system to perform this task.

For more information, you can go here:
http://www.plumvoice.com/docs/dev/plumd ... nddevguide

If IVR Outbound is not enabled for your account, you should contact your IVR account manager to get this activated.

Regards,
Plum Support
Last edited by support on Fri Feb 26, 2010 11:02 am, edited 5 times in total.

acadenilla
Posts: 55
Joined: Wed Oct 31, 2007 11:02 am

Post by acadenilla »

Thanks

I was looking at this particular page.

would the login and PIN be my username and password?

would this the correct syntax for the http call

Code: Select all

http://outbound.plumgroup.com/webservice/queuecall.php?login=username;pin=password;start_url=http://something/callbridge.aspx
Allan

support
Posts: 3632
Joined: Mon Jun 02, 2003 3:47 pm
Location: Boston, MA
Contact:

Use outbound with IVR account

Post by support »

Hi,

If you go to "Outbound Tools" and IVR Outbound is enabled for your IVR account, you should see your login and PIN number.

Finally, you should use POST variables, not GET variables in your HTTP call.

Hope this helps.

Regards,
Plum Support
Last edited by support on Fri Feb 26, 2010 11:03 am, edited 2 times in total.

acadenilla
Posts: 55
Joined: Wed Oct 31, 2007 11:02 am

Post by acadenilla »

I will be doing a post

code is going to be something like this

Code: Select all

        // Make the outbound call
        Globals.IVR.HttpCallUrl  = "http://outbound.plumgroup.com/webservice/queuecall.php?"
        string callParameters = "login=username&pin=password&start_url=http://something/callbridge.aspx"
        string httpCallUrl = Globals.IVR.HttpCallUrl + callParameters;

        // Send web request to IVR
        HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(httpCallUrl);
        objRequest.Method = "POST";
        objRequest.ContentType = "application/x-www-form-urlencoded";
        objRequest.KeepAlive = false;
do you see anything here that would cause problems

Allan

support
Posts: 3632
Joined: Mon Jun 02, 2003 3:47 pm
Location: Boston, MA
Contact:

IVR developers do not have an ASP expert

Post by support »

Hi,

We can't be too sure if that IVR code is going to work or not, since we mostly answer VXML-related questions and unfortunately, we do not have anyone on staff who is an ASP expert.

However, just to mention it again, the pin is not equal to the password for your IVR hosting account. The pin should be an 8 digit number located on your "Outbound Tools" page.

Regards,
Plum Support
Last edited by support on Fri Feb 26, 2010 11:04 am, edited 2 times in total.

acadenilla
Posts: 55
Joined: Wed Oct 31, 2007 11:02 am

Post by acadenilla »

i am getting an unknown error

how would someone write the url to post to queuecall?

Code: Select all

http://outbound.plumgroup.com/webservice/queuecall.php?login=mylogin&pin=mypin&phone_number=numbertocall&start_url=url
??

Allan

support
Posts: 3632
Joined: Mon Jun 02, 2003 3:47 pm
Location: Boston, MA
Contact:

IVR clarification

Post by support »

Hi,

With the IVR application, you cannot write a URL to POST these variables. You need an intermediary page that performs the POST either using your web browser or by using ASP.

Regards,
Plum Support
Last edited by support on Mon Dec 28, 2009 4:00 pm, edited 2 times in total.

Post Reply