Ho avuto modo di accumulare diverse richieste da parte di persone che hanno incontrato delle difficoltà nello sviluppo di Client (Java, C#, PHP e Objective C) per l’interfaccia SOAP e REST messa a disposizione da SugarCRM.
Spesso la difficoltà nello sviluppo del client può dipendere da vari fattori, un breve elenco proveniente dalla mia esperienza sul campo:
- Scelta del framework più adatto;
- Limiti di alcuni framework a gestire determinate interfacce, magari perchè non supportano determinati standard WS-*;
- Poca documentazione delle interfacce spesso priva di esempi
Ho appena completato e pubblicato il mio primo articolo della serie, che dovrebbe guidarvi alla costruzione di un client Java per SugarCRM. Il documento è disponibile su SlideShare: http://www.slideshare.net/amusarra/costruire-un-client-java-per-sugarcrm
Ho ritenuto opportuno creare un repository pubblico contenente quanto prodotto durante la stesura di quest’articolo. Il repository è raggiungibile all’indirizzo: https://github.com/amusarra/SugarCRMJavaSOAPClient
Per ogni vostra questione in merito al tema trattato, sono ben accetti i vostri commenti.
Bye,
Antonio Musarra.
Salve Antonio,
complimenti per l’articolo. Ho una domanda da fare. C’è un modo per passare l’username e la pass in modo dinamico quando si instanzia l’oggetto User_Auth? I webservice mettono a disposizione qualche metodo che ti restituisce l’username e la pass dell’utente per poi poter passarle al costruttore?
Grazie mille per il contributo.
Ciao e grazie per l’apprezzamento.
Certo che puoi passare username e password in modo dinamico, basta utilizzare i metodi setPassoword e setUser_name dell’oggetto User_auth. Io per ragioni di semplicità ho preferito cablare nel codice la coppia username/password.
Non dovrebbero servirti delle operation per il get dello username e password dell’utente.
Bye,
Antonio.
Ciao grazie per la risposta tempestiva :P, ma cosa gli passo a quei metodi? come faccio a farmi restituire ad esempio che l’utente admin è loggato nella sessione corrente? se chiamo User_auth.getUserName() mi viene restituito il valore null…Devo fare una query sul modulo utenti? e farmi restituire il field name? Perchè a me interessa che per ogni utenza ( loggata ) dovrei prendere la lista di aziende e contatti.
Un’altra domanda nelle classi java dove si trova il metodo get_user_id che si trova nella pagina soap.php di sugar?
Ciao Silv,
ti rispondo con questo link https://github.com/amusarra/SugarCRMJavaSOAPClient/blob/master/JavaApplication/SugarCRMSOAPClient/src/it/lab/shirus/sugarcrm/client/soap/SugarCRMSoapClientAdvanced.java
Ho scritto al volo una classe Java che dovrebbe rispondere alle tue domande, che dici ?
Bye,
Antonio.
Ciao Silv,
la classe SugarCRMSoapClientAdvanced accetta tre parametri: {SugarCRM URL} {user name} {password}. Ti allego un esempio di output del client (eseguito con i paramentri:http://localhost:8888/CRM-6.2.2 admin admin)
URL endpoint created successfully!
URL endpoint: http://localhost:8888/CRM-6.2.2/service/v2/soap.php?wsdl
Service created successfully
Service Name:{http://www.sugarcrm.com/sugarcrm}sugarsoap
Service WSDL:http://localhost:8888/CRM-6.2.2/service/v2/soap.php?wsdl
Stub created successfully!
SugarCRM Server Info...
Version 6.2.2
Flavor CE
Login Successfully for admin
Your session Id: fbfbaba9e0bd78f2e258ab0075a1d2dc
Your UserId is: 1
Get entries count was successful! Response: 2
# Record n° 0
Attribute Name: 'modified_by_name' Attribute Value: 'Administrator'
Attribute Name: 'created_by_name' Attribute Value: 'Administrator'
Attribute Name: 'id' Attribute Value: 'af8cdeb1-2e5a-e3c9-c4c7-4e77a5616426'
Attribute Name: 'date_entered' Attribute Value: '2011-09-19 20:27:00'
Attribute Name: 'date_modified' Attribute Value: '2011-09-19 21:13:41'
Attribute Name: 'modified_user_id' Attribute Value: '1'
Attribute Name: 'modified_user_name' Attribute Value: 'Administrator'
Attribute Name: 'created_by' Attribute Value: '1'
Attribute Name: 'description' Attribute Value: 'Contatto creato dal Client SOAP Java'
Attribute Name: 'deleted' Attribute Value: '0'
Attribute Name: 'first_name' Attribute Value: 'Deborah'
Attribute Name: 'last_name' Attribute Value: 'Musarra'
Attribute Name: 'title' Attribute Value: 'IT Senior Consultant'
Attribute Name: 'do_not_call' Attribute Value: '0'
Attribute Name: 'email1' Attribute Value: 'antonio.musarra@gmail.com'
Attribute Name: 'opportunity_role_fields' Attribute Value: ' '
Attribute Name: 'c_accept_status_fields' Attribute Value: ' '
Attribute Name: 'm_accept_status_fields' Attribute Value: ' '
# Record n° 1
Attribute Name: 'modified_by_name' Attribute Value: 'Administrator'
Attribute Name: 'created_by_name' Attribute Value: 'Administrator'
Attribute Name: 'id' Attribute Value: 'e1c4ae8a-8d14-3a5f-a117-4e77a8c6a25e'
Attribute Name: 'date_entered' Attribute Value: '2011-09-19 20:39:10'
Attribute Name: 'date_modified' Attribute Value: '2011-09-19 20:39:10'
Attribute Name: 'modified_user_id' Attribute Value: '1'
Attribute Name: 'modified_user_name' Attribute Value: 'Administrator'
Attribute Name: 'created_by' Attribute Value: '1'
Attribute Name: 'description' Attribute Value: 'Contatto creato dal Client SOAP Java'
Attribute Name: 'deleted' Attribute Value: '0'
Attribute Name: 'first_name' Attribute Value: 'Antonio'
Attribute Name: 'last_name' Attribute Value: 'Musarra'
Attribute Name: 'title' Attribute Value: 'IT Senior Consultant'
Attribute Name: 'do_not_call' Attribute Value: '0'
Attribute Name: 'email1' Attribute Value: 'antonio.musarra@gmail.com'
Attribute Name: 'opportunity_role_fields' Attribute Value: ' '
Attribute Name: 'c_accept_status_fields' Attribute Value: ' '
Attribute Name: 'm_accept_status_fields' Attribute Value: ' '
Logout Successfully for admin
Ciao Antonio,
grazie mille per l’aiuto. Ho scritto una classe di test e funziona! :D, però i valori li scrivo sempre a mano volta per volta. Sugar mette a disposizione un metodo che restituisce username e pass dell’utente loggato così da passarli entrambi alla tua classe? Perchè in questo modo chiamo la classe e gli passo nel costruttore tre parametri ma li definisco sempre io, invece sarebbe bello che dalla sessione corrente mi venisse restituito l’username dell’utente loggato e anche la pass se è possibile per poi passarle direttamente alla tua classe come parametri, non so se mi sn spiegato.
La tua classe mi è stata utilissima perchè devo far interagire due applicazioni una scritta in java ( Alfresco ) e l’altra appunto sugar ( PHP ). TI faccio queste domande perchè le utenze delle due applicazioni sono le stesse. Ho pensato ad un flusso del genere: Mi faccio restituire l’user e pass da Alfresco e poi li passo alla tua classe per loggarmi su sugar e farmi restituire le Aziende o i contatti dell’utenza di Alfresco che poi sarebbe la stessa loggata in sugar. Che ne pensi? 🙂
Ciao Silv,
allora, in teoria potresti recuperare user e password interrogando il modulo users, ad ogni modo non è la via corretta, potresti anche non avere la password, ad esempio nei casi di SSO. Visto che la tua esigenza è quella di recuperare le Aziende o Contatti dell’utente che si logga su Alfresco (premesso che lo stesso utente è anche presente su SugarCRM), potresti procedere nel seguente modo:
A) Definire un tipo di utenza su SugarCRM che sia in grado di accedere ai tutti i record dei moduli Accounts e Contacts;
B) Utilizzare l’utenza definita in precedenza per eseguire l’accesso a SugarCRM via SOAP API
C) Data la username dell’utente loggato su Alfresco recuperare via SOAP API la userID (ID) dell’utente (query sul modulo Users)
D) Utilizzare ID dell’utente per recuperare Contatti o Aziende via SOAP API (vedi https://github.com/amusarra/SugarCRMJavaSOAPClient/blob/c829689b89118ac7625db2937e9f43725c74e14d/JavaApplication/SugarCRMSOAPClient/src/it/lab/shirus/sugarcrm/client/soap/SugarCRMSoapClientAdvanced.java#L171)
Penso di non aver dimenticato nulla e il giro dovrebbe tornare. A te torna ?
Bye,
Antonio.
Ciao Antonio,
infatti in realtà dovrò implementare anche un sistema di SSO tra le due applicazioni. Però per il resto mi sembra che tornano i passi descritti da te, anche se poi si possono evolvere. Tu per l’SSO cosa mi consigli per iniziare a pensare a qualcosa? Ci sono degli strumenti flessibili e di apprendimento facile che possono soddisfare la mia esigenza?
Ti ringrazio ancora per la tua enorme disponibilità ;).
Ciao Silv,
esistono diverse soluzioni open CAS/SSO come per esempio JA-SIG Central Authentication Service (CAS), JOSSO, OpenSSO, etc. Alfresco non dovrebbe avere problemi d’integrazione con tutti questi strumenti, su SugarCRM ho qualche dubbio. SugarCRM riesce a fare authenticazione su server LDAP/AD oppure via SAML.
Bye,
Antonio.
Ciao Antonio,
sempre approposito di permessi e utenze, ho letto che con la professional edition di sugar si ha la possibilità di configurare i permessi per l’utente a livello di campi, è vero?
se si volesse fare una cosa del genere con la CE si può impedire ad esempio ad un certo ruolo l’esecuzione di una logic hooks? Oppure rendere i campi di una vista di dettaglio di un certo modulo solo leggibili? ( classici campi in grigio ) .
Grazie ancora per la tua disonibilità.
Ciao Silverio,
la versione PRO e ENT hanno una gestione delle ACL molto più spinta dalla CE.
L’accesso alle logic hooks potrebbe essere controllato via codice tramite l’oggetto ACL/ACLAction, così come anche la visibilità dei dati sulle viste.
Per la CE esiste una modulo chiamato SecurityGroup che forse potrebbe rispondere a qualche tue requisito.
Bye,
Antonio.