# Структура конструктора запроса Android SDK
Для создания тела запроса нужно создать объект с данными на основе классов, предоставляемых SDK: 

1. `OperationBodyRequestBase` - пустой абстрактный базовый класс, от которого необходимо наследоваться при создании кастомного тела запроса. Можно использовать, если по какой-то причине у вас не получается создать запрос на основе подготовленных классов
2. `OperationBodyRequest` - наследник `OperationBodyRequestBase`, содержит в себе основные поля, которые могут быть необходимы для формирования тела операции. Для создания нужного тела для операции необходимо передать значение в нужное поле, например, для создания кастомера

## Структура конструтора тела запросов

1. `CustomerRequest` - класс, использующийся для создания или обновления информации о клиенте. 

   Имеет 2 конструктора, выбор из которых зависит от того, задаем ли мы fullName или используем firstName, middleName и lastName

2. `Ids` - класс, использующийся для передачи различных идентификатор в виде `Map<String, String>`. 

   Если вам надо передать `mindboxId`, нужно использовать дополнительный конструктор, который на вход принимает Int вместе с `Map<String, String>` остальных значений.

3. `CustomFields` - класс, использующийся для передачи различных кастомных параметров в виде `Map<String, Any>`.

4. `DateOnly` - класс, наследник от `Date`, используется для передачи на сервер даты в формате "yyyy-mm-dd".  

   Если вы реализуете свои классы и хотите в них передать использовать этот класс в качестве типа нового поля, то при переопределении классов необходимо к полю добавить `@JsonAdapter(DateOnlyAdapter::class)`

5. `DateTime` - класс, наследник от Date, используется для передачи на сервер даты и времени. 

   Если вы реализуете свои классы и хотите в них передать использовать этот класс в качестве типа нового поля, то при переопределении классов необходимо к полю добавить `@JsonAdapter(DateTimeAdapter::class)`

6. `DiscountRequest` - класс, использующийся для скидок. 

   Имеет 2 конструктора, выбор из которых зависит от того, задаем ли мы `PromoCodeRequest` или `ExternalPromoActionRequest`

7. `LineRequest` - класс имеет 2 конструктора, выбор из которых зависит от того, какого типа данных должен быть параметр quantity. QuantityType определяется и подставляется автоматически в тело в зависимости от типа quantity.

8. `ProductListItemRequest` - класс имеет несколько конструкторов, выбор конкретного из которых строится на нужных полях. Например, если необходимо задать pricePerItem и задать `ProductRequest`, то

<Tabs defaultValue="1" className="w-full">
  <ScrollArea className="w-full">
    <TabsList className="flex w-max gap-2">
      <TabsTrigger value="1">kotlin</TabsTrigger>
      <TabsTrigger value="2">java</TabsTrigger>
    </TabsList>
    <ScrollBar orientation="horizontal" />
  </ScrollArea>
  
  <TabsContent value="1">
  ```kotlin
ProductListItemRequest(12.0, ProductRequest(), 5.0, true)
```
  </TabsContent>
  <TabsContent value="2">
  ```java
new ProductListItemRequest(12.0, new ProductRequest(), 5.0, true);
```
  </TabsContent>
</Tabs>

9. `ViewProductRequest` - класс с 2-мя конструкторами, выбор из которых строится на необходимости использования `ProductRequest` или `ProductGroupRequest`
