Jump to content
SpravkaCRM.ru - Ваш справочник по CRM

Palach

Сотрудники
  • Content count

    33
  • Joined

  • Last visited

  • Days Won

    1

Palach last won the day on January 31

Palach had the most liked content!

Community Reputation

1 Neutral

About Palach

  • Rank
    Advanced Member

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Вышеуказанные ошибки к отправке писем никакого отношения не имеют... Что в очереди на отправку в администрировании ? крон настроен? В планировщике стоит задача ? какой почтовый сервис используете (mail gmail yandex) ?
  2. Здравствуйте попробуйте создать файл custom/Extension/modules/Название модуля/Ext/Vardefs/любое название(на английском).php и добавить в него следующий код: $dictionary['название модуля']['fields']['название поля'][''audited'] = true; сделайте быстрое восстановление проверьте добавление этой строчки в файл custom/modules/Название модуля/Ext/Vardefs/vardefs.ext.php если она там не появилась пропешите ее в этом файле и удалите кеш
  3. Насколько я понял вы хотите сумму сделки отображать в нескольких валютах одновременно ?
  4. Так же можно сделать отдельный отчет по сотруднику , если их не 100 500 и вывести каждый из них в отдельном дашлете на главной или добавить на главной отдельную вкладку под это...
  5. там надо код править... когда нибудь руки дойдут... а может пофиксят....
  6. Была задача в CRM системе настроить быструю привязку контрагента к Обращению вводя в поле контрагент либо ИНН или Логин или название организации. Поиск по ресурсам вывел на статью http://support.sugarcrm.com/Documentation/Sugar_Developer/Sugar_Developer_Guide_6.5/Module_Framework/Metadata/Examples/Adding_QuickSearch_to_a_custom_field/index.html для тех кто будет организовать подобный поиск для кастомного поля будет очень полезна. Поискав сам механизм поиска контрагентов пришел к файлу: include/QuickSearchDefaults.php в котором описывается формат пориска function getQSAccount($nameKey, $idKey, $billingKey = null, $shippingKey = null, $additionalFields = null) { global $app_strings; $field_list = array('name', 'id'); //описывает поля передаваемые в браузер найденных записей $populate_list = array($nameKey, $idKey); if($billingKey != null) { $field_list = array_merge($field_list, array('billing_address_street', 'billing_address_city', 'billing_address_state', 'billing_address_postalcode', 'billing_address_country')); $populate_list = array_merge($populate_list, array($billingKey . "_address_street", $billingKey . "_address_city", $billingKey . "_address_state", $billingKey . "_address_postalcode", $billingKey . "_address_country")); } //if if($shippingKey != null) { $field_list = array_merge($field_list, array('shipping_address_street', 'shipping_address_city', 'shipping_address_state', 'shipping_address_postalcode', 'shipping_address_country')); $populate_list = array_merge($populate_list, array($shippingKey . "_address_street", $shippingKey . "_address_city", $shippingKey . "_address_state", $shippingKey . "_address_postalcode", $shippingKey . "_address_country")); } if(!empty($additionalFields) && is_array($additionalFields)) { $field_list = array_merge($field_list, array_keys($additionalFields)); $populate_list = array_merge($populate_list, array_values($additionalFields)); } $qsParent = array( 'form' => $this->form_name, 'method' => 'query', 'modules' => array('Accounts'), 'group' => 'or', 'field_list' => $field_list, 'populate_list' => $populate_list, 'conditions' => array(array('name'=>'name','op'=>'like_custom','end'=>'%','value'=>'')), // условия выборки нужной записи в нашем случае это выглядело бы array(array('name'=>'name','op'=>'like_custom','end'=>'%','value'=>'') or array('name'=>'inn_c','op'=>'like_custom','end'=>'%','value'=>'') or array('name'=>'login_c','op'=>'like_custom','end'=>'%','value'=>'')) 'required_list' => array($idKey), 'order' => 'name', 'limit' => '30', 'no_match_text' => $app_strings['ERR_SQS_NO_MATCH'] ); return $qsParent; } но изменив таким образом код мы поменяем условия поиска во всех полях Контрагент, а перед нами стоит задача поменять условие поиска только в обращениях... дальнейший поиска привел к тому что формат поиска указывается джаваскриптом на каждой странице для всех полей отдельно </script><script language="javascript">if(typeof sqs_objects == 'undefined'){var sqs_objects = new Array;}sqs_objects['EditView_account_name']={"form":"EditView","method":"query","modules":["Accounts"],"group":"or","field_list":["name","id"],"populate_list":["EditView_account_name","account_id"],"conditions":[{"name":"name","op":"like_custom","end":"%","value":""}],"required_list":["account_id"],"order":"name","limit":"30","no_match_text":"\u041d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e"};sqs_objects['EditView_assigned_user_name']={"form":"EditView","method":"get_user_array","field_list":["user_name","id"],"populate_list":["assigned_user_name","assigned_user_id"],"required_list":["assigned_user_id"],"conditions":[{"name":"user_name","op":"like_custom","end":"%","value":""}],"limit":"30","no_match_text":"\u041d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e"};</script> таким образом нам необходимо просто переписать данный код либо добавить ниже необходимый нам , что я и сделал: создал хук для вывод в конце страницы custom/Extension/modules/Cases/Ext/LogicHooks/quickSearch.php: /** * Created by PhpStorm. * User: SeedTeam * Date: 14.03.2018 * Time: 19:14 */ $hook_array['after_ui_frame'][] = Array( 99, 'быстрый поиск по ИНН, Логину, Названию', 'custom/modules/Cases/quicksearchaccount.php', 'QuickSearchCasesAccount', 'QuickSearchCasesAccountUpdateScript' ); далле сам файл обработчик custom/modules/Cases/quicksearchaccount.php который подключает tpl ку в конце страницы: /** * Created by PhpStorm. * User: SeedTeam * Date: 14.03.2018 * Time: 19:19 */ class QuickSearchCasesAccount { public function QuickSearchCasesAccountUpdateScript($event, $arguments) { $smarty = new Sugar_Smarty(); $smarty->display("custom/modules/Cases/tpl/QuickSearchCasesAcc.tpl"); } } и наконец сама tpl custom/modules/Cases/tpl/QuickSearchCasesAcc.tpl с джаваскриптом: <script type="text/javascript"> {literal} if(typeof sqs_objects == 'undefined'){var sqs_objects = new Array;}sqs_objects['EditView_account_name']={"form":"EditView","method":"query","modules":["Accounts"],"group":"or","field_list":["name","id","login_c","inn_c"],"populate_list":["EditView_account_name","account_id"],"conditions":[{"name":"name","op":"like_custom","end":"%","value":""}, {"name":"id","op":"like_custom","end":"%","value":""}, {"name":"login_c","op":"like_custom","end":"%","value":""}, {"name":"inn_c","op":"like_custom","end":"%","value":""}],"required_list":["account_id"],"order":["id"," ","id"],"limit":"30","no_match_text":"\u041d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e"}; {/literal} </script> теперь при вводе инн или логина происходит искомого контрагента, но у нас выводится только его название... а это не всегда удоблно, хотелось бы видеть и сам логин и ИНН для этого идем в файл modules/Home/QuickSearch.php который отвечает за выдачу json обекта в браузер и чуть чуть корректируем формат построения массива: $modifide = false; //создаем логическую переменную if(in_array('inn_c',$args['field_list'])) { $modifide = true; // присваиваем ей true если в формате полей присутствует требуемые нам поля в нашем случае inn_c, $args['field_list'] данный массив содержит переменные которые необходимы для передачи в браузер и которые мы указали в джаваскрипте } и изменяем значение name которое выводится в полое, следующим образом : if(($field == 'name') and ($modifide)) {$data['fields'][$i][$field]= "<p><b>Название:</b> ".$results[$i]->name."</p><p><b>Логин: </b> ".$results[$i]->login_c."</p><p><b>ИНН: </b> ".$results[$i]->inn_c."</p>";} получаем что в modules/Home/QuickSearch.php функция formatResults выглядит следующим образом protected function formatResults($results, $args) { global $sugar_config; $app_list_strings = null; $data['totalCount'] = count($results); $data['fields'] = array(); for ($i = 0; $i < count($results); $i++) { $data['fields'][$i] = array(); $data['fields'][$i]['module'] = $results[$i]->object_name; //C.L.: Bug 43395 - For Quicksearch, do not return values with salutation and title formatting if($results[$i] instanceof Person) { $results[$i]->createLocaleFormattedName = false; } $listData = $results[$i]->get_list_view_data(); //print_array($listData); //print_array($args['field_list']); $modifide = false; if(in_array('inn_c',$args['field_list'])) { $modifide = true; } //print_array($modifide); foreach ($args['field_list'] as $field) { if ($field == "user_hash") { continue; } // handle enums if ((isset($results[$i]->field_name_map[$field]['type']) && $results[$i]->field_name_map[$field]['type'] == 'enum') || (isset($results[$i]->field_name_map[$field]['custom_type']) && $results[$i]->field_name_map[$field]['custom_type'] == 'enum')) { // get fields to match enum vals if(empty($app_list_strings)) { if(isset($_SESSION['authenticated_user_language']) && $_SESSION['authenticated_user_language'] != '') $current_language = $_SESSION['authenticated_user_language']; else $current_language = $sugar_config['default_language']; $app_list_strings = return_app_list_strings_language($current_language); } // match enum vals to text vals in language pack for return if(!empty($app_list_strings[$results[$i]->field_name_map[$field]['options']])) { $results[$i]->$field = $app_list_strings[$results[$i]->field_name_map[$field]['options']][$results[$i]->$field]; } } if (isset($listData[$field])) { $data['fields'][$i][$field] = $listData[$field]; } else if (isset($results[$i]->$field)) { $data['fields'][$i][$field] = $results[$i]->$field; if(($field == 'name') and ($modifide)) {$data['fields'][$i][$field]= "<p><b>Название:</b> ".$results[$i]->name."</p><p><b>Логин: </b> ".$results[$i]->login_c."</p><p><b>ИНН: </b> ".$results[$i]->inn_c."</p>";} } else { $data['fields'][$i][$field] = ''; } } } if (is_array($data['fields'])) { foreach ($data['fields'] as $i => $recordIn) { if (!is_array($recordIn)) { continue; } foreach ($recordIn as $col => $dataIn) { if (!is_scalar($dataIn)) { continue; } $data['fields'][$i][$col] = html_entity_decode($dataIn, ENT_QUOTES, 'UTF-8'); } } } return $data; } теперь у нас выводися в необходимом формате, но и в поле добавляется значение с тегами... что ни есть гуд... теперь идем в файл и для автозаполнения поля добавим фильтр на js что бы удалять ненужные теги находим следующие строки и меняем на YAHOO.widget.AutoComplete.prototype._updateValue = function(elListItem) { if(!this.suppressInputUpdate) { var elTextbox = this._elTextbox; var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null; var sResultMatch = elListItem._sResultMatch; // Calculate the new value var sNewValue = ""; if(sDelimChar) { // Preserve selections from past queries sNewValue = this._sPastSelections; // Add new selection plus delimiter sNewValue += sResultMatch + sDelimChar; if(sDelimChar != " ") { sNewValue += " "; } } else { sNewValue = sResultMatch; } sNewValue = sNewValue.replace("<p><b>Название:</b> ",""); // удаляем заголовки вместе с тегами sNewValue = sNewValue.replace("</p><p><b>Логин: </b>","");// удаляем заголовки вместе с тегами sNewValue = sNewValue.replace("</p><p><b>ИНН: </b>","");// удаляем заголовки вместе с тегами sNewValue = sNewValue.replace("</p>","");// удаляем заголовки вместе с тегами // Update input field elTextbox.value = sNewValue; // Scroll to bottom of textarea if necessary if(elTextbox.type == "textarea") { elTextbox.scrollTop = elTextbox.scrollHeight; } // Move cursor to end var end = elTextbox.value.length; this._selectText(elTextbox,end,end); this._elCurListItem = elListItem; } }; в итоге получаем следующий вид авто заполнения ячейки с контрагентом :
  7. Стояла задача организовать поиск(фильтрацию на карточке списка) обращений по email связанных c ним Контактов , так же необходимо , что бы искались записи по частичному вхождению адреса, например почта pupok@mail.ru должна находиться при запросе: "pup" добавили поле mail_contact_init типа non-db выводим его в карточку расширенного поиска custom/modules/Cases/metadata/searchdefs.php или через студию, добавляем запрос по которому будит производиться поиск записи Обращения (в запросе нужно получить Id записи модуля по необходимым нам условиям) в файле custom/modules/Cases/metadata/SearchFields.php в моем случае это: 'mail_contact_init' => //Наименование поля array ( 'query_type' => 'format', // Тип запроса, важно указать format 'operator' => 'subquery', 'subquery' => 'SELECT cases.id FROM cases INNER JOIN contacts_cases ON cases.id IN (SELECT contacts_cases.case_id FROM contacts_cases WHERE contacts_cases.deleted = 0 AND contacts_cases.contact_id IN (SELECT email_addr_bean_rel.bean_id FROM email_addr_bean_rel WHERE email_addr_bean_rel.deleted = 0 AND email_addr_bean_rel.bean_module = \'Contacts\' AND email_addr_bean_rel.email_address_id IN (SELECT email_addresses.id FROM email_addresses WHERE email_addresses.deleted = 0 AND email_addresses.email_address LIKE "%{0}%" ) ) )', // вместо {0} suitecrm подставляет введенный запрос в данном поле 'db_field' => // Выборка записей основного модуля (обращения) идет по id array ( 0 => 'id', ), 'vname' => 'LBL_MAIL_CONTACT_INIT', ),
  8. Palach

    GMail + SuiteCRM

    Состав пакета для интеграции SuiteCRM и Gmail: Пакет интеграции состоит из 2 частей GMail.SuiteCRM.v1.0.1.zip устанавливается в suiteCRM/sugarCRM через установщик модулей. Вторая часть CRMHosting_Gmail_SuiteCRM_ChromeExtension.zip устанавливается на браузер (Опера, Chrome, Яндекс браузер). Установка серверной части Установка модуля для серверной части crm происходит через загрузчик модулей CRM системы. переходим на страницу администрирования в разделе Инструментарий разработчика выбираем пункт Загрузчик модулей. в открывшемся окне нажимаем кнопку Выберите файл в появившемся окне выбираем файл с модулем После того , как модуль окажется в списке загруженных нажать кнопку установить В появившемся окне ознакомиться с условиями лицензионного соглашения и нажать кнопку переместить переключатель в положение принимаю и нажать кнопку вперед дождитесь окончания установки. Установка расширения для браузера для установки расширения для браузера необходимо разархивировать файл с расширением, открыть ваш браузер(опера, chrome, яндекс браузер) и в меню выбрать расширения и перетянуть, в него папку с расширением на этом установка расширения завершена. Настройка: При первом заходе после установки расширения на почту gmail появляется всплывающее окно, в котором необходимо указать адрес SuiteCRM/SugarCRM c установленным модулем интеграции gmail. после ввода происходит перезагрузка системы. На странице почты должна появиться кнопка выполненная в виде логотипа SuiteCRM. В случае если вы произвели установку, но приложение не заработало попробуйте сменить браузер. (с некоторой вероятностью могут возникать ошибки в браузерах chrome и яндекс браузер.) Функционал: Функционал интеграции предполагает быструю и удобную передачу информации от gmail в CRM и наоборот от CRM на страницу gmail. При переходе в письмо или в переписку с определенным контактом мы увидимв правом углу логотип suiteCRM при наведении на него курсора мыши появится боковая панель, в которой находится информация о контакте в CRM системе, если адрес отправителя присутствует в карточке клиента. Если среди зарегистрированных клиентов нет тех, у кого указан данный адрес электронной почты то в панеле будут присутствовать 2 кнопки, одна из которых позволит создать новый контакт, вторая привязать этот адрес электронной почты к уже существующему контакту. так же при поиске похожих контактов модуль ищет по адресам сайтов сравнивая их с адресом после символа @ и других электронных адресов сравнивая части после символа @. Данный модуль позволит создать прямо из почты записи в следующих подулях и автоматически связать их с данным клиентом. Задачи, Заметки, Звонки, Сделки, Обращения. также модуль покажет следующие субпанели связанные с данным клиентом: История, Сделки, Мероприятия. все записи в этих субпанелях так же как и в CRM являются ссылками на соответствующие карточки. Файл с расширением в браузер: CRMHosting_Gmail_SuiteCRM_ChromeExtension.zip данное решение по интеграции разработано компанией CRMHosting.ru распространяется абсолютно бесплатно.
  9. Version 1.0.0

    21 downloads

    Пакетная загрузка файлов в субнанель документы для SuiteCRM/SugarCRM dragndropuploaddocuments - это дополнение к CRM-системе на базе SugarCRM/SuiteCRM, которое позволяет быстро и удобно добавлять файлы в субпанели документы, просто перетягивая их из папки в поле для загрузки. Поддерживает загрузку нескольких файлов одновременно. Вот смотрите, на примере модуля Контрагенты: для установки необходимо : 1 скачать файл дополнения 2 перейти в CRM систему Администрирование -> Загрузчик модулей 3 выбрать файл дополнения 4 После того , как модуль окажется в списке загруженных нажать кнопку установить 5 В появившемся окне ознакомиться с условиями лицензионного соглашения и нажать кнопку переместить переключатель в положение принимаю и нажать кнопку вперед 6 дождитесь окончания установки. Модуль готов к использованию
  10. я смотрю тема старая... Используете страные версии Suite или поддержку темы поправили ?
  11. Если воспользоваться почтовым клиентом SuiteCRM для написания письма, выясняется, что кириллическое имя отправителя при помещении отправленного письма в папку "Отправленные" либо "Черновики"оказывается нечитаемым, по факту преобразованным в "ISO-8859-1".Оказалось, в обработчике /modules/Emails/Email.php в стр. 1198 используется функция mb_decode_mimeheader(), которая не дружит с кодировкой UTF-8.Достаточно заменить ее на imap_utf8() - проблема с кодировкой отпадет. $decodedFromName = imap_utf8($mail->FromName);
  12. Добился определенных успехов но вопросы пока остаются, никто не знает почему в студии в форме быстрого ввода в встречах поле DURATION есть а в событиях нет ? думал в vardefs идет разное описание переменных но нет, копейка в копейку...
  13. поправил я этот файл теперь стало интересней, выдает ошибку сохранения, но лог црм ки замолчал.. буду пробовать искать по алерту
  14. так новая уже в црмке идет , нет не скачивал кеш почистить в браузере обязательно... иначе старые скрипты работают
×