All Activity

This stream auto-updates   

  1. Yesterday
  2. Earlier
  3. Доброго времени суток! Хочу поделиться практикой по автоматизации одного из бизнеспроцессов в нашей SuiteCRM В данный момент используеммобильное приложение Business Card Reader for Suite CRM http://play.google.com/store/apps/details?id=com.magneticonemobile.businesscardreader.suitecrm. Коротко: приложение сканирует визитку исоздаетконтакт вCRM - жизненно необходимая вещь на выставках, семинарах,встречах вне офиса и тп.,позволяет фактически мгновенно вступить вдиалог с клиентом ну или партнером (у кого кто), отправить нужные предложения или материалы. Приложение решает наши задачи, но все же хочу спросить, может кто интересовался сканерами визиток, ибо время не стоит на месте и нужно быть в курсе всего нового и полезного. Подскажите кто, чтоиспользует в данное время для получения контактов с визиток и какие есть нюансы? Заранее благодарен!
  4. Модули

    Спасибо, понял!
  5. Модули

    Скидки указываются при создании предложения или счета. там при указании продуктов подставляются их цены, и к ним можно применить скидку: в процентах или в цифрах. это не модуль отдельный, а просто возможность при работе с набором продуктов.
  6. Модули

    Правильно понимаю что все перечисленные модули уже есть в SuiteCRM на демо сервере здесьhttp://s001.demo.crmhosting.ru/? не смог найти там модуля со скидками, не подскажете где он ?
  7. Упс, небольшая поправка: Пункт 3 - неправильно рассмотрел название поля - должен выглядеть так; $bean->name = $bean->code_inc.'-'.$bean->account_c.'-'.$bean->name_temp;
  8. Посмотрел чтобы научиться извлекать значения из связанного поля - спасибо автору, разобрался =)) В качестве благодарности, пример того, какможно категорически упростить хук. 1. Создатьчерез студию дополнительное поле "name_temp" и поставить его в макетередактирования на место оригинального "name" 2. Оригинальному полю "name", там же в студиизадатьзначение по умолчанию к примеру "не задано" 3. Весь хук теперь будет из одной строчки: $bean->name = $bean->code_inc.'-'.$bean->projects_accounts_name.'-'.$bean->name_temp;
  9. Всем привет! Нужно было, чтобы в зависимости от роли, по разному отображались модули.Долго искал решение вопроса, как на забугорных, так и на наших сайтах, полного решения нигде не нашел. Даже имея под рукой готовую систему как образец кастомизированную профи (а я таким себяне считаю =))) ), нашел в ней только вариант с использованием js скриптов, что меня не совсем устраивало. В итоге пришлось самому с помощью разных источников, красных глаз и многих сигарет создавать свое. Все работает =)))) как на родных, так и на своих модулях. Вид просмотра делается аналогично. Кому надо - берите Если найдете ошибки или идеи для оптимизации - пишите сюда - буду рад видеть. <?php // для переключения вида правки модуля dgkey_productsia в зависимости от роли // этот файл должен лежать в custom/modules/dgkey_productsia/views/view.edit.php // также должен быть подготовлен файл // /custom/modules/dgkey_productsia/metadata/editviewdefs2.php с пользовательским видом require_once('include/MVC/View/views/view.edit.php'); class dgkey_productsiaViewEdit extends ViewEdit // dgkey_productsia - название модуля, ViewEdit берем из аналогичного файла // в папке view установленнго модуля или /include/MVC/View/views/view.detail.php { private $manager; // пользовательское название function dgkey_productsiaViewEdit() // название функции берем из аналогичного файла в папке view установленнго модуля { unlink ('cache/modules/dgkey_productsia/EditView.tpl'); // отключает закэшированный } public function getMetaDataFile() // переписывает это - /include/MVC/View/SugarView.php { $metadataFile = null; $foundViewDefs = false; // идем проверяем роль текущего пользователя и если она ZakupControl // этого устанавливаем $viewDef = 'editviewdefs2' $objACLRole = new ACLRole(); $roles = $objACLRole->getUserRoles($GLOBALS['current_user']->id); if(in_array('ZakupControl',$roles)){ $viewDef = 'editviewdefs2'; } else{ $viewDef = 'editviewdefs'; } $coreMetaPath = 'modules/'.$this->module.'/metadata/' . $viewDef . '.php'; $metadataFile = 'custom/' . $coreMetaPath; return $metadataFile; } }
  10. Нашел одну CRM c безплатным графическим дизайнером.. Что бы не было рекламой вопросы в личку )
  11. Проблемы две Первая - это ошибки на страницах crm Предупреждение: пожалуйста, обновите систему до версии Chart Data Cache, используя ссылку "Восстановление" в панели администратора Предупреждение: пожалуйста, обновите систему до версии htaccess, используя ссылку "Восстановление" в панели администратора Вторая - в списке отображаются не все записи из бд. Проблема возникла после восстановления бд.
  12. В SuiteCRM новичок, но разбираюсь потихоньку. 1. В Студии в модуле Заказы создали связь "Один ко многим" с модулем Товары. Появилась таблица в базе данных и доп. панель в Студии у модуля Заказы. Заходим в нашу форму просмотра заказа и видим доп. панель "Товары"! Как просто! Чудесная система SuiteCRM! :-)
  13. Создан модуль заказов. Нужно теперь установить связь между ним и уже существуующим модулем товары: один заказ - много товаров. Связь создана в процессе создания модуля заказов в Конструкторе модулей. Вопрос: как объяснить SuiteCRM, что при создании или редактировании Заказа нужно НЕСКОЛЬКО товаров иметь возможность выбрать через связь и записать к этому заказу? Если в модуль товаров добавить поле Relate "order_product_id" - то при редактировании заказа можно выбрать ему один товар. А как сделать, чтобы можно было выбирать несколько товаров в этот заказ? Спасибо заранее!
  14. Да, собственно и нужно определить какая у пользователя роль и к какой группе он принадлежит чтобы выводить ему его интерфейс. Админ/Не админ, это да - в первемнной is_admin проверяется. Спасибо за подсказку. буду пробовать.
  15. Уровень прав доступа - это что? Администратор/не администратор? если да, то определяется это функцией is_admin($current_user) или is_admin($GLOBALS['current_user']) по ролям можно посмотреть в файл: modules/ACLRoles/ACLRole.php: /** * static getUserRoles($user_id) * returns a list of ACLRoles for a given user id * * @param GUID $user_id * @return a list of ACLRole objects */ function getUserRoles($user_id, $getAsNameArray = true){ //if we don't have it loaded then lets check against the db $additional_where = ''; $query = "SELECT acl_roles.* ". "FROM acl_roles ". "INNER JOIN acl_roles_users ON acl_roles_users.user_id = '$user_id' ". "AND acl_roles_users.role_id = acl_roles.id AND acl_roles_users.deleted = 0 ". "WHERE acl_roles.deleted=0 "; $result = $GLOBALS['db']->query($query); $user_roles = array(); while($row = $GLOBALS['db']->fetchByAssoc($result) ){ $role = new ACLRole(); $role->populateFromRow($row); if($getAsNameArray) $user_roles[] = $role->name; else $user_roles[] = $role; } return $user_roles; } /** * static getUserRoleNames($user_id) * returns a list of Role names for a given user id * * @param GUID $user_id * @return a list of ACLRole Names */ function getUserRoleNames($user_id){ $user_roles = sugar_cache_retrieve("RoleMembershipNames_".$user_id); if(!$user_roles){ //if we don't have it loaded then lets check against the db $additional_where = ''; $query = "SELECT acl_roles.* ". "FROM acl_roles ". "INNER JOIN acl_roles_users ON acl_roles_users.user_id = '$user_id' ". "AND acl_roles_users.role_id = acl_roles.id AND acl_roles_users.deleted = 0 ". "WHERE acl_roles.deleted=0 "; $result = $GLOBALS['db']->query($query); $user_roles = array(); while($row = $GLOBALS['db']->fetchByAssoc($result) ){ $user_roles[] = $row['name']; } sugar_cache_put("RoleMembershipNames_".$user_id, $user_roles); } return $user_roles; } /** * static getAllRoles($returnAsArray = false) * * @param boolean $returnAsArray - should it return the results as an array of arrays or as an array of ACLRoles * @return either an array of array representations of acl roles or an array of ACLRoles */ function getAllRoles($returnAsArray = false){ $db = DBManagerFactory::getInstance(); $query = "SELECT acl_roles.* FROM acl_roles WHERE acl_roles.deleted=0 ORDER BY name"; $result = $db->query($query); $roles = array(); while($row = $db->fetchByAssoc($result) ){ $role = new ACLRole(); $role->populateFromRow($row); if($returnAsArray){ $roles[] = $role->toArray(); }else{ $roles[] = $role; } } return $roles; } может эти функции помогут.
  16. В общем ситуация такая: Необходимо стало в зависимости от уровня прав доступа и названия роли переводить пользователя на нужные экраны для работы с системой, но никак не могу найти где это регулируется. Кто знает, подскажите?
  17. В логе такие ошибки: Tue May 10 17:59:45 2016 [1590][930b1248-144c-f31f-eeb0-5716279e1e37][ERROR] Unable to load related bean by id Tue May 10 17:59:45 2016 [1590][930b1248-144c-f31f-eeb0-5716279e1e37][ERROR] fromUser: Conversion of from user format d.m.Y H:i failed Ошибка возникает под пользователем с ограниченными правами. У администратора - нет.
  18. Предположу что в файле .htaccess в корне проекта. php_flag display_errors off
  19. По идее должен быть. Ну или в исходниках возьмите. Например тут:http://github.com/sugarcrm/sugarcrm_dev/blob/master/modules/Accounts/views/view.detail.php
  20. Подскажите, пожалуйста, а как сделать такой список? Это же, получается, не dropdown list, должна быть связь с модулем как-то..
  21. Максим: Добрый день 11:25:26 Евгений: 11:25:41 добрый! У меня такой вопрос, например у нас IT компания. Нужно чтобы клиенты ставили задачи исполнителям и сами могли менять статус задачи, например "Не выполнена" если они недовольны решением исполнителя 11:27:29 возможно такое? 11:27:35 11:28:22 для этого надо или клиентов пускать в CRM в виде пользователей 11:28:35 или писать на сайте личный кабинет, интегрированный с CRM 11:28:53 ну или просто интегрировать личный кабинет, если он уже написан и там есть такой функционал нет, писать что то лишнее и тратить на это время не хотелось бы. А возможность разделения ролей или создание своих присутствует? 11:29:53 11:30:11 да, есть разделение по ролям 11:30:31 в рамках роли можно либо разрешить править все записи в модуле, либо только свои, либо не править вовсе 11:30:59 с видимостью записей тоже самое 11:31:03 чтобы не видел чужие 11:31:29 только тут вот особенность. под "Своей" подразумевается задача, за которую ответственный текущий пользователь 11:31:51 если клиент назначил кому то задачу, то он сделал ответственным другого пользователя, и сам теряет доступ к этой задаче и не может отслеживать ее статус? 11:32:13 11:32:28 можно хотя немного "допилить" систему, чтобы под "своей" записью подразумевалось кто поставил задачу и кто ответственный за нее 11:33:06 не, статус может отслеживать 11:33:15 например можно сделать, что видит все заявки 11:33:19 но править может только свои 11:33:31 но тогда будет видеть и все заявки других клиентов вот смотрите, я - недовольный клиент, мне не нравится как меня обслужили. Я являясь пользователем этой crm ставлю задачу исполнителю - доделать такой то глюк и назначаю на него. Исполнитель сделал и ставит статус - "Сделано", но я как заказчик недоволен исходом этой правки и опять этой же задаче хочу поставить статус "Не сделано". Возможен такой сценарий? 11:35:57 11:36:42 да 11:36:48 и причем кучей разных способов 11:37:08 от бесплатных но менее удобных до более удобных и доработанных в коде 11:37:37 например когда клиент не доволен и делаю заявку я сразу назначаю исполнителя 11:37:45 у исполнителя в его задачах эта появляется 11:38:02 он по ней отрабатывает и пишет что все. и ответственным за задачу ставит того, кто создал задачу 11:38:13 она возвращается постановщику. он за нее ответственный и видит ее 11:38:16 ему не нравится 11:38:30 он пишет комментарий и опять делает ответственным исполнителя 11:38:40 исполнителю опять эта задача прилетает 11:38:53 и так они могут футболить задачу пока не достигнут дзена 11:39:12 а как все- постановщик ее закрывает и задача улетает в архив вот, то что нужно) 11:39:26 и еще вопрос, последний 11:39:45 например нужны роли 1. Супер Админ, который все может 2. Заявитель 3 Исполнитель. С этими тремя понятно. Но нужен 4ый - менеджер, который просто следит за процессом и смотрит, как исполнитель обслуживает его(менеджера) клиентов, наверное ему должны быть доступны все заявки, может быть даже их редактирование, но согласитесь права супер админа ему давать тоже не дело. 11:42:41 11:43:05 да, можно 11:43:15 сделать роль, которая будет видеть все, но ничего не удалять и не править 11:43:18 без супер-прав 11:44:16 смотрите: роль позволяет для каждого модуля настроить действия: создание/редактирование + просмотр карточки + просмотр в списчке + удаление + импорт + экспорт + массовое обновление 11:44:47 каждое из этих действий можно настроить чтобы был к ним доступ: 1 - к любым записям 2 - вообще не было доступа 3 - к "своим" записям 11:44:53 ну и еще по группам Тоесть можно создавать свои любые роли и гибко настраивать их возможности? 11:45:04 подождите, а модуль - что за сущность? 11:45:17 11:45:24 ну на сколько гибко это конечно понятие относительное... 11:45:33 зачастую гибкости не хватает 11:45:39 но пока из услышанного да, можно 11:45:48 Задачи - это модуль 11:45:55 содержит список записей с задачами а - понятно 11:45:59 тоесть все это можно сделать при помощи стандартных средств - верно? пусть и не крайне удобно, но зато ничего не допиливая 11:46:38 11:46:43 ну по сути пока да ну, все, что я перечислил 11:47:00 пока нам нужно только это, но я думаю мы будем в дальнейшем работать с этой crm. А вы я так понимаю специализируетесь и предлагаете услуги по доработке под дополнительные нужды? 11:48:05 11:48:19 да 11:48:45 SugarCRM/SuiteCRM по сути просто основа с некоторым функционалом, который можно заточить под любой вид деятельности 11:48:52 там только базовые основы и нет как правило специфики 11:48:57 ее я и дописываю понятно, я буду иметь вас в виду. Может быть где то есть прайс? 11:49:47 или каждый раз цена обсуждается в зависимости от задачи 11:50:02 11:50:11 каждый раз обсуждается 11:50:26 это же не товар с фиксированной стоимостью и сроком изготовления... 11:50:35 фиксирована только цена моих услуг = 1500 рублей час согласен 11:50:35 11:50:39 от нее и пляшу понятно, спасибо Евгений 11:51:24 кстати не подскажете какой нибудь гайд по работе? 11:51:50 лучше всего с постановкой задач 11:51:58 даже приемущественно 11:52:11 11:52:44 нет, не подскажу к сожалению 11:53:05 в планах его создать... но это пока планы... времени не хватает понятно, спасибо, всего доброго 11:54:15 11:54:53 спасибо! хорошего дня! нашел мануал, может быть в качестве ликбеза вам будет удобно раздавать своим клиентам http://www.call-center.su/call-center/crm/SugarCRM_manual.pdf 11:58:51 11:59:17 да, был такой 11:59:29 это они дернули из SugarCRM 11:59:39 он не актуальный, но в целом основные вещи отражает 11:59:41 спасибо что, сильно не актуальный?) своё то я там найду? 12:00:13 12:00:22 да, найдете!
  22. Подскажите, пожалуйста, как в формах списка добавлять дополнительные условия вывода записей. Например, выводить только записи, содержащие значение false кастомного поля Client в модуле Accounts. Нужно это сделать непременно в форме, а не в поиске, т.к. этот фильтр должен работать всегда и никто его не смог отключить.
  23. Для удобства работы, можно объединить по названию. Например, добавив к полю префикс: apt_area_common, apt_area_kitchen , и т.д. И расположить их на отдельной панели (или вкладке) в формах edit и view в студии.
  24. Не могу до конца понять логику смежных полей в модуле Контрагентов: Фактический адрес и Отгрузочный адрес Как они вообще определены в системе и как создать свой набор полей? к примеру Площадь квартиры и три поля: 1 - Общая (common), 2 - Жилая (resedential), 3 - Кухня (kitchen) чтобы можно было по этим полям производить поиск
  25. Хорошо бы сделать небольшой гайд по Хукам и как их можно использовать в различных применениях
  26. В 99% случаев при добавлении полей приходится так делать. А что если не удалять поля, а, к примеру, записывать в них сгенерированые значения перед сохранением в базу? Тогда отпадает вопрос что делать с ненужными полями по-умолчанию. Это тогда в каком месте движка надо смотреть чтобы такую функцию реализовать? Помнится в видео было что-то подобное, когда Вы рассказывали про генерацию имени на лету на основе данных соседних полей.
  1. Load more activity