Разработка сайтов и интернет-магазинов Блог веб-разработчика

Автоматизация выставления счетов через Weeek API

Изображение сгенерированно ИИ и принадлежит qwen.ai
Изображение сгенерированно ИИ и принадлежит qwen.ai

Я веду проекты в Weeek и недавно поймал себя на том, что трачу кучу времени на рутину. Когда проект завершён, мне нужно выставить счёт и акт по выполненным задачам. Раньше я открывал доску, смотрел завершённые таски в колонке, вручную копировал их в документ, пересчитывал сумму. Короче, времени уходило много.

Как устроен мой процесс в Weeek

Таск в Weeek привязан к организации. Когда работа закончена, я перетаскиваю карточку в определённую колонку на доске. Это сигнал, что по ним пора выставлять счёт. Логика простая: взять все задачи из этой колонки для конкретной организации, посчитать сумму, сформировать документы.

Что я сделал

Написал клиент для работы с API Weeek на PHP. Внутри обычный класс, который ходит по эндпоинтам через Guzzle, логирует ошибки через Monolog и возвращает данные в удобном виде.

Логика получилась такой:

  1. По идентификатору организации запрашиваю её таски через API.
  2. Фильтрую те, что лежат в колонке завершённых.
  3. Собираю из них список для документов: название, стоимость, сроки.
  4. Формирую счёт и акт, вписываю перечень задач, считаю итог.
  5. Генерирую документы в 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']]
]));

Результат

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

Теги:

❗️ Код и технические решения в блоге — это исключительно субъективное мнение автора, предоставленное по принципу «как есть» (AS IS) в ознакомительных целях. Не является готовым продуктом или призывом к действию. Автор не гарантирует работоспособность и безопасность кода в вашем окружении. Вы обязаны самостоятельно тестировать решения перед использованием в продакшене. Автор снимает с себя любую ответственность за потерю данных, сбои систем, уязвимости, финансовые убытки или любые другие последствия, возникшие из-за применения материалов блога.

Обсудим вашу задачу и рассчитаем стоимость?

Отвечаю лично в течение пары часов. Никакого спама и автоматических рассылок.