Удаление компании затрагивает десятки зависимостей: пользователей, приглашения, заказы, файлы, токены, отчеты и данные внешних сервисов.

Ниже — практический порядок проверки. Он помогает сначала локализовать источник сбоя, затем внести минимальное изменение и проверить результат на реальном сценарии.

Как проявляется проблема

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

Что проверить в первую очередь

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

Основные причины

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

  • Удаляется только строка организации без каскада или задания очистки.
  • Пользователь может состоять в нескольких компаниях, но membership не обработан.
  • Файлы и поисковый индекс хранятся вне основной базы.
  • Soft delete скрывает данные, но токены и фоновые задания остаются активными.

Пошаговая диагностика

  • Постройте карту таблиц и внешних хранилищ по organization_id.
  • Проверьте memberships, активные сессии, API-токены и приглашения.
  • Найдите файлы, индексы, кеши, очереди и резервные сроки хранения.
  • Запустите очистку на тестовой компании и сформируйте отчет об остатках.

Как исправить

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

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

Как проверить результат

  • Удаленная компания недоступна через UI, API и прямые ссылки.
  • Повторный запуск задачи не падает и не затрагивает другие tenant.
  • Повторите исходный проблемный сценарий и минимум один пограничный случай.
  • Проверьте логи после исправления: отсутствие ошибки в интерфейсе еще не гарантирует корректную обработку.
  • Убедитесь, что правка не нарушила соседние операции, права других ролей и повторную обработку события.

Чего не стоит делать

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

Как не допустить повторения

  • Требуйте organization_id во всех tenant-данных.
  • Регулярно проверяйте записи-сироты и документируйте сроки хранения.

Что подготовить для разбора

  • Ссылку на проблемную страницу, метод API, задание, отчет или интеграцию.
  • Точное описание ожидаемого и фактического результата без секретных ключей и паролей.
  • Фрагмент лога за нужный период, идентификатор операции и пример входных данных.
  • Список последних изменений и информацию о рабочем окружении.

Частые вопросы

Можно ли исправить проблему без полной переделки?

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

Почему ошибка появляется не у всех?

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

Итог

Безопасное удаление компании должно быть наблюдаемым процессом с отчетом, а не одиночным DELETE.

Если самостоятельно локализовать причину не получилось, я могу разобрать логи и код, воспроизвести ошибку, предложить безопасную правку и проверить ее на рабочем сценарии.