/[drupal]/contributions/sandbox/stevemckenzie/salesforce/includes/salesforce_api.inc
ViewVC logotype

Contents of /contributions/sandbox/stevemckenzie/salesforce/includes/salesforce_api.inc

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.7 - (show annotations) (download) (as text)
Wed Oct 25 05:34:06 2006 UTC (3 years, 1 month ago) by stevemckenzie
Branch: MAIN
CVS Tags: HEAD
Changes since 1.6: +43 -8 lines
File MIME type: text/x-php
some more clean up, contract function has proper retrieve() method now
1 <?php
2 // $Id: salesforce_api.inc,v 1.6 2006/10/23 09:02:55 stevemckenzie Exp $
3
4 /**
5 * @file
6 * integration of Drupal and Salesforce.com.
7 */
8
9 /**
10 * salesforce include + connecting via SOAP
11 */
12 function salesforce($login_return = false) {
13 static $included;
14
15 $admin = user_access('administer salesforce');
16
17 $username = variable_get('salesforce_user', NULL);
18 $password = variable_get('salesforce_password', NULL);
19
20 if ($username && $password) {
21 if (!$included) {
22 require_once('salesforce.php');
23 $included = true;
24 }
25
26 // create client and login
27 $salesforce = new salesforce($_SERVER['DOCUMENT_ROOT'] . base_path() . drupal_get_path('module', 'salesforce') . '/includes/partner.wsdl');
28 $login = $salesforce->login($username, $password);
29
30 if (!$login) {
31 if ($admin) {
32 drupal_set_message(t('Failed to authenticate on SalesForce.com'), 'error');
33 //form_set_error('salesforce_name', t('is the username correct?'));
34 //form_set_error('salesforce_password', t('is the password correct?'));
35 //drupal_goto('admin/settings/salesforce');
36 }
37
38 return false;
39 }
40
41 //set batch size header
42 $batch_size = new soapval('batchSize', null, 2);
43 $salesforce->setHeader('QueryOptions', array($batch_size));
44
45 if ($login) {
46 if ($login_return) {
47 return $login;
48 } else {
49 return $salesforce;
50 }
51 }
52 } else {
53 if ($admin) {
54 drupal_set_message(t('The SalesForce module is currently not configured properly. A username / password to connect to SalesForce is required and not currently supplied. A site administrator should be contacted in regards to this error.'), 'error');
55 if (user_access('administer salesforce')) {
56 drupal_goto('admin/settings/salesforce');
57 }
58 }
59 }
60 }
61
62 /**
63 * handle contacts in salesforce
64 */
65 function salesforce_contact($op, $account, $params = array()) {
66 $salesforce = salesforce();
67 $admin = user_access('administer salesforce');
68
69 switch ($op) {
70 case 'insert': case 'update':
71 $contact = new sObject('Contact', null,
72 array(
73 'Company' => $account->company,
74 'FirstName' => $account->first_name,
75 'LastName' => $account->last_name,
76 'Phone' => $account->phone,
77 'Fax' => $account->fax,
78 'Email' => $account->mail,
79 ));
80
81 // add any additional params to the contact object
82 foreach ($params as $param => $param_value) {
83 $contact->$param = $param_value;
84 }
85
86 // query salesforce to check if the user already has a contact with the supplied email
87 $contact_lookup = $salesforce->query("SELECT id FROM contact WHERE email = '$account->mail'");
88
89 // if we get back multiple results, we only bother looking at the first one.
90 if (is_array($contact_lookup['records'])) {
91 foreach ($contact_lookup['records'] as $row) {
92 $contact_id = $row->id;
93 break;
94 }
95 } else {
96 $contact_id = $contact_lookup['records']->id;
97 }
98
99 // insert method
100 if ($op == 'insert' && count($contact_lookup['records']) == 0) {
101 $result = $salesforce->create($contact);
102
103 if ($result['success'] == 'true') {
104 _salesforce_insert('contact_id', $result['id'], $account);
105 if (user_access('administer salesforce')) {
106 drupal_set_message(t('a contact was created in salesforce for the user %user', array('%user' => "<strong>$account->first_name $account->last_name</strong>")));
107 return array('id' => $result['id'], 'status' => 'inserted');
108 }
109 } else {
110 $error = 'contact_insert';
111 }
112 }
113 // update method
114 else {
115 if (!$account->salesforce['contact_id']) {
116 $account->salesforce['contact_id'] = $contact_id;;
117 _salesforce_insert('contact_id', $account->salesforce['contact_id'], $account);
118 }
119 $contact->id = $account->salesforce['contact_id'];
120 // why am i unsetting this you may ask? i'm not sure but salesforce tells me too... wtf?
121 unset($contact->values['Company']);
122
123 $result = $salesforce->update($contact);
124
125 if ($result['success'] == 'true') {
126 if ($admin) {
127 drupal_set_message(t('updated contact in salesforce for the user %user', array('%user' => "<strong>$account->first_name $account->last_name</strong>")));
128 return array('status' => 'updated');
129 }
130 } else {
131 switch ($result['errors']['statusCode']) {
132 default:
133 $error = 'contact_update';
134 break;
135 }
136 }
137 }
138
139 // handle error control and log errors
140 if ($error) {
141 if ($admin) {
142 drupal_set_message(t('an error occured <strong>[%error]</strong> during a salesforce contact task for the user %user with the messasge - "%message"', array('%user' => theme('username', $account), '%message' => $result['errors']['message'], '%error' => $error)), 'error');
143 }
144 _salesforce_log_user($error, $result['errors']['message'], $account);
145 return array('error' => $error);
146 }
147 break;
148 }
149 }
150
151 /**
152 * handle leads in salesforce
153 */
154 function salesforce_lead($op, $account, $params = array()) {
155 // grab a salesforce api connection
156 $salesforce = salesforce();
157 $admin = user_access('administer salesforce');
158
159 switch ($op) {
160 case 'insert': case 'update': default:
161 // create the main salesforce object
162 $lead = new sObject('Lead', null,
163 array(
164 'Company' => $account->company,
165 'FirstName' => $account->first_name,
166 'LastName' => $account->last_name,
167 'Phone' => $account->phone,
168 'Fax' => $account->fax,
169 'Email' => $account->mail,
170 ));
171
172 // add any additional params to the lead object
173 foreach ($params as $param => $param_value) {
174 $lead->values[$param] = $param_value;
175 }
176
177 // query salesforce to check if the user already has an account with the supplied email
178 $lead_lookup = $salesforce->query("SELECT id FROM lead WHERE email = '$account->mail'");
179
180 // if we get back multiple results, we only bother looking at the first one.
181 if (is_array($lead_lookup['records'])) {
182 foreach ($lead_lookup['records'] as $row) {
183 $lead_id = $row->id;
184 break;
185 }
186 } else {
187 $lead_id = $lead_lookup['records']->id;
188 }
189
190 // insert method
191 if ($op == 'insert' && count($lead_lookup['records']) == 0) {
192 $result = $salesforce->create($lead);
193
194 if ($result['success'] == 'true') {
195 _salesforce_insert('lead_id', $result['id'], $account);
196 if (user_access('administer salesforce')) {
197 drupal_set_message(t('a lead was created in salesforce for the user %user', array('%user' => "<strong>$account->first_name $account->last_name</strong>")));
198 return array('id' => $result['id'], 'status' => 'inserted');
199 }
200 } else {
201 $error = 'lead_insert';
202 }
203 }
204 // update method
205 else {
206 if (!$account->salesforce['lead_id']) {
207 $account->salesforce['lead_id'] = $lead_id;
208 _salesforce_insert('lead_id', $account->salesforce['lead_id'], $account);
209 }
210 $lead->id = $account->salesforce['lead_id'];
211
212 $result = $salesforce->update($lead);
213
214 if ($result['success'] == 'true') {
215 if ($admin) {
216 drupal_set_message(t('updated lead in salesforce for the user %user', array('%user' => "<strong>$account->first_name $account->last_name</strong>")));
217 return array('status' => 'updated');
218 }
219 } else {
220 switch ($result['errors']['statusCode']) {
221 case 'CANNOT_UPDATE_CONVERTED_LEAD':
222 // do an update contact object but first find it..
223 return salesforce_contact('update', $account, $params);
224
225 case 'INVALID_ID_FIELD':
226 if ($admin) {
227 db_query("DELETE FROM {salesforce_users} WHERE lead_id = '%s'", $account->salesforce['lead_id']);
228 drupal_set_message(t('the lead for the user %user was removed from salesforce', array('%user' => "<strong>$account->first_name $account->last_name</strong>")));
229 return array('status' => 'lead_removed_from_salesforce');
230 }
231 break;
232
233 default:
234 $error = 'lead_update';
235 break;
236 }
237 }
238 }
239
240 // handle error control and log errors
241 if ($error) {
242 if ($admin) {
243 drupal_set_message(t('an error occured <strong>[%error]</strong> during a salesforce lead task for the user %user with the messasge - "%message"', array('%user' => theme('username', $account), '%message' => $result['errors']['message'], '%error' => $error)), 'error');
244 }
245 _salesforce_log_user($error, $result['errors']['message'], $account);
246 return array('error' => $error);
247 }
248 break;
249 }
250 }
251
252 /**
253 * handle events (history) in salesforce
254 */
255 function salesforce_event($op, $subject, $message, $account = NULL) {
256 $account = _salesforce_select_account($account);
257 $salesforce = salesforce();
258 if (!$salesforce) return array('error' => 'NO_SALESFORCE_CONNECTION');
259
260 $admin = user_access('administer salesforce');
261
262 // contacts before leads
263 if ($account->salesforce['contact_id']) {
264 $id = $account->salesforce['contact_id'];
265 } else if ($account->salesforce['lead_id']) {
266 $id = $account->salesforce['lead_id'];
267 } else {
268 return array('error' => 'NO_CONTACT_OR_LEAD_ID');
269 }
270
271 // currently only setting up insert
272 switch ($op) {
273 case 'insert':
274 $activityDate = new soapval('ActivityDateTime', 'dateTime', (string) $salesforce->getServerTimestamp());
275 $event = new sObject('Event', NULL, array(
276 'WhoId' => $id,
277 $activityDate,
278 'Subject' => t('%subject - %date', array('%subject' => $subject, '%date' => format_date(time(), 'large'))),
279 'Description' => $message,
280 'DurationInMinutes' => 1,
281 ));
282 break;
283 }
284
285 $result = $salesforce->create($event);
286
287 if ($result['success'] == 'true') {
288 if ($admin) {
289 drupal_set_message(t('an event was created in salesforce for the user %user', array('%user' => "<strong>$account->first_name $account->last_name</strong>")));
290 return array('id' => $result['id'], 'status' => 'inserted');
291 }
292 } else {
293 switch ($result['errors']['statusCode']) {
294 /*
295 case 'CANNOT_UPDATE_CONVERTED_LEAD':
296 $contact_lookup = $salesforce->query("select id from contact where email = '$account->mail'");
297 if (count($contact_lookup['records']) > 0) {
298 $account->salesforce['contact_id'] = $contact_lookup['records']->id;
299 } else {
300 $error = 'event_insert';
301 }
302 break;
303 */
304 default:
305 $error = 'event_insert';
306 break;
307 }
308 }
309
310 // handle error control and log errors
311 if ($error) {
312 if ($admin) {
313 drupal_set_message(t('an error occured <strong>[%error]</strong> during a salesforce event task for the user %user with the messasge - "%message"', array('%user' => theme('username', $account), '%message' => $result['errors']['message'], '%error' => $error)), 'error');
314 }
315 _salesforce_log_user($error, $result['errors']['message'], $account, 1, serialize($event));
316 return array('error' => $error);
317 }
318 }
319
320 /**
321 * select from the salesforce contact table
322 */
323 function salesforce_account_select($account = NULL, $params = array(), $cache = true) {
324 $salesforce = salesforce();
325 $account = _salesforce_select_account($account);
326
327 // make sure we're dealing with a contact
328 if (!$account->salesforce['contact_id']) return array('error' => 'NO_CONTACT_ID');
329
330 $defaults = array('accountId');
331 $params = array_merge($defaults, $params);
332 // query salesforce for the contact's account_id
333 $contact = $salesforce->query("SELECT ". implode(',', $params) ." FROM contact WHERE id = '". $account->salesforce['contact_id'] ."'");
334 $id = $contact['records']->values['AccountId'];
335 if ($id) {
336 if ($cache) {
337 _salesforce_insert('account_id', $id, $account);
338 }
339 return $contact['records']->values;
340 }
341 }
342
343 /**
344 * retreive contract information from an account
345 */
346 function salesforce_contract_select($account = NULL, $params = array(), $defaults = true) {
347 $salesforce = salesforce();
348 $account = _salesforce_select_account($account);
349 $admin = user_access('administer salesforce');
350
351 // first we need to make sure we have an account_id to work with
352 if (!$account->salesforce['account_id']) {
353 $result = salesforce_account_select($account);
354 $account->salesforce['account_id'] = $result['AccountId'];
355 if (!$account->salesforce['account_id']) return array('error' => 'NO_ACCOUNT_ID_FOUND');
356 }
357
358 // merge default fields it required
359 if ($defaults) {
360 $default = array('Id', 'Status', 'ContractTerm', 'ContractNumber', 'ActivatedDate', 'StartDate', 'EndDate');
361 $params = array_merge($default, $params);
362 }
363
364 // query salesforce for contract ids that this user has
365 $result = $salesforce->query("SELECT id FROM contract WHERE accountId = '". $account->salesforce['account_id'] ."'");
366 if (is_array($result['records'])) {
367 foreach ($result['records'] as $row) {
368 $contracts[] = $salesforce->retrieve('id', "contract", array($account->salesforce['account_id'], $account->salesforce['account_id']));
369 }
370 } else {
371 $contracts = $salesforce->retrieve(implode(', ', $params), "contract", array($result['records']->id, $result['records']->id));
372 }
373
374 return $contracts;
375 }

  ViewVC Help
Powered by ViewVC 1.1.2