function importVCard($filename, $module = 'Contacts') { global $current_user; $lines = file($filename); $start = false; $contact = loadBean($module); $contact->title = 'imported'; $contact->assigned_user_id = $current_user->id; $fullname = ''; $email_suffix = 1; for ($index = 0; $index < sizeof($lines); $index++) { $line = $lines[$index]; // check the encoding and change it if needed $locale = new Localization(); $encoding = $locale->detectCharset($line); if ($encoding != $GLOBALS['sugar_config']['default_charset']) { $line = $locale->translateCharset($line, $encoding); } $line = trim($line); if ($start) { //VCARD is done if (substr_count(strtoupper($line), 'END:VCARD')) { if (!isset($contact->last_name)) { $contact->last_name = $fullname; } break; } $keyvalue = explode(':', $line); if (sizeof($keyvalue) == 2) { $value = $keyvalue[1]; for ($newindex = $index + 1; $newindex < sizeof($lines), substr_count($lines[$newindex], ':') == 0; $newindex++) { $value .= $lines[$newindex]; $index = $newindex; } $values = explode(';', $value); $key = strtoupper($keyvalue[0]); $key = strtr($key, '=', ''); $key = strtr($key, ',', ';'); $keys = explode(';', $key); if ($keys[0] == 'TEL') { if (substr_count($key, 'WORK') > 0) { if (substr_count($key, 'FAX') > 0) { if (!isset($contact->phone_fax)) { $contact->phone_fax = $value; } } else { if (!isset($contact->phone_work)) { $contact->phone_work = $value; } } } if (substr_count($key, 'HOME') > 0) { if (substr_count($key, 'FAX') > 0) { if (!isset($contact->phone_fax)) { $contact->phone_fax = $value; } } else { if (!isset($contact->phone_home)) { $contact->phone_home = $value; } } } if (substr_count($key, 'CELL') > 0) { if (!isset($contact->phone_mobile)) { $contact->phone_mobile = $value; } } if (substr_count($key, 'FAX') > 0) { if (!isset($contact->phone_fax)) { $contact->phone_fax = $value; } } } if ($keys[0] == 'N') { if (sizeof($values) > 0) { $contact->last_name = $values[0]; } if (sizeof($values) > 1) { $contact->first_name = $values[1]; } if (sizeof($values) > 2) { $contact->salutation = $values[2]; } } if ($keys[0] == 'FN') { $fullname = $value; } } if ($keys[0] == 'ADR') { if (substr_count($key, 'WORK') > 0 && (substr_count($key, 'POSTAL') > 0 || substr_count($key, 'PARCEL') == 0)) { if (!isset($contact->primary_address_street) && sizeof($values) > 2) { $textBreaks = array("\n", "\r"); $vcardBreaks = array("=0A", "=0D"); $contact->primary_address_street = str_replace($vcardBreaks, $textBreaks, $values[2]); } if (!isset($contact->primary_address_city) && sizeof($values) > 3) { $contact->primary_address_city = $values[3]; } if (!isset($contact->primary_address_state) && sizeof($values) > 4) { $contact->primary_address_state = $values[4]; } if (!isset($contact->primary_address_postalcode) && sizeof($values) > 5) { $contact->primary_address_postalcode = $values[5]; } if (!isset($contact->primary_address_country) && sizeof($values) > 6) { $contact->primary_address_country = $values[6]; } } } if ($keys[0] == 'TITLE') { $contact->title = $value; } if ($keys[0] == 'EMAIL') { $field = 'email' . $email_suffix; if (!isset($contact->{$field})) { $contact->{$field} = $value; } if ($email_suffix == 1) { $_REQUEST['email1'] = $value; } $email_suffix++; } if ($keys[0] == 'ORG') { $GLOBALS['log']->debug('I found a company name'); if (!empty($value)) { $GLOBALS['log']->debug('I found a company name (fer real)'); if (is_a($contact, "Contact") || is_a($contact, "Lead")) { $GLOBALS['log']->debug('And Im dealing with a person!'); $accountBean = loadBean('Accounts'); // It's a contact, we better try and match up an account $full_company_name = trim($values[0]); // Do we have a full company name match? $result = $accountBean->retrieve_by_string_fields(array('name' => $full_company_name, 'deleted' => 0)); if (!isset($result->id)) { // Try to trim the full company name down, see if we get some other matches $vCardTrimStrings = array('/ltd\\.*/i' => '', '/llc\\.*/i' => '', '/gmbh\\.*/i' => '', '/inc\\.*/i' => '', '/\\.com/i' => ''); // Allow users to override the trimming strings if (file_exists('custom/include/vCardTrimStrings.php')) { require_once 'custom/include/vCardTrimStrings.php'; } $short_company_name = trim(preg_replace(array_keys($vCardTrimStrings), $vCardTrimStrings, $full_company_name), " ,."); $GLOBALS['log']->debug('Trying an extended search for: ' . $short_company_name); $result = $accountBean->retrieve_by_string_fields(array('name' => $short_company_name, 'deleted' => 0)); } if (!isset($result->id)) { // We could not find a parent account $GLOBALS['log']->debug("Did not find a matching company ({$full_company_name})"); $contact->account_id = ''; $contact->account_name = $full_company_name; } else { $GLOBALS['log']->debug("Found a matching company: " . $result->name); $contact->account_id = $result->id; $contact->account_name = $result->name; } $contact->department = $values[1]; } else { $contact->department = $value; } } } } //FOUND THE BEGINING OF THE VCARD if (!$start && substr_count(strtoupper($line), 'BEGIN:VCARD')) { $start = true; } } if (empty($contact->account_id) && !empty($contact->account_name)) { $GLOBALS['log']->debug("Look ma! I'm creating a new account: " . $contact->account_name); // We need to create a new account $accountBean = loadBean('Accounts'); // Populate the newly created account with all of the contact information foreach ($contact->field_defs as $field_name => $field_def) { if (!empty($contact->{$field_name})) { $accountBean->{$field_name} = $contact->{$field_name}; } } $accountBean->name = $contact->account_name; $accountBean->save(); $contact->account_id = $accountBean->id; } $contactId = $contact->save(); return $contactId; }