/** * Get a list of the relationship records that have been modified within a * specified date range. This is used to perform a sync with a mobile client. * The results are paged. * * @param xsd:string $session * @param xsd:string $module_name * @param xsd:string $related_module * @param xsd:string $from_date * @param xsd:string $to_date * @param xsd:int $offset * @param xsd:int $max_results * @param xsd:int $deleted * @param xsd:int $module_id * @param tns:select_fields $select_fields * @param tns:select_fields $ids * @param xsd:string $relationship_name * @param xsd:string $deletion_date * @param xsd:int $php_serialize * @return */ function sync_get_modified_relationships($session, $module_name, $related_module, $from_date, $to_date, $offset, $max_results, $deleted, $module_id = '', $select_fields = array(), $ids = array(), $relationship_name = '', $deletion_date = '', $php_serialize = 1) { global $beanList, $beanFiles; $error = new SoapError(); $output_list = array(); if (!validate_authenticated($session)) { $error->set_error('invalid_login'); return array('result_count' => -1, 'entry_list' => array(), 'error' => $error->get_soap_array()); } if (empty($beanList[$module_name]) || empty($beanList[$related_module])) { $error->set_error('no_module'); return array('result_count' => -1, 'entry_list' => array(), 'error' => $error->get_soap_array()); } global $current_user; if (!check_modules_access($current_user, $module_name, 'read') || !check_modules_access($current_user, $related_module, 'read')) { $error->set_error('no_access'); return array('result_count' => -1, 'entry_list' => array(), 'error' => $error->get_soap_array()); } // Cast to integer $deleted = (int) $deleted; if ($max_results > 0 || $max_results == '-99') { global $sugar_config; $sugar_config['list_max_entries_per_page'] = $max_results; } $date_query = "(m1.date_modified > " . db_convert("'" . $GLOBALS['db']->quote($from_date) . "'", 'datetime') . " AND m1.date_modified <= " . db_convert("'" . $GLOBALS['db']->quote($to_date) . "'", 'datetime') . " AND {0}.deleted = {$deleted})"; if (isset($deletion_date) && !empty($deletion_date)) { $date_query .= " OR ({0}.date_modified > " . db_convert("'" . $GLOBALS['db']->quote($deletion_date) . "'", 'datetime') . " AND {0}.date_modified <= " . db_convert("'" . $GLOBALS['db']->quote($to_date) . "'", 'datetime') . " AND {0}.deleted = 1)"; } $in = ''; if (isset($ids) && !empty($ids)) { foreach ($ids as $value) { if (empty($in)) { $in .= "('" . $GLOBALS['db']->quote($value) . "'"; } else { $in .= ",'" . $GLOBALS['db']->quote($value) . "'"; } } $in .= ')'; } $query = ''; if (isset($in) && !empty($in)) { $query .= "( {$date_query} AND m1.id IN {$in}) OR (m1.id NOT IN {$in} AND {0}.deleted = 0)"; } else { $query .= "( {0}.deleted = 0)"; } if (isset($module_id) && !empty($module_id)) { //if(isset($in) && !empty($in)){ $query .= " AND"; //} $query .= " m2.id = '" . $GLOBALS['db']->quote($module_id) . "'"; } if ($related_module == 'Meetings' || $related_module == 'Calls') { $query = string_format($query, array('m1')); } $results = retrieve_modified_relationships($module_name, $related_module, $query, $deleted, $offset, $max_results, $select_fields, $relationship_name); $list = $results['result']; $xml = '<?xml version="1.0" encoding="utf-8"?><items>'; foreach ($list as $value) { $val = array_get_return_value($value, $results['table_name']); if ($php_serialize == 0) { $xml .= get_name_value_xml($val, $module_name); } $output_list[] = $val; } $xml .= '</items>'; $next_offset = $offset + sizeof($output_list); if ($php_serialize == 0) { $myoutput = base64_encode($xml); } else { $myoutput = get_encoded($output_list); } return array('result_count' => sizeof($output_list), 'next_offset' => 0, 'total_count' => sizeof($output_list), 'field_list' => array(), 'entry_list' => $myoutput, 'error' => $error->get_soap_array()); }
for (; $ri < sizeof($sync_modules[$sync_module_index]['related']); $ri++) { $related = $sync_modules[$sync_module_index]['related'][$ri]; if (!isset($_REQUEST['rel_offset'])) { $rel_offset = 0; } else { $rel_offset = $_REQUEST['rel_offset']; } if ($rel_offset == 0) { add_to_msg('Retrieving Local Relationships - ' . $related . '<br>', false); update_progress_bar('records', 0, 100); if ($clean_sync == 1) { clean_relationships_for_sync($sync_module, $related); } $altered_relation = get_altered_relationships($sync_module, $related, $local_last_sync, $local_time); if (isset($altered_relation['result_count']) && $altered_relation['result_count'] > 0) { $commit_relation = get_encoded($altered_relation['entry_list']); update_progress_bar('records', 50, 100); add_to_msg('Sending ' . sizeof($altered_relation['entry_list']) . ' Modified Relationship Records<br>', false); $result = $soapclient->call('sync_set_relationships', array('session' => $session, 'module_name' => $sync_module, 'related_module' => $related, 'from_date' => $last_sync, 'to_date' => $start_time, 'sync_entry_list' => $commit_relation, 'deleted' => -1)); } update_progress_bar('records', 100, 100); } if ($rel_offset > 0 || !has_error($result)) { update_progress_bar('records', 0, 100); $next_off = $rel_offset + $rel_max; add_to_msg('Retrieving Server Relationships - ' . $related . "[{$rel_offset} - {$next_off}] <br>", false); if ($clean_sync == 1) { $result = $soapclient->call('get_quick_sync_data', array('session' => $session, 'module_name' => $sync_module, 'related_module_name' => $related, 'start' => $rel_offset, 'count' => $rel_max, 'db_type' => $sugar_config['dbconfig']['db_type'], 'deleted' => 2)); } else { $result = $soapclient->call('sync_get_relationships', array('session' => $session, 'module_name' => $sync_module, 'related_module' => $related, 'from_date' => $last_sync, 'to_date' => $start_time, 'offset' => $rel_offset, 'max_results' => $rel_max, 'deleted' => 2)); }
function sync_set_relationships($session, $module_name, $related_module, $from_date, $to_date, $sync_entry_list, $deleted) { global $beanList, $beanFiles; global $current_user; $error = new SoapError(); $output_list = array(); if (!validate_authenticated($session)) { $error->set_error('invalid_login'); return array('result_count' => -1, 'entry_list' => array(), 'error' => $error->get_soap_array()); } if (empty($beanList[$module_name]) || empty($beanList[$related_module])) { $error->set_error('no_module'); return array('result_count' => -1, 'entry_list' => array(), 'error' => $error->get_soap_array()); } require_once 'modules/Sync/SyncController.php'; if (!check_modules_access($current_user, $module_name, 'write') && !in_array($module_name, $read_only_override) || !check_modules_access($current_user, $related_module, 'write') && !in_array($related_module, $read_only_override)) { $error->set_error('no_access'); return array('result_count' => -1, 'entry_list' => array(), 'error' => $error->get_soap_array()); } $entry_list = get_decoded($sync_entry_list); $done = server_save_relationships($entry_list, $from_date, $to_date); $conflicts = array(); $con_enc = get_encoded($conflicts); return array('conflicts' => $con_enc, 'status' => 'success', 'ids' => $done['ids'], 'error' => $error->get_soap_array()); }
echo '<br><br>Modifying Local and Through Soap - Should Have Conflict - test sync_set_entries' . $id; $current_user = new User(); $current_user->retrieve('1'); $contact = new Contact(); echo 'saving ' . $id; $contact->retrieve($id); $contact->first_name = 'modifed local'; $contact->save(); $contact->retrieve($id); $contact->first_name = 'modifed server'; $timestart = microtime(true); $commit = array(); $commit[] = get_return_value($contact, 'Contacts'); $commit[0]['resolve'] = 0; echo 'RESOLVING ' . $commit[0]['resolve']; $commit = get_encoded($commit); $result = $soapclient->call('sync_set_entries', array('session' => $session, 'module_name' => 'Contacts', 'from_date' => $dm, 'sync_entry_list' => $commit)); $diff = microtime(true) - $timestart; echo "<b>Time for retrieving the contacts added list is {$diff} </b> <br><br>"; print_result($result); } echo '<BR>TESTING NOTES<BR>'; echo '<br><br><b>Set A Note - set_entry test:</b><BR>'; $time = $timedate->nowDb(); $date = $timedate->asDbDate($timedate->getNow()->get("+" + rand(0, 360000) + "seconds")); $hour = $timedate->asDbTime($timedate->getNow()->get("+" + rand(0, 360000) + "seconds")); $result = $soapclient->call('set_entry', array('session' => $session, 'module_name' => 'Notes', 'name_value_list' => array(array('name' => 'name', 'value' => "{$time} Note {$i}")))); $note_id = $result['id']; print_result($result); echo '<br><br><b>Set A Note attachment - set_note_attachment test:</b><BR>'; $file = base64_encode('This is an attached file');