Home    | Software    | Articoli    | Tips'n Tricks    | Contattaci    | Supportaci  
Home arrow Articoli arrow Integrare SugarCRM e Asterisk in Java ( II )

Integrare SugarCRM e Asterisk in Java ( II )

Opening a customer SugarCRM page in the browser on incoming calls

Introduction

Here comes the really interesting part, as this is what most readers have been asking for lately. The feature lots of people seem to be interested in is the possibility of , on an inbound asterisk call,  opening/redirecting the browser to the specific account/contact SugarCRM page. Before we proceed you should first have a look at two of our previous articles:

In particular, we'll take the code developed in the first one and add some features, while the second one is useful to see how we're going to cope with SugarCRM authentication.
As usual acknowledgments are due to the authors of  AsteriskJava for the great job they are doing with their library.

Aprire una specifica pagina di SugarCRM nel browser all'arrivo di una chiamata da Asterisk


Introduzione

Qui viene la parte interessante, a richiesta di molti lettori dei precedenti articoli. Quello a cui molti sono interessati è la possibilità di aprire/redirigere il browser verso una specifica pagina di Account/Contact di SugarCRM all'arrivo di una chiamata da Asterisk. Prima di procedere dovreste dare una lettura a due dei precedenti articoli: 


In particolare, prenderemo il codice sviluppato nel primo articolo e aggiungeremo alcune funzionalità, mentre il secondo è utile per capire come andremo ad interagire con i meccanismi di autenticazione di SugarCRM.
Come al solito sono dovuti tutti i riconoscimenti del caso agli autori di  AsteriskJava per l'ottimo lavoro fatto con la loro libreria.

 

Il codice

Nel primo articolo abbiamo scritto due classi java: "PhoneNumberResolver", che è la nostra classe principale e che riceve eventi da Asterisk, e "AccountFinder" che si occupa di interrogare SugarCRM per cercare l'Account proprietario del numero di telefono chiamante. Alla fine dell'articolo precedente eravamo in grado di ottenere il caller id da un evento asterisk nel metodo "onManagerEvent" della nostra classe "PhoneNumberResolver", passare il caller id al metodo "searchAccountByNumber" della classe "AccountFinder", ottenendo un hashtable con i dati eventualmente estratti da SugarCRM e mostrandoli.

Ciò che andremo a fare ora è creare un nuovo metodo "browserToSugarCRM" nella classe "AccountFinder". Di nuovo passeremo il caller id e il metodo controllerà l'esistenza di un Account corrispondente in SugarCRM, e se l'esito sarà positivo aprirà il browser alla pagina specifica di SugarCRM. Ecco il nuovo metodo:

 

   1:    public void browserToSugarCRM(String phoneNumber){
2: try{
3: Set_entry_result loginRes=port.login(userAuth, "myAppName");
4: String sessionID = loginRes.getId();
5: port.seamless_login(sessionID);
6: Get_entry_list_result entryList=port.get_entry_list(sessionID,"Accounts","accounts.phone_office='" +
7: phoneNumber + "'", "",0,new String[]{"id","name","phone_fax","website"},
8: 1, 0);
9: if(entryList.getEntry_list().length>0){
10: Entry_value entry = (entryList.getEntry_list())[0];
11: Name_value[] nvl=entry.getName_value_list();
12: String value = nvl[0].getValue();
13: String[] commandLine= {"/usr/bin/firefox","http://
your_sugar_server_url/index.php?action=DetailView
          &module=Accounts&record=
"+ value+ "&MSID="+ sessionID};
14: Process process = Runtime.getRuntime().exec(commandLine);
15: }
16: } catch(Exception ex){
17: ex.printStackTrace();
18: }
19:
20: }
21:

Il metodo utilizzato è spiegato nel secondo articolo citato in cima. Ci autentichiamo via SOAP a SugarCRM e otteniamo un session id (righe 3 e 4), poi usiamo il session id per effettuare un "seamless_login" (riga 5) che ci permetterà di risultare autenticati anche per l'interfaccia web. 

Alla riga 6 interroghiamo SugarCRM per vedere se l'Account con il dato numero di telefono esista e , se così (riga 9), prendiamo l'id dell'Account trovato (riga 12). Una piccola spiegazione per la riga 12; l'id dell'account ha indice 0 nell'array "nvl" perchè alla riga 7, interrogando SugarCRM, abbiamo messo "id" come primo elemento(e quindi con indice 0) nell'array di String dei campi richiesti. Ora abbiamo tutto il necessario per comporre la URL da passare al browser per entrare in SugarCRM bypassando la form di autenticazione ed essere rediretti alla pagina di dettaglio dell'Account trovato. Alla riga 13 creiamo un array di String con 2 elementi, contenente il percorso dell'eseguibile del nostro browser e la URL, con una variabile "value" che rappresenta l'id dell'account su database e "sessionID" passato come parametro "MSID". Questo è quello che ci permette di bypassare la pagina di login di SugarCRM.

Attenzione:  il  "metodo MSID" di login remoto non è stato portato alla versione "5.0" di SugarCRM, mentre pare sia di nuovo presente nella versione "5.1" . Per i test sto utilizzando una versione "4.2.1b", e il meccanismo pare funzionare correttamante.

Alla riga 13 lanciamo il browser. Questa stringa è strettamente correlata con l'OS e il browser utilizzati. Nel mio caso, se Firefox è già aperto, viene aperta una nuova  Tab  che mostrerà la pagina di SugarCRM del record trovato. Per completare le modifiche, dobbiamo ancora cambiare il metodo "onManageEvent" della classe "PhoneNumberResolver" . Ecco il codice:



  1 :    public void onManagerEvent(ManagerEvent event) {
2 : String event_name = event.getClass().getSimpleName();
3 : if(event_name.equals("DialEvent")){
4 : DialEvent e=(DialEvent)event;
5 : af.browserToSugarCRM(e.getCallerId());
6 : }
7 : }

 
Abbiamo solo cambiato la chiamata ad AccountFinder, questa volta chiamando il nuovo metodo "browserToSugarCRM".Fatto questo non abbiamo più bisogno del metodo "showData", quindi ecco la versione finale di "PhoneNumberResolver":


   1:import java.io.IOException;
2:import java.util.Date;
3:import java.util.Enumeration;
4:import java.util.Hashtable;
5:import javax.swing.JFrame;
6:import javax.swing.JLabel;
7:import javax.swing.JOptionPane;
8:import org.asteriskjava.manager.*;
9:import org.asteriskjava.manager.event.*;
10:
11:public class PhoneNumberResolver implements ManagerEventListener{
12: private ManagerConnection managerConnection;
13: private AccountFinder af;
14:
15: public PhoneNumberResolver(){
16: ManagerConnectionFactory factory = new ManagerConnectionFactory(
17: "asterisk_server_url", "user", "password");
18: this.managerConnection = factory.createManagerConnection();
19: af=new AccountFinder();
20: }
21: public void run() throws IOException, AuthenticationFailedException,TimeoutException,
InterruptedException, IllegalStateException
22: {
23: managerConnection.addEventListener(this);
24: managerConnection.login();
25: while(true)
26: Thread.sleep(60000);
27: }
28: public void onManagerEvent(ManagerEvent event) {
29: String event_name = event.getClass().getSimpleName();
30: if(event_name.equals("DialEvent")){
31: DialEvent e=(DialEvent)event;
32:
af.browserToSugarCRM(e.getCallerId());
33:
34: }
35: }
36: public static void main(String[] args) throws Exception
37: {
38: PhoneNumberResolver phoneNumberResolver = new PhoneNumberResolver();
49: phoneNumberResolver.run();
40: }
41:}


Conclusioni

Questo articolo dovrebbe rispondere alle molte email di lettori interessati al meccanismo esposto. Scriverò presto altri articoli sull'integrazione Asterisk/SugarCRM  e SugarCRM/CMS.


Hasta la proxima.

 
< Prec.   Pros. >

  Articles RSS feed

Articoli pił recenti
Software pił recenti
   
designed by allmambo.com