AI и автоматизация

Автоматизация учета времени и задач в CRM: Обновление Automata CRM

Автоматизация учета времени и задач в CRM: Обновление Automata CRM

Structured Answer: Автоматизация учета времени и задач в CRM на базе Markdown (Obsidian) достигается за счет переноса всех задач в единую директорию 30_Tasks/ в виде структурированных файлов с YAML-метаданными, интеграции интерактивного дашборда Матрицы Эйзенхауэра с поддержкой прямых ссылок obsidian://open и связки с API Точка Банка. Это позволяет автоматизировать рутину биллинга: система самостоятельно считывает закрытые часы, сопоставляет их с тарифными лимитами клиентов из карточек 10_Clients/ и автоматически генерирует счета и акты выполненных работ без ручного вмешательства разработчика.

Кратко:

  • Единый источник истины: все задачи перенесены из разрозненных папок проектов в общую директорию 30_Tasks/ в Obsidian.
  • Матрица Эйзенхауэра: интерактивный дашборд визуализирует приоритеты, а клик по задаче мгновенно открывает её в Obsidian по протоколу URI.
  • Умные воркфлоу: глобальные команды /create_task и /close_task позволяют создавать и закрывать задачи из любого терминала с автоматической проверкой лимитов поддержки.
  • API Точка Банка: система сравнивает отработанные часы с тарифом и автоматически выставляет счета на доплату за овертайм.

Содержание

  1. Введение: Проблема фрагментации данных
  2. Для кого эта статья
  3. Новая архитектура: Единый Markdown-архив задач
  4. Интерактивный дашборд и Матрица Эйзенхауэра
  5. Интеграция с API Точка Банка и автоматический биллинг
  6. Глобальные воркфлоу разработчика и ИИ-агентов
  7. Техническая реализация и примеры кода
  8. Пошаговый сценарий жизненного цикла задачи
  9. Частые проблемы и методы их решения
  10. Когда обратиться к специалисту
  11. Итоги внедрения обновлений

1. Введение: Проблема фрагментации данных

Ведение IT-бизнеса, особенно в формате фриланса или небольшого digital-агентства, всегда упирается в одну и ту же проблему — рутину учета времени и выставления счетов. В моей практике, когда я администрировал клиентские сайты на 1С-Битрикс и Аспро, данные о задачах были разбросаны.

Часть информации находилась в файлах tasks.md в папках конкретных проектов в Git (GITACTIVE/), часть — в файлах timesheet.yml. Это приводило к постоянной путанице:

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

Чтобы решить эту проблему раз и навсегда, я провел глобальное обновление Automata CRM. Мы полностью переработали логику учета времени, объединили задачи в единую базу данных Markdown, связали дашборд с Obsidian через глубокие ссылки и подключили API Точка Банка для автовыставления счетов.


2. Для кого эта статья

Данное руководство ориентировано на следующие группы специалистов:

  • Веб-разработчики и фрилансеры (особенно работающие в крупных городах, таких как Москва, Санкт-Петербург, Нижний Новгород и других регионах России), которые хотят избавиться от рутины ручного тайм-трекинга.
  • Руководители небольших IT-студий и digital-агентств, использующие Obsidian или другие локальные plain-text базы знаний для ведения проектов.
  • Специалисты по автоматизации процессов, изучающие интеграцию локальных ИИ-агентов (например, на базе SDK Antigravity) с банковскими REST API.

Уровень сложности материала: продвинутый. Требуются базовые знания Python, понимание формата YAML, протоколов URI и принципов работы с REST API.


3. Новая архитектура: Единый Markdown-архив задач

Главный архитектурный сдвиг обновления — полный отказ от локальных файлов tasks.md внутри репозиториев проектов. Теперь все задачи хранятся в единой системной папке CRM: 30_Tasks/ в Obsidian.

Каждая задача — это атомарный Markdown-файл, имя которого является уникальным идентификатором (например, 20260603-1020-synch-tochka-api.md). Метаданные задачи описываются в стандартном формате YAML frontmatter.

Вот как выглядит структура метаданных новой задачи:

---
type: task
status: todo
client: "[[ИП Иванов]]"
created: 2026-06-03
date_completed: ""
hours: 0
invoice: ""
tags:
  - task
  - crm-update
  - urgent
  - important
---
# Описание задачи
Необходимо протестировать подключение к тестовой среде API Точка Банка...

Преимущества единого хранилища:

  1. Отсутствие дублирования: Задачи больше не теряются в разных Git-ветках и папках.
  2. Связи документов (Backlinks): Ссылка на клиента вида [[ИП Иванов]] позволяет Obsidian автоматически связывать карточку клиента с историей его задач.
  3. Простота парсинга: Скрипты автоматизации считывают одну папку 30_Tasks/, а не сканируют всю файловую систему.

4. Интерактивный дашборд и Матрица Эйзенхауэра

Для визуализации приоритетов используется дашборд, построенный по принципу Матрицы Эйзенхауэра. Задачи распределяются по четырем квадрантам на основе тегов #urgent (срочно) и #important (важно):

  • Q1 (Срочно и Важно): Требует немедленного внимания. Теги: urgent + important.
  • Q2 (Несрочно, но Важно): Задачи стратегического развития. Тег: important (без urgent).
  • Q3 (Срочно, но Неважно): Операционка, которую можно делегировать. Тег: urgent (без important).
  • Q4 (Несрочно и Неважно): Рутина и «пожиратели времени». Нет тегов приоритета.

Схема работы интерактивного дашборда выглядит следующим образом:

┌─────────────────┐       ┌───────────────────────────┐       ┌──────────────────┐
│  Файлы задач    │ ────> │  extract_dashboard_data   │ ────> │ HTML-дашборд     │
│  в 30_Tasks/*.md│       │  (сборка матрицы по тегам)│       │ в Obsidian       │
└─────────────────┘       └───────────────────────────┘       └────────┬─────────┘

                                                                       │ клик по задаче

                                                              ┌──────────────────┐
                                                              │ obsidian://open  │
                                                              │ (открытие файла) │
                                                              └──────────────────┘

Главное новшество визуализации — интеграция протокола Obsidian URI. Каждая строчка задачи на интерактивном HTML-дашборде генерируется как ссылка:

obsidian://open?vault=CRM-Vault&file=30_Tasks%2F20260603-1020-synch-tochka-api.md

При клике на задачу в браузере или встроенном фрейме Obsidian автоматически разворачивает нужное окно приложения и открывает заметку для редактирования. Это создает бесшовный опыт взаимодействия с локальной базой данных.


5. Интеграция с API Точка Банка и автоматический биллинг

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

В Automata CRM эта процедура теперь полностью автоматизирована. Процесс состоит из следующих шагов:

ЭтапДействие системыОписание
1. Анализ лимитовЧтение карточки клиента 10_Clients/[Имя].mdИзвлечение параметров тарифа, например support_plan: support_3h
2. Сбор отработанных часовСканирование закрытых задач в 30_Tasks/Фильтрация задач со статусом done за текущий месяц и суммирование hours
3. Проверка превышенияВычисление разницыСравнение отработанных часов с лимитом тарифа
4. Запрос к API ТочкиREST-запрос к банкуГенерация ссылки на оплату (СБП или платежное поручение)
5. Фиксация счетаОбновление YAML-метаданных задачиЗапись ссылки на оплату в поле invoice и отправка клиенту в Telegram

Для выполнения сетевых запросов к банку используется защищенное соединение через API Точки.

⚠️ Важно: API Точка Банка требует авторизации по токену и часто накладывает ограничения по гео-IP. Убедитесь, что ваш сервер или скрипты имеют статический IP-адрес, внесенный в белый список банка, или настройте корректную маршрутизацию трафика.


6. Глобальные воркфлоу разработчика и ИИ-агентов

Чтобы автоматизация работала стабильно, ИИ-агенты и сам разработчик должны взаимодействовать с CRM по строгим регламентам. Для этого в директории .agent/workflows/ были созданы два интерактивных скрипта-инструкции:

  1. /create_task — создание новой задачи.
  2. /close_task — фиксация затраченного времени и закрытие задачи.

Специфика этих воркфлоу в том, что они работают глобально. Находясь в терминале любого клиентского проекта (например, работая над кодом сайта интернет-магазина), разработчик или агент запускают команду, а CRM самостоятельно находит нужного клиента и проверяет баланс лимитов поддержки.

Интерактивный диалог при создании задачи:

Когда агент активирует воркфлоу /create_task, он не просто молча создает файл. Он выполняет валидацию данных:

  1. Запрашивает имя клиента.
  2. Ищет карточку клиента в 10_Clients/.
  3. Подтягивает лимит часов по договору и количество уже израсходованных часов в текущем месяце.
  4. Если лимит на исходе (например, осталось 0.1 часа из 3-х тарифных часов), агент выдает предупреждение:

💡 Предупреждение ИИ-агента: У клиента ИП Иванов лимит поддержки: 3 часа. В текущем месяце уже потрачено 2.9 часа. Данная задача с высокой вероятностью превысит лимит. Продолжить создание задачи с биллингом за пределами тарифа? (Да/Нет)

После подтверждения задача создается и помечается соответствующими тегами.


7. Техническая реализация и примеры кода

Для демонстрации логики автоматизации ниже приведен фрагмент скрипта на Python, который выполняет сверку закрытых часов и формирует реестр овертайма.

import os
import re
import yaml
from datetime import datetime

# Пути к CRM
VAULT_PATH = "/home/evgen/Документы/ObsidianVault-CRM/AUTOMATA-CRM"
TASKS_DIR = os.path.join(VAULT_PATH, "30_Tasks")
CLIENTS_DIR = os.path.join(VAULT_PATH, "10_Clients")

def get_client_limit(client_name):
    """Извлекает лимит часов из карточки клиента"""
    client_file = os.path.join(CLIENTS_DIR, f"{client_name}.md")
    if not os.path.exists(client_file):
        return 0.0  # По умолчанию поддержки нет
    
    with open(client_file, 'r', encoding='utf-8') as f:
        content = f.read()
        
    # Парсим YAML frontmatter
    match = re.match(r'^---\s*\n(.*?)\n---\s*\n', content, re.DOTALL)
    if match:
        data = yaml.safe_load(match.group(1))
        # Извлекаем тариф (например, support_3h -> 3.0 часа)
        plan = data.get("support_plan", "none")
        hours_match = re.search(r'(\d+)h', plan)
        if hours_match:
            return float(hours_match.group(1))
    return 0.0

def calculate_monthly_hours(client_name, year_month):
    """Суммирует закрытые часы за указанный месяц"""
    total_hours = 0.0
    for filename in os.listdir(TASKS_DIR):
        if not filename.endswith(".md"):
            continue
        
        filepath = os.path.join(TASKS_DIR, filename)
        with open(filepath, 'r', encoding='utf-8') as f:
            content = f.read()
            
        match = re.match(r'^---\s*\n(.*?)\n---\s*\n', content, re.DOTALL)
        if not match:
            continue
            
        data = yaml.safe_load(match.group(1))
        
        # Сверяем клиента и статус задачи
        is_client = data.get("client") == f"[[{client_name}]]"
        is_done = data.get("status") == "done"
        date_completed = data.get("date_completed") or ""
        
        if is_client and is_done and date_completed.startswith(year_month):
            total_hours += float(data.get("hours", 0))
            
    return total_hours

# Пример работы скрипта
client = "ИП Иванов"
current_month = datetime.now().strftime("%Y-%m")
limit = get_client_limit(client)
spent = calculate_monthly_hours(client, current_month)

print(f"Клиент: {client}")
print(f"Лимит по тарифу: {limit} ч.")
print(f"Израсходовано в {current_month}: {spent} ч.")
if spent > limit:
    print(f"⚠️ Внимание! Превышение лимита на {spent - limit:.2f} ч. Запуск генерации счета через API Точки...")
else:
    print(f"✅ Лимит не превышен. Доступный остаток: {limit - spent:.2f} ч.")

Этот скрипт запускается по расписанию (cron) в конце каждого отчетного периода, автоматически выявляя должников и формируя реестры для бухгалтерии.


8. Пошаговый сценарий жизненного цикла задачи

Рассмотрим практический кейс: клиент запрашивает исправление бага в каталоге товаров интернет-магазина.

  1. Инициация: Разработчик в терминале проекта запускает глобальный воркфлоу:
    /create_task
  2. Интерактивный опрос: Агент запрашивает детали. Разработчик вводит описание: “Исправить дублирование артикулов при импорте из 1С”. Указывает клиента: “ИП Иванов”.
  3. Проверка лимита: Агент считывает карточку клиента, видит, что лимит уже исчерпан, запрашивает подтверждение на переработку и, получив его, создает файл 30_Tasks/20260603-1100-fix-1c-import.md с тегом #urgent и #important.
  4. Выполнение: Задача попадает в первый квадрант (Q1) интерактивного дашборда. Разработчик видит ее на канбане Obsidian, кликает по ссылке, открывает файл и приступает к работе.
  5. Завершение: После фиксации багов разработчик выполняет команду закрытия:
    /close_task
    Агент запрашивает затраченное время. Разработчик указывает: 1.5 (полтора часа). Статус меняется на done, поле date_completed заполняется датой 2026-06-03.
  6. Автоматический биллинг: Скрипт сверки видит овертайм в размере 1.5 часов, отправляет запрос в API Точка Банка, получает уникальный QR-код СБП на сумму 1.5 * 3500 ₽ = 5250 ₽, записывает ссылку в поле invoice задачи и отправляет уведомление клиенту.

9. Частые проблемы и методы их решения

При работе с локальными CRM-системами на базе файлов неизбежно возникают технические накладки. Ниже приведены наиболее частые из них и способы решения.

Проблема 1: Конфликты синхронизации файлов Syncthing

  • Причина: Одновременное редактирование задачи на мобильном устройстве (например, в Obsidian Mobile) и на рабочем компьютере.
  • Симптомы: Появление дублирующих файлов с постфиксом .sync-conflict-....
  • Решение: Настроить Git-интеграцию для автокоммитов изменений в CRM-сейфе или регулярно запускать скрипт-клинер, который сравнивает метаданные конфликтующих файлов, объединяет текстовое содержимое и удаляет дубликаты.

Проблема 2: Разрыв VPN-туннеля при запросах к API Точка Банка

  • Причина: Системы безопасности банка блокируют запросы из зарубежных хостингов или динамических IP.
  • Симптомы: Ошибки соединения Connection Timeout или 403 Forbidden.
  • Решение: Использовать локальный прокси-сервер на территории РФ с фиксированным белым IP, через который направлять исключительно запросы к поддоменам банка, прописав правила маршрутизации в системе:
    ip route add 5.129.252.24 dev eth0

10. Когда обратиться к специалисту

Несмотря на кажущуюся простоту plain-text файлов, построение надежной RAG-системы и интеграция банковских API требуют высокой технической квалификации. Вам может потребоваться помощь эксперта, если:

  • Вам необходимо настроить сложную ролевую модель доступа (чтобы сотрудники видели только свои задачи, хотя все файлы лежат в одной папке).
  • Требуется связать Obsidian с государственными сервисами (например, чеки самозанятых через сервис «Мой Налог»).
  • Вы хотите внедрить локальную LLM-модель (Llama-3 / Qwen-Coder) для автономной разметки задач без отправки конфиденциальных данных в облако.

Если перед вами стоят подобные задачи — напишите мне. Я специализируюсь на создании кастомных AI-агентов и интеграции Obsidian с бизнес-системами.


11. Итоги внедрения обновлений

Внедрение единой системы учета задач позволило полностью оцифровать операционную деятельность и избавиться от кассовых разрывов.

Сравнительные показатели эффективности:

МетрикаДо обновленияПосле обновления
Время на учет задач4-5 часов в неделю10 минут в неделю (автозаполнение)
Забытые / неоплаченные часыДо 15% от общего объема0% (система не даст закрыть без биллинга)
Скорость выставления счета1-3 дня после окончания месяца5 секунд (сразу после закрытия лимита)
Риск блокировки данныхСредний (зависимость от облачной CRM)Нулевой (локальные файлы Markdown)

Ключевые преимущества нового подхода:

  • Полный суверенитет данных: файлы CRM физически принадлежат владельцу бизнеса.
  • Экономия бюджета: отсутствие ежемесячных платежей за CRM-платформу.
  • Высокая скорость: локальные скрипты парсинга работают в десятки раз быстрее тяжелых облачных API.

Если вы хотите оптимизировать свой бизнес и перевести рутину на автопилот — начните с малого: структурируйте свои папки задач и попробуйте автоматизировать хотя бы одну простую операцию. Будущее уже здесь, и оно написано на простом Markdown.


Ищете готовые решения по автоматизации процессов или интеграции с API? Я помогаю компаниям проектировать умные CRM-системы, интегрировать ИИ-помощников и настраивать надежные сквозные интеграции. Свяжитесь со мной, чтобы обсудить детали вашего проекта и повысить эффективность бизнеса.

🚀 Нужна помощь с сайтом на 1С-Битрикс или Аспро?

Я работаю удалённо по всей России и СНГ. Узнайте цены и условия для вашего города:

Все регионы →