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

Palach

Moderators
  • Content Count

    37
  • Joined

  • Last visited

  • Days Won

    1

Palach last won the day on January 31 2018

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. Удалите папку кеш, полагаю, что из за разных версий кеш перемешался и поэтому не работает LTS и вообще рекомендую в настройках конфигурации убрать у всех модулей ajax тогда проблем с окошком content будет
  2. в гитлабе есть возможность деплоя на сервер через gitlab CI
  3. Hi nvnam1 ! You must copy the minimize code from include / javascript / yui / build / autocomplete / autocomplete.js in include / javascript / yui / build / autocomplete / autocomplete-min.js Data in the cache comes from there. After you need to delete the cache folder or js filles which contain YAHOO.widget.AutoComplete.prototype._updateValue function you might need to clear your browser cache. Sorry for bad english.
  4. Вышеуказанные ошибки к отправке писем никакого отношения не имеют... Что в очереди на отправку в администрировании ? крон настроен? В планировщике стоит задача ? какой почтовый сервис используете (mail gmail yandex) ?
  5. Здравствуйте попробуйте создать файл custom/Extension/modules/Название модуля/Ext/Vardefs/любое название(на английском).php и добавить в него следующий код: $dictionary['название модуля']['fields']['название поля'][''audited'] = true; сделайте быстрое восстановление проверьте добавление этой строчки в файл custom/modules/Название модуля/Ext/Vardefs/vardefs.ext.php если она там не появилась пропешите ее в этом файле и удалите кеш
  6. Насколько я понял вы хотите сумму сделки отображать в нескольких валютах одновременно ?
  7. Так же можно сделать отдельный отчет по сотруднику , если их не 100 500 и вывести каждый из них в отдельном дашлете на главной или добавить на главной отдельную вкладку под это...
  8. там надо код править... когда нибудь руки дойдут... а может пофиксят....
  9. Была задача в 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; } }; в итоге получаем следующий вид авто заполнения ячейки с контрагентом :
  10. Стояла задача организовать поиск(фильтрацию на карточке списка) обращений по 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', ),
    Состав пакета для интеграции 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 распространяется абсолютно бесплатно.
  11. Version 1.0.0

    48 downloads

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