Skip to content

Добавить поддержку aggregationUnits для метода send_aggregation #8

@temirdev

Description

@temirdev

Сейчас метод send_aggregation в SDK реализован в упрощённом виде и не поддерживает структуру агрегации, описанную в официальной документации СУЗ API.

Текущая реализация:

def send_aggregation(
    product_group: str,
    sntins: list[str],
    aggregation_type: str | None = None,
    attributes: dict[str, Any] | None = None,
)

Формирует body:

{
  "productGroup": "...",
  "sntins": [...],
  "aggregationType": "..."
}

Проблема

Официальная документация СУЗ API требует использовать структуру:

{
  "productGroup": "...",
  "aggregationUnits": [
    {
      "unitSerialNumber": "...",
      "aggregationType": "AGGREGATION",
      "aggregationUnitCapacity": 10,
      "aggregatedItemsCount": 10,
      "sntins": [...]
    }
  ]
}

В текущем SDK:

  • ❌ невозможно задать unitSerialNumber (код агрегата / SSCC)
  • ❌ невозможно указать aggregationUnitCapacity
  • ❌ невозможно построить вложенные структуры
  • ❌ не соответствует документации СУЗ

Фактическое поведение

При попытке использовать агрегацию:

client.reports.send_aggregation(...)

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


Ожидаемое поведение

Добавить поддержку полноценной агрегации через aggregationUnits.


Предлагаемое решение

Вариант 1 (рекомендуемый)

Расширить метод:

def send_aggregation(
    self,
    product_group: str,
    aggregation_units: list[dict[str, Any]],
    attributes: dict[str, Any] | None = None,
)

Формировать body:

body_dict = {
    "productGroup": product_group,
    "aggregationUnits": aggregation_units,
}

Вариант 2 (backward-compatible)

Поддержать оба варианта:

def send_aggregation(
    self,
    product_group: str,
    sntins: list[str] | None = None,
    aggregation_units: list[dict[str, Any]] | None = None,
    ...
)

Логика:

if aggregation_units:
    body["aggregationUnits"] = aggregation_units
elif sntins:
    body["sntins"] = sntins

Пример использования

client.reports.send_aggregation(
    product_group="radio",
    aggregation_units=[
        {
            "unitSerialNumber": "BOX_123456",
            "aggregationType": "AGGREGATION",
            "aggregationUnitCapacity": 5,
            "aggregatedItemsCount": 5,
            "sntins": codes,
        }
    ],
)

Дополнительно

  • сохранить текущую сигнатуру для обратной совместимости
  • добавить типизацию для AggregationUnit (dataclass / pydantic)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions