Я веду проекты в Weeek и недавно поймал себя на том, что трачу кучу времени на рутину. Когда проект завершён, мне нужно выставить счёт и акт по выполненным задачам. Раньше я открывал доску, смотрел завершённые таски в колонке, вручную копировал их в документ, пересчитывал сумму. Короче, времени уходило много.
Как устроен мой процесс в Weeek
Таск в Weeek привязан к организации. Когда работа закончена, я перетаскиваю карточку в определённую колонку на доске. Это сигнал, что по ним пора выставлять счёт. Логика простая: взять все задачи из этой колонки для конкретной организации, посчитать сумму, сформировать документы.
Что я сделал
Написал клиент для работы с API Weeek на PHP. Внутри обычный класс, который ходит по эндпоинтам через Guzzle, логирует ошибки через Monolog и возвращает данные в удобном виде.
Логика получилась такой:
- По идентификатору организации запрашиваю её таски через API.
- Фильтрую те, что лежат в колонке завершённых.
- Собираю из них список для документов: название, стоимость, сроки.
- Формирую счёт и акт, вписываю перечень задач, считаю итог.
- Генерирую документы в PDF и скачиваю для подписания.
Теперь выбираю организацию, нажимаю кнопку, и через пару секунд скачиваю готовый счёт и акт.
Что под капотом
Писал с прицелом на то, чтобы потом это можно было поддерживать и расширять:
- GuzzleHttp для запросов к Weeek API. Не хотелось писать простыни с
curl_setopt, поэтому взял готовый клиент. - Monolog пишет в файл все запросы и ошибки. Если что-то не сработало, сразу видно в логах, что именно ушло и что вернулось.
- Composer + PSR-4: класс лежит в отдельном пространстве имён, подключается через автозагрузчик. Никаких
requireпо всему проекту. - Токен в
.env: ключи доступа не лежат в коде, читаются из окружения.
А вот так можно потрогать сниппетом в MODX
require_once MODX_BASE_PATH . 'vendor/autoload.php';
// Получение ключа API
$dotenv = Dotenv\Dotenv::createImmutable(MODX_BASE_PATH);
$dotenv->load();
// Подключение к API weeek
$weeek = new Crmweeek\Weeek ($_ENV['W_KEY']);
// print_r($weeek->get('user',['object'=>'me']));
// Получени доски
print_r($weeek->get('tm',['object'=>'boards','query'=>['projectId'=>2]]));
// Получение колонки
print_r($weeek->get('tm',['object'=>'board-columns','query'=>['boardId'=>15]]));
// Получение такска
print_r($weeek->get('tm',['object'=>'tasks','query'=>['boardColumnId'=>51]]));
// Получение организации
print_r($weeek->get('crm',['object'=>'organizations']));
//Создание организации
print_r($weeek->post('crm',[
'object'=>'organizations',
'data' =>[
'name' => 'ООО Ромашка',
'addresses' => ['г. Москва, ул. Ленина, 1'],
'emails' => ['test@example.com'],
'phones' => ['+79001234567']]
]));
Результат
Процесс, который занимал двадцать минут на организацию, теперь занимает секунд десять. Я больше не копирую данные вручную, не считаю сумму в калькуляторе, не боюсь забыть какой-нибудь таск. Всё, что лежит в колонке завершённых, автоматически попадает в документы.