<div dir="ltr">I really appreciate your help Ben . <div><br></div><div>To give some background of current behaviour , 1stly we are not doing parallel forking , we are doing serial forking . </div><div>We have adjusted opensips code somehow and sorted the list of contacts according to their registration time (<b>creation time column is added in the location table for this</b> ).</div><div>In a branch if there are 5 contacts then we give a call to the longest ideal  contact first if that fails then opensips again try the next longest ideal contact and so on .  If All fails it gives back 500 Error .</div><div><br></div><div>My requirements have changed at this point . </div><div><div><b>Agent1 call-info : sales=1,apple=20,en=5</b></div><div><b>Agent2 call-info : sales=15,apple=7</b><b><br></b></div><div><b>Agent3 call-info : sales=4,apple=4</b></div><div><b>Agent4 Call-info : hr=3,gallileo=5 </b></div><div><br></div><div><b>Invite $hdr(Call-Info) : sales,en  </b></div></div><div><b><br></b></div><div><b>For this INVITE , Agent1 , Agent2 and Agent3 are matched candidates </b><b> and the elements are present in their attribute . Now the question is who should I give the call first . </b></div><div><b>Here I have to calculate the average level of both the agent and which one will be the greatest 1st call sent out to that agent . </b></div><div><b><br></b></div><div><b>When I am saying theoretically it seems achievable through config  adjustment . But the question is now how ? </b></div><div><b><br></b></div><div><b>Agent1 average skill level : (1+20)/2 =10.5</b></div><div><b>Agent2 average skill level :  (15+7)/2=11  (Now Agent2 is in higher skill . )</b></div><div><b>Agent3 average skill level : (4+4)/2=4 </b></div><div><b><br></b></div><div><b>Now the highest average skill level is Agent2 , Call will be sent out to Agent2 if fails then will go to Agent1 if fails then will go to Agent3 . </b></div><div><b><br></b></div><div><b>Again this is a challenge for me . Is there any other module or table on which I can save the branch with its skill level and then while sending out call I will check the skill level and then send out .  How will I achieve this ?</b></div><div><br clear="all"><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><b><i>Thanks & Regards</i></b><div><i>Sasmita Panda</i></div><div><i>Senior Network Testing and Software Engineer</i></div><div><i>3CLogic , ph:07827611765</i></div></div></div></div></div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Nov 3, 2023 at 2:28 AM Ben Newlin <<a href="mailto:Ben.Newlin@genesys.com">Ben.Newlin@genesys.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="msg5259240463770218664">





<div lang="EN-US" style="overflow-wrap: break-word;">
<div class="m_6297826431190379062WordSection1">
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif">Sasmita,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif">I can’t provide a working example as I don’t have a use case like this. However, this piece of script you’ve provided does not represent a correct flow. I think you may need to review how the
 different types of routes, and particularly branch routes, work. [1]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif">I don’t have any experience with Registrar module, so take all of the following with a grain of salt. Someone with more experience with registrar can maybe keep me honest here.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif">You should only need to call next_branches() one time, as it already loads all contacts returned by lookup() into parallel branches (assuming you are using the “b” flag for lookup()). This means
 they are all sent out at once, not serially. So you don’t need to send the next branch in failure_route because they’ve all already been sent.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif">The branch route is executed as the last route before the message is being sent out. You certainly do not need to call next_branches() there either, in fact its behavior in a branch route is
 not defined in the docs. Also, I don’t know what your route “1” does, but you likely don’t need it from branch route either. As long as you don’t drop the branch, it will automatically be sent out. Lastly, you have the actual drop() command commented out,
 so this code won’t work as I described.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif">Lastly, failure_route is armed for the whole request. In the case of parallel branching, it will only be called once for the request, not once for each branch, and only if all branches receive
 negative replies.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif">One thing I’m not clear about is what happens if you end up dropping all the branches. I don’t know if failure_route would be called then, but it would be pretty easy to verify that. I think
 it would.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif">Again, I can’t speak to your specific use case, but a representative version of the solution I recommended is below. *<b>I have not tested or verified this code.</b>*<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal">route {</p>
<p class="MsoNormal">  # all of your normal routing logic</p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">  if (lookup(“<domain>”, “b”)) {</p>
<p class="MsoNormal">    if (next_branches()) {</p>
<p class="MsoNormal">      t_on_branch(“check_attrs”);</p>
<p class="MsoNormal">     t_on_failure(“no_branches”);</p>
<p class="MsoNormal">    }</p>
<p class="MsoNormal">    else {</p>
<p class="MsoNormal">      # handle case of no contacts</p>
<p class="MsoNormal">      t_reply(404, “Not Found”);</p>
<p class="MsoNormal">    }</p>
<p class="MsoNormal">  }</p>
<p class="MsoNormal">  else {</p>
<p class="MsoNormal">    # handle case of failed lookup</p>
<p class="MsoNormal">    t_reply(404, “Not Found”);</p>
<p class="MsoNormal">  }</p>
<p class="MsoNormal">}</p>
<p class="MsoNormal"><br>
branch_route[check_attrs] {<br>
  $var(count) = $(hdr(Call-Info){csv.count});<br>
<br>
  while($(var(count) >= 0)) {<br>
    if ($(avp(attr){s.index, $(hdr(Call-Info){csv.value,$var(i)})}) == NULL) {</p>
<p class="MsoNormal">      # as soon as one requirement doesn’t match, you know you don’t want to route</p>
<p class="MsoNormal">      drop();</p>
<p class="MsoNormal">    }</p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">    xlog("count: $var(count)\n");<br>
    $var(count) = $var(count) - 1;<br>
  }</p>
<p class="MsoNormal">}</p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">failure_route[no_branches] {<br>
   # handle case where all branches failed</p>
<p class="MsoNormal">  t_reply(404, “Not Found”);<br>
}<span style="font-family:Aptos,sans-serif"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif">[1] <a href="https://www.opensips.org/Documentation/Script-Routes-3-2" target="_blank">
https://www.opensips.org/Documentation/Script-Routes-3-2</a><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif"><u></u> <u></u></span></p>
<div>
<p class="MsoNormal"><span style="color:black">Ben Newlin</span><span style="font-family:Aptos,sans-serif"><u></u><u></u></span></p>
</div>
<p class="MsoNormal"><span style="font-family:Aptos,sans-serif"><u></u> <u></u></span></p>
<div id="m_6297826431190379062mail-editor-reference-message-container">
<div>
<div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(181,196,223);padding:3pt 0in 0in">
<p class="MsoNormal" style="margin-bottom:12pt"><b><span style="font-size:12pt;font-family:Aptos,sans-serif;color:black">From:
</span></b><span style="font-size:12pt;font-family:Aptos,sans-serif;color:black">Users <<a href="mailto:users-bounces@lists.opensips.org" target="_blank">users-bounces@lists.opensips.org</a>> on behalf of Sasmita Panda <<a href="mailto:spanda@3clogic.com" target="_blank">spanda@3clogic.com</a>><br>
<b>Date: </b>Thursday, November 2, 2023 at 9:36 AM<br>
<b>To: </b>OpenSIPS users mailling list <<a href="mailto:users@lists.opensips.org" target="_blank">users@lists.opensips.org</a>><br>
<b>Subject: </b>Re: [OpenSIPS-Users] I need some help in attr matching while forming the Branch .</span><span style="font-size:12pt;font-family:Aptos,sans-serif"><u></u><u></u></span></p>
</div>
<div>
<div>
<div class="MsoNormal" align="center" style="text-align:center">
<hr size="0" width="100%" align="center">
</div>
</div>
<p class="MsoNormal">Hi Ben , </p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><br>
<br>
failure_route[1] {<br>
   if ( t_check_status("404|477|480|481|408|486|50[234]")){ <br>
if (next_branches())<br>
{<br>
    t_on_branch("attr");<br>
         }<br>
        <br>
    } <br>
}<br>
<br>
<br>
branch_route[attr]<br>
{<br>
$var(count) = $(hdr(Call-Info){csv.count});<br>
<br>
$var(i) = 0;<br>
$var(match-count) = 0;<br>
<br>
while($var(i) < $(var(count))){<br>
<br>
         if ($(avp(attr){s.index, $(hdr(Call-Info){csv.value,$var(i)})}) != NULL){<br>
          xlog("counter: $var(i)th  index matched in attribute \n");<br>
           $var(match-count)= $var(match-count) + 1;<br>
          }<br>
        xlog("counter: $var(i)\n");<br>
        $var(i) = $var(i) + 1;<br>
}<br>
<br>
        if ($var(i) == $var(match-count)){<br>
## Here I want to give call to that contact .. if that fails then again it should come to next branch and again compare
<br>
            t_on_failure("1");<br>
            route(1);<br>
      }<br>
      else{<br>
# Here if the condition does not match . then i want to do the comparison again <br>
      if (next_branches()){<br>
             t_on_branch("attr");<br>
           }<br>
  #      drop();<br>
       }<br>
}</p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">As for my expectation, it's not working . How does it work ? Where should I use T_branch_Idx ? Can I get some examples of this ?</p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><br clear="all">
</p>
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal"><b><i>Thanks & Regards</i></b></p>
<div>
<p class="MsoNormal"><i>Sasmita Panda</i></p>
</div>
<div>
<p class="MsoNormal"><i>Senior Network Testing and Software Engineer</i></p>
</div>
<div>
<p class="MsoNormal"><i>3CLogic , ph:07827611765</i></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin:5pt 0in 5pt 4.8pt">
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</div>

_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@lists.opensips.org" target="_blank">Users@lists.opensips.org</a><br>
<a href="http://lists.opensips.org/cgi-bin/mailman/listinfo/users" rel="noreferrer" target="_blank">http://lists.opensips.org/cgi-bin/mailman/listinfo/users</a><br>
</div></blockquote></div>