пятница, 2 октября 2020 г.

Битрикс24 КП. CRM. Как сделать своё правило для обработки писем?

Самая главная проблема КП в том, что проще приспособиться к его алгоритму работы, чем реализовать что-то своё нестандартное )))

Теория, алгоритм

Добавим почтовый ящик с помощью новенького модуля Почта, ссылочку на него можно найти в левом основном меню морды. Не забудем также отметить галочку Связать с CRM, чтобы посмотреть как работает текущий алгоритм и чтобы проверять "наживую".

Теперь потестируем и попопробуем понять как битрикс обрабатывает письма и создаёт Лиды:
1. получается письмо с почтового ящика
2. емейл отправителя этого письма ищется в Контакте, Компании, в Лидах
3. если найден в Компании/Контакте, то ищется Сделка  и... дальше нам пока неинтересно ))) более всего мне интересно было, как создаётся/меняется Лид
4. если найден незакрытый Лид, то письмо (вернее Дело) прикрепляется туда
если Лид в закрытом статусе - то создаётся Повторный Лид
5. ну и если такого емейла не было найдено нигде, то просто создаётся новый Лид

Теперь сопоставляем с тем, как хочет клиент:
1. если найден незакрытый Лид, и письмо является частью цепочки общения из этого Лида, то письмо надо прикреплять к этому Лиду.
2. если письмо не является частью цепочки, то надо создавать новый Лид, а не лепить все письма от одного отправителя в один открытый Лид.

Когда такое нужно, спросите вы? А, например, когда у нас не КП для магазина, а система обработки Обращений в стиле техпода. А теперь подумаем:
* один отправитель может прислать два разных вопроса как на один support-емейл, так и на разные
* один Лид (в наших терминах он уже превратился в Обращение) может иметь в цепочке писем разных сотрудников техпода, обслуживающих этот Лид
* письма от обоих сотрудников техпода должны быть в одной цепочке писем этого Лида, также как и ответы исходного отправителя вопроса
* отправитель может параллельно прислать другой вопрос, и это будет другой Лид, потому что это не ответ на предыдущее письмо от менеджера

Как это сделано

Для получения правил обработки писем модуль Почта использует CMailFilter:: GetFilterList. В этом же методе находится событие OnGetFilterList модуля mail
По коду метода можно увидеть, что возвращаемый массив из вашего обработчика этого события будет подмешан в существующий массив правил из ядра Битрикс и возвращён в качестве результата работы метода CMailFilter:: GetFilterList.

Модуль Почта добавляет туда одно imap правило

То есть непосредственно метод ядра imapEmailMessageAdd и осуществляет распределение по указанному правилу. Данное правило привязано к нашему почтовому ящику, что можно увидеть 
в Администрирование -- Сервисы -- Почта -- Правила. Однаком сменить эту привязку через интерфейс не получается, ибо интерфейс, кажется, работает только с pop3-правилами и ящиками.

DIY

Делай раз. Добавим в список доступных правил свой обработчик, повторяя то, как сделано добавление правила в родном обработчике Битрикс, чтобы далее пытаться его использовать.

Делай два. Из-за невозможности адекватного изменения правил через админку - мы приходим к непосредственному использованию API. Для получения всех почтовых ящиков в системе можно использовать \Bitrix\Mail\MailboxTable, а для работы с привязками правил - \Bitrix\Mail\MailFilterTable
Добавляем к своему ящику новоиспечённое правило.

1. Наше правило должно быть выше остальных для нашего ящика. То есть сортировка должна быть меньше, чем у нижестоящих правил. Ну или можно удалить все остальные правила вообще.
2. Если сохраняете другие правила - полезно поставить ACTION_STOP_EXEC в Y, чтобы последующие правила не выполнялись. Но это, конечно, если вы хотите полностью переделать битриксовый алгоритм работы.

Делай три. Самое "интересное" в данном деле - это разобраться как работает родной метод обработки писем; к сожалению, оставлю это на ваше усмотрение (мой код принадлежит организации, в которой я работаю). Разве что подскажу, что для выполнения описанного выше алгоритма для формирования Обращений полезно будет обратить своё внимание на переменную $forceNewLead внутри родного метода CCrmEmail::imapEmailMessageAdd.

Удачи вам в ваших свершениях!

P.S. Большое спасибо за помощь в освоении данной темы хочу выразить Рыкову Ивану, который дал мне начальный пинок "куда смотреть" )

четверг, 24 ноября 2016 г.

Битрикс и D7. Товары в Отгрузке.

Если честно, к Д7 у меня несколько неоднозначное отношение. В некоторых местах я попискиваю от восторга, а в некоторых хочется топать ногами и ругаться неприличными словами.
Однако, несмотря на, код становится чище и структурированнее, платформа дорабатывается и растёт.

Сегодняшняя задача такая: получить Отгрузки указанного Заказа и понять, какие Товары в каждой из этих Отгрузок.

понедельник, 6 июня 2016 г.

Не совсем Битрикс, но для него. Пакетная перекодировка файлов.

В очередной раз сокрушаясь, что модули надо писать в CP1251 (прошлый век, ну честное слово), а разрабатывать всё-таки удобнее в UTF-8, сделала я попытку найти перекодировщик, чтобы тыкнул и - бац - перекодировалось.
Ну ленивая я, чесслово, да и путать стала, где у меня CP1251, а где UTF-8.

Сегодня пакетно перекодируем файлы из UTF-8 в CP1251, но не все, а только те, которые надо. Разжёвано - дальше некуда, но я же не заставляю читать =)

Да, к слову, у нас уже давно весь офис посажен бесповоротно на убунту, так что я даже забыла как виндой пользоваться, и на домашний ноутбук тоже убунту поставила.
Из лени встроенной поискала что-нибудь с интерфейсом, потом поняла, что легче разобраться в баше и написать свои пару строчек.
Кажется, я всё-таки скоро отращу бороду и свитер.

вторник, 9 февраля 2016 г.

Jira REST API и Битрикс КП. Учимся разговаривать с Jira, синхронизация с Битрикс КП.

Как-то у нас исторически сложилось, что Менеджеры сидят в Битрикс КП, а Разработчики - в Jira. Менеджеры привыкли ставить и решать задачи через КП, Разработчики - через Джиру. Отсюда пришла мне крайне узкоспециализированная, но крайне интересная задача по частичной синхронизации Джиры и Битрикс КП.

Мне не разрешили выкладывать готовый код, но я могу описать здесь все проблемы, с которыми столкнулась.
Ахтунг! Букавмнога, очень многа!

Что требовалось:
  1. При создании задачи в КП, если отмечена галочка синхронизации, - создавать задачу и в Джире.
  2. Опять же, если отмечена галочка синхронизации, то стягивать потраченное время из задач Джиры в задачи КП.
  3. Для уже существующих задач в КП иметь возможность выставить задачу из Джиры ручками, чтобы синхронизовать время.
  4. Стягивание времени осуществляется по соответствующему агенту (у нас они естественно на кроне).
  5. Для уже существующих задач КП иметь возможность создавать задачу в Джире.

вторник, 15 сентября 2015 г.

PHP и Битрикс: Пошаговое выполнение процесса

Насколько нам известно, выполнение любого действия несколько тысяч раз может занимать приличное время.
1. пользователь любит прогресс-бары и счётчики
2. пользователь не любит, когда ничего не происходит
3. пользователь любит возможность остановить происходящее
4. времени на выполнение браузеру может тупо не хватить

Примеры таких задач в битриксе - импорт разнообразных типов, или, как это было у меня - удаление задач в КП по определённому условию. Запускаются такие процессы из браузера по желанию юзверя и должны выполняться, показывая текущий статус обработки.

Оставим оформительскую красоту для дизайнеров и реализуем счётчик и простенький прогресс-бар.

Сначала понимаем, что надо сделать на первом шаге, затем что на втором, и что на шаге n-1 и n. Находим точку повторения и точку окончания. Итого:

  1. на странице есть кнопка запуска, информационный блок со статистикой и js-обработчики: запуска процесса и обработки результата
  2. по клику на кнопке передаём номер шага (и/или другие необходимые параметры)
  3. ajax-приёмник обрабатывает шаг, формирует json с необходимой информацией для статуса и возвращает его вызывающей функции.
  4. функция обработки результата парсит инфу, выводит статус, решает, надо ли запускать следующий шаг и, соответственно, запускает следующий шаг или заканчивает работу процесса


Прогресс бар реализую с помощью тега progress. Управлять им очень просто:
* максимальное значение задаётся атрибутом max
* текущее значение задаётся атрибутом value
* можно управлять внешним видом с помощью стилей
* минус у него один - это HTML5 и не всеми он поддерживается. Но я показываю его для примера, так что можете реализовать прогресс-бар по старинке - на дивах =)

Json легко парсит функция JSON.parse, превращающая его в объект, с которым уже можно работать дальше.


Пошаговая заготовка из статьи

Дока по тегу progress
Дока по объекту JSON
И ещё про JSON для тех, кому совсем интересно

вторник, 7 июля 2015 г.

Битрикс. Похожие товары.

Как известно, формулировка "похожести" у каждого заказчика своя. В данном варианте от меня требовалось создать компонент, возвращающий айдишки продуктов, "похожих" по следующим условиям:
  1. цена хотя бы одного торгового предложения искомого продукта не должна отличаться более чем PRICE_INTERVAL от цены исходного продукта
  2. искомый продукт должен лежать в той же секции, что и исходный продукт

вторник, 30 июня 2015 г.

Битрикс и Инстаграм. Собираем фотки по хештегу для конкурса.

Устраивать конкурсы в инстаграме сейчас модно. И удобно. Инстаграм предоставляет достаточно обширный API, который позволяет делать практически всё, что может сделать обычный пользователь ручками.

Составляем в мозгу логику действий
1. Создание ИБ Конкурсов и ИБ Фоток для конкурсов.
2. Конкурсы создаются ручками операторов. Свойствами конкурсов являются Название, Активность, Время начала действия, Время окончания действия, Хештег, Описание, Результат, Разрешение работы скрипта.
3. Фотки получаются скриптом для конкурса методом обращения к Инстаграм API и сохраняются в базе (ссылки на фотки).


И если с первым и вторым пунктом справятся контент-менеджеры, то с третьим пунктом у них возникнут сложности. И тут на сцену выходит разработчик.


среда, 13 мая 2015 г.

Битрикс КП. Импорт задач из XLSX файла.

Ранее в одном из наших КП добавление задач обрабатывалось бизнес-процессами, сейчас задач стало столько, что бизнес-процессы стали неуместны, и понадобился инструмент для массовой заливки задач на КП.

Итак, есть xlsx файл со списком задач. Из него можно узнать
  • TITLE
  • DESCRIPTION
  • RESPONSIBLE_ID
  • CREATED_BY
  • START_DATE_PLAN
  • END_DATE_PLAN
а также можно вычислить GROUP_ID и несколько свойств, которые были добавлены к задачам.

Сегодня:
  • загружаем файл без перезагрузки страницы
  • обрабатываем xlsx файл с помощью сторонней библиотеки
  • добавляем свои свойства к задачам
  • добавляем задачи в базу КП по конкретным группам



среда, 1 апреля 2015 г.

Битрикс. Раздаём заказы нескольким операторам.

Пришла задача написать системку распределения заказов для операторов. Первоначальное задание:
1. Нужна страничка с одной кнопкой. Оператор нажимает эту кнопочку и получает заказ на обработку.
2. Оператор может:
  • Отказаться от заказа (например, не дозвонились пользователю). В этом случае заказ спит некоторое время, а потом возвращается.
  • Отменить заказ штатной кнопочкой Отменить - у нас это равносильно по смыслу удалению заказа (удалять заказы операторам нельзя)
  • Изменить статус заказа, чем снимает с себя обязательства по обработке заказа, закрывает заказ.
  • И пограничный случай - если заказ заблокирован кем-то ещё, то оператор может снять с себя этот заказ. Пример - создание тестовых заказов, которые обрабатываются непосредственно теми, кто тестирует. В этом случае заказ оператору может попасть, но будет перехвачен из реального списка тестировщиком.
После некоторых дебатов, было решено делать это всё отдельным модулем, чтобы удобнее дополнять, внедрять и весь код был в одном месте.

Версия модуля предварительная, доработок там требуется ещё с тонну. Код - жестокая смесь двух стилей - стандартного битриксового и D7. Где получалось - исправила на D7. Вообще, возможностей нового ядра пока чуток не хватает (про документацию лучше помолчу).
Итак, сегодня в статье микс из описаний использованных решений и самой схемы работы модуля.

среда, 10 декабря 2014 г.

Битрикс КП. Получаем список задач с комментариями.

Обожаю КП и задачи по нему, всегда находится место, где надо проводить целое исследование по коду или докам, чтобы понять как написать две строки нужного кода.

Задача на сегодня: быстренько написать инструмент, позволяющий получать отчёты, пригодные для чтения табличными редакторами. Инструмент должен содержать фильтр по социальным группам (к ним можно привязывать таски), период выбора задач (по дате создания задачи) и фильтр по статусу задачи.

воскресенье, 16 ноября 2014 г.

Битрикс. Компонент iblock.vote и кеширование.

Задача: написать модуль для внутреннего использования, который показывал бы список отзывов и позволял добавлять отзывы. Нет, это не очередной велосипед, просто там были свои специфические требования. Но сейчас мы говорим не про это.
При добавлении отзыва надо было давать возможность выставить оценку элементу каталога, для которого писался отзыв. Компонент iblock.vote вполне для этого подходил, только был чуток переписан, чтобы оценка добавлялась не при клике, а уже при добавлении отзыва.

Сами понимаете, что страница элемента каталога (использовался комплексный компонент) кешируется. Компонент добавления отзыва тоже. Итого, включённый в шаблон компонента добавления отзыва компонент iblock.vote - не работал нормально.

В процессе археологических раскопок было выяснено следующее:
1. при очищенном кеше компонент работает
2. при кешированной странице не подключаются стили и скрипты из шаблона компонента.

Из второго пункта было понятно, что нам надо было попробовать включать стили и скрипты отдельно. Включаем мы их в шаблоне catalog.element, причём в component_epilog.php

<?$APPLICATION->SetAdditionalCSS('path_to_template/style.css');?>
<?$APPLICATION->AddHeadScript('path_to_template/script.js');?>


Всё работает, можно танцевать.

вторник, 28 октября 2014 г.

Битрикс. Сбор карты секций для брендов.


В одном из дизайнов пришла страничка, где для бренда собираются показываются секции, подсекции и показываются счётчики.
В проекте используются инфоблоки версии два, для каждого города создан свой Тип ИБ, внутри которого уже и существуют каталоги, и внутри них соответственно секции и подсекции ИБ. Элементы могут находиться где угодно как на верхнем уровне, так и в секциях/подсекциях  (но не одновременно).
Помимо карты секций, у бренда должна быть возможность добавления описания, картинки, ссылки на официальный сайт и некоторых специфичных выключателей.

вторник, 26 августа 2014 г.

Битрикс КП. Запуск бизнес процессов для элементов универсального списка, добавленных через экспорт.

Проблема: при добавлении элементов универсального списка через систему экспорта csv не запускаются приписанные этому списку бизнес-процессы.
Техподы ответили, что проблему можно решить добавлением кода, который сразу после создания элементов определенных ИБ (массив должен быть редактируемым), будет проверять, если ли у текущего элемента запущенный экземпляр бизнес-процесса, если нет, то запускать бизнес-процесс. Вы можете использовать метод CBPDocument::StartWorkflow() в событии OnAfterIBlockElementAdd

Короче, проблему знаем, решите уж как-нибудь сами.

UPD: приведённое решение (и вы сами должны это понимать) не годится для закачек скажем более 50 элементов. продолжение следует...

пятница, 22 августа 2014 г.

Битрикс КП. Копирование универсальных списков и бизнес-процессов.

Прикатило мне очередное интересное задание от насяльникама. Необходимо написать инструмент, позволяющий копировать универсальные списки для социальных групп (без контента, только схему). А также и бизнес-процессы принадлежащие этому списку.
Хто здесь? 0_0
Прикинуться куском обоев не получилось, поэтому пришлось делать. И писать статью, иначе я всё забуду.

Сегодня на обсуждении:
  1. копирование универсальных списков для социальных групп
  2. копирование бизнес-процессов этих списков
Обсуждаемый инструмент можно найти в конце статьи. Правда, вы сами должны понимать, что за сотворённое вами с его помощью я ответственности не несу =)

Далее:
  • БП - бизнес-процесс
  • УС - универсальный список (в рамках статьи подразумеваются УС для социальных групп)
  • ИБ - инфоблок
  • КП - корпоративный портал
  • СГ - социальная группа

четверг, 24 апреля 2014 г.

Яндекс.Карты API. Расстояние от МКАД до указанной точки: увеличиваем точность.


Если вы потыкаете пример из прошлого поста про вычисление расстояния от МКАД, то увидите, что ближайшая точка - не всегда точка нужного съезда, и маршрут рисуется от неё. И как бы правильно мы не расставляли точки съездов, всегда найдётся неправильная точка, которая ближайшая к кликнутой точке, но не является нужным съездом.
Для приблизительных расчётов это нормально, но для пользователей это будет выглядеть некрасиво. А мы хотим вот так
маршрут от мкада (без развязок)


среда, 16 апреля 2014 г.

Яндекс.Карты API. Ищем расстояние от МКАД до указанной точки.

Думаю, что жители подмосковья часто сталкивались с ситуацией, когда за курьерскую доставку отдельно просят денюшку за каждый километр от мкада. Недавно встала задача хоть немного автоматизировать подсчёт расстояния "от мкада" до указанной точки. Причём не по прямой, а по маршруту следования машины. По дорогам то бишь.


Благодаря широким возможностям Yandex.maps API это сделать достаточно просто.

Итак, задача. Показать карту, дать возможность пользователю кликнуть по какому-либо месту на карте, посчитать расстояние от мкада до этой точки.
Главная проблема тут - найти ближайшую точку мкада. Автоматизировать это можно достаточно приблизительно, но нам и не нужна точность до метра.

Сегодня: рисуем Яндекс.карту; учимся рисовать на ней полигоны и метки; ищем ближайшие точки из списка объектов; составляем маршрут и считаем дистанцию между двумя точками.

Ссылки на примеры и доки в конце статьи.
UPD. Продолжение остросюжетного сериала по вычислению расстояний читайте в следующей статье:  Яндекс.Карты API. Расстояние от МКАД до указанной точки: улучшаем точность.

пятница, 10 января 2014 г.

Битрикс. Бизнес-процессы. PHP-код.

Недавно ко мне обратился насяльника с просьбой помочь в написании бизнес-процесса (далее в статье БП) для автоматической отсылки писем клиентам, у которых подходит срок оплаты хостинга.
Для полноценной работы с дизайнером шаблонов БП потребуется администраторский доступ к корп-порталу.
Все картинки в статье кликабельны, а ссылки открываются в новом окне.

вторник, 12 ноября 2013 г.

Битрикс. Зависимые по содержанию блоки.

Допустим, нам надо сделать блок в шаблоне сайта с содержанием, зависимым от того, где мы сейчас находимся и что показываем. Сформулируем более чёткие требования:
  1. На детальной странице новости мы показываем в требуемом блоке пару новостей из этого же раздела и с хотя бы с одним совпадением тегов из показываемой новости.
  2. Если совпадений нет, то просто показываем новости из того же раздела. Показываем новости из этого же раздела на странице списка новостей раздела.
  3. Если и сейчас не хватает - показываем любые из ИБ Новости.
  4. Не забыть про кеширование.
Кстати, сортировка рандомная.

Разговор сегодня будет долгий. Обсуждаем новые отложенные функции, которые почему-то в документации не рекомендуют использовать, а на курсах учили использовать. Также используем для своих вполне понятных целей встроенный класс кеширования, чтобы управлять кешированием нашего блока с помощью стандартных инструментов администрирования.

четверг, 31 октября 2013 г.

Битрикс. Фильтрация нецензурных слов при добавлении элемента ИБ.

Я как настоящий ленивый программист люблю готовые решения =) Битрикс часто мне их предоставляет, и не надо городить свои велосипеды с пятью квадратными колёсиками.
Итак, стоит задача при добавлении элемента инфоблока проверять содержимое поля DETAIL_TEXT на наличие нецензурных слов и заменять их звёздочками.
В принципе, это стандартная функциональность модуля Форум. Её и будем использовать.

Во мне ещё живы порывы нативщика писать свои несколько усложнённые решения, поэтому в данном случае я была несколько удивлена внешней простотой решения поставленной задачи.

1. В init.php на событие OnBeforeIBlockElementAdd вешаем функцию обработчик.
2. Подключаем модуль форум CModule::IncludeModule('forum')
3. Проверяем нужные поля методом CFilterUnquotableWords::Filter($arFields['DETAIL_TEXT']) Он возвращает уже отцензуренный текст, где слова, подходящие под его фильтры, заменены на звёздочку *.

четверг, 24 октября 2013 г.

Стиль кодинга. Что меня может вымораживать =)

Список того, что меня вымораживает. Это не пост для холиваров, это моё личное шизофреническое =) Периодически будет пополняться.

  1. Самое наверное затасканное. Фигурная скобка на той же строке, что и название функции/оператора. Это сильное имхо, но скобка должна быть на следующей строке. Возражения принимаются при личной встрече. Я объясню свой взгляд на эстетическое построение кода.
  2. При создании массива первая буква - большая. Для меня надо array(), а не Array(). В этом смысле код битрикса меня иногда просто пришибает на месте.
  3. Аналогично в битриксе меня вымораживает повсеместное использование альтернативного синтаксиса типа if endif. Наследие предков...
  4. Неотформатированный красиво код. Он же нечитабелен потом! Да и форматировать надо ОТСТУПАМИ, а не пробелами! У нас файл конфига в одном из проектов отформатирован пробелами. Убила бы, чесслово...
  5. Названия классов с маленькой буквы. Простите, но это уже просто неуважение. Всё равно что имя человека написать с маленькой буквы.
  6. Использование echo  в короткой записи. <? echo $ar; ?>. Если используете короткую запись - так используйте короткую! <?=$ar?>
  7. Использование фигурных скобок в однострочных условиях/циклах. В однострочных они неообязательны. Например
    foreach($ar as $key=>$value)
    {
      echo $value.' ';
    }
    Ну и нафига здесь фигурные скобки? Они только засоряют внешне код. Мне возражают, что мол программист если надо добавить ещё строку к циклу может просто подписать её под строкой, не заметив, что цикл однострочный, ибо фигурных скобок нет. Если код чётко отформатирован, то такого никогда не случится, поверьте мне.
  8. Неоткомментированный код. Простите, а вы сами читали, что у вас написано? =) А если через полгодика? А если ваш коллега успел добавить что-нибудь своё?
  9. Стопиццот вложений. Иф внутри ифа внутри цикла внутри ифа внутри ифа. Ну вы поняли. Вообще больше 4-5 уже считается плохим тоном и говнокодом. Да и просто - такой код относительно нечитабелен. Используйте return, continue и break =)
  10. Использование некорректных префиксов. Если уж написали $arResult, то будьте добры использовать эту переменую как массив, а не как булев переключатель. (В пункте номер 6 ничего не заметили?)