{{tag>dev Инвентаризация}} ====== Инвентаризация: DEV: Синхронизация ====== Механизм синхронихации между БД ==== Объекты ==== Хорошо бы иметь общую БД таких объектов как * Производители * Написание производителей * Типы оборудования * Модели оборудования * ПО * Типы лицензий * Схемы лицензирования * Контрагенты (надо убрать из них приватную часть) ==== Режимы синхронизации ==== === Направление === * Прием * передача * двусторонняя синхронизация === Создание/Обновление === * Добавление новых * обновление существующих * добавление+обновление ==== Регламент ==== * Вызываем какой-то консольный контроллер, передаем аргументами учетные данные от другой базы * Запрашиваем через API список объектов из другой базы * В зависимости от выставленных режимов * Добавляем/обновляем локальные * Добавляем/удаляем удаленные * При обновлении/добавлении нужно четко понимать что поля-ссылки нельзя передавать в исходном виде. * При необходимости надо понимать куда ссылается исходный объект и искать такой-же на второй системе * Учитывая необходимость исправлять ссылки на лету, логично все затолкать в один котроллер, чтобы в процессе синхронизации держать удаленные объекты разных типов в памяти, а не загружать постоянно {{drawio>инвентаризация:dev:sync.png}} ==== Вложения ==== Нужно разрешить extend вложений в типах и моделях оборудования При сравнении объектов дополнительно запрашивать сравнение сканов: * Выбираем дату самого свежего скана с обеих сторон - таким образом определяем направление обновления * Определив направление сравниваем сканы поименно с учетом размера и даты * При наличии различий - обновляем в нужном направлении {{drawio>инвентаризация:dev:syncScans.png}} ==== Прочее ==== Возможно логичнее все сделать в виде внешнего ПО работающего через REST API, чтобы ограничиться работой с REST, а не делать часть задач через локальную БД С другой стороны полезно встроить в саму инвентори с точки зрения добавления Моделей/Софта/Производителей на лету подтягивая из "облака" при необходимости Всем синхронизируемым объектам надо добавить поле updated_at и заполнить его ==== Зависимости ==== Для корректной простановки ссылок: Грузим все объекты с одной стороны для понимания кто куда ссылается Также согласно зависимостей их надо поселедовательно добавлять во вторую систему Производители Типы оборудования | \ \ / Написание ПО Модели оборудования ==== Что использовать в качестве ключа? ==== Как обнаруживать переименование объектов, например производителя хз типы оборудования по коду, а все остальное походу по имени В случае получения в БД переименованного объекта и перестановки ссылок на него, старый должен оказаться не используемым и может быть удален (если не найден в источнике синхронизации) Вопрос с удалением отсутствующих объектов В процессе перепривязывания ссылок можно обнаруживать ссылки на какие объекты были отвязаны Потом перепровеврить все отвязанные объекты на предмет допустимости удаления, если отвязанный объект осиротел - удаляем