Тип Cubux.Product

Описание структуры продукта. Возможны дополнительные затраты, которые должны обрабатываться вместе, как целая древовидная структура.

Объект со следующими полями:

Поле Тип Описание
hash PK md5 Хеш продукта (см. далее)
ver (только чтение) uint16 Версия (см. далее)
category_uuid uuid, NULL Категория доходов Cubux.SelfCategory, которой изначально соответствует данный продукт или услуга
specification_uuid uuid, NULL Тех.карта Cubux.Specification, описывающая собственный состав продукта (без дополнительных затрат)

Дополнительные затраты

Хеш продукта

Хеш продукта представляет собой MD5 хеш от всех важных данных самого продукта и его непосредственных дочерних дополнительных затрат. Хеш вычисляется следующим образом (вспомогательное форматирование описано ниже):

  1. Если в продукте нет дополнительных затрат, то нет необходимости вообще использовать данную структуру для описания продукта.
  2. Создать новый пустой массив S для строковых данных.
  3. Если category_uuid не NULL, то добавить в S строку вида c:UUID, где UUID — UUID из category_uuid.
  4. Если specification_uuid не NULL, то добавить в S строку вида s:UUID, где UUID — UUID из specification_uuid.
  5. Для каждой непосредственно дочерней дополнительной затраты категории Cubux.ProductAddCategory добавить в S строку вида +c:C*Q, где C — UUID из поля category_uuid, а Q — представление количества из поля quantity.
  6. Для каждой непосредственно дочерней дополнительной затраты материала Cubux.ProductAddMaterial добавить в S строку вида +m:M*Q:U, где M — UUID из поля material_uuid, Q — представление количества из поля quantity, а U — UUID из поля unit_uuid.
  7. Для каждой непосредственно дочерней дополнительной затраты продукта Cubux.ProductAddProduct добавить в S строку вида +p:H*Q, где H — хеш из поля product_hash, а Q — представление количества из поля quantity. Если поле source не пустое, то добавить в строку :src=S, где S — значение поля source. Т.е. в итоге получится строка либо +p:H*Q при пустом source, либо +p:H*Q:src=S в противном случае.
  8. Для каждой непосредственно дочерней дополнительной затраты тех.карты Cubux.ProductAddSpecification добавить в S строку вида +s:S*Q, где S — UUID из поля specification_uuid, а Q — представление количества из поля quantity.
  9. Отсортировать массив S.
  10. Конкатенировать все элементы массива S через разделитель ; и вычислить хеш MD5 от полученной строки.
Форматирование данных

При вычислении хеша по алгоритму, описанному выше, необходимо дополнительно форматировать следующие типы данных перед вставкой.

Версия продукта

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

Для лучшего обеспечения обратной совместимости сервер пытается выбрать минимальную возможную версию согласно истории изменений.

История версий

Пример

Продукт со следующими данными:

{
  "product": [
    {
      "hash": "<...>",
      "ver": 1,
      "category_uuid": "2f2ccc87-9972-4d80-9e71-b681005b41e8",
      "specification_uuid": null
    }
  ],
  "product_add_material": [
    {
      "parent_product_hash": "<...>",
      "material_uuid": "81536d94-8695-4ab2-b795-37427ae347fe",
      "unit_uuid": "d3f5ef2d-5600-4bc4-99a1-f39f12060828",
      "quantity": "1000.0000000000"
    },
    {
      "parent_product_hash": "<...>",
      "material_uuid": "82de8e09-a092-4821-a5a9-485e5914f8eb",
      "unit_uuid": "b652d292-7f4f-4ce3-b48b-72d86f0d9801",
      "quantity": "2.7500000000"
    }
  ],
  "product_add_product": [
    {
      "parent_product_hash": "<...>",
      "product_hash": "43165dec5b61d2bf2fba5fa42bbb5d16",
      "quantity": "1.0000000000"
    }
  ],
  "product_add_specification": [
    {
      "parent_product_hash": "<...>",
      "specification_uuid": "d3dab4a1-aec4-4b5c-a0fc-d078c1b3bcb9",
      "quantity": "2.0000000000"
    }
  ]
}

При вычислении хеша будет иметь следующий промежуточный массив с данными:

[
  "c:2f2ccc87-9972-4d80-9e71-b681005b41e8",
  "+m:82de8e09-a092-4821-a5a9-485e5914f8eb*2.75:b652d292-7f4f-4ce3-b48b-72d86f0d9801",
  "+m:81536d94-8695-4ab2-b795-37427ae347fe*1000:d3f5ef2d-5600-4bc4-99a1-f39f12060828",
  "+p:43165dec5b61d2bf2fba5fa42bbb5d16*1",
  "+s:d3dab4a1-aec4-4b5c-a0fc-d078c1b3bcb9*2"
]

После сортировки и конкатенации получим следующую строку (переносы добавлены для читабельности):

+m:81536d94-8695-4ab2-b795-37427ae347fe*1000:d3f5ef2d-5600-4bc4-99a1-f39f12060828;
+m:82de8e09-a092-4821-a5a9-485e5914f8eb*2.75:b652d292-7f4f-4ce3-b48b-72d86f0d9801;
+p:43165dec5b61d2bf2fba5fa42bbb5d16*1;
+s:d3dab4a1-aec4-4b5c-a0fc-d078c1b3bcb9*2;
c:2f2ccc87-9972-4d80-9e71-b681005b41e8

Итого, MD5 хеш получившейся строки (без переносов, которые было добавлены для читабельности) будет:

7934ddf8d830a549feb06812cbaa8c73