# OdataService

Класс для работы с OData API. Наследуется от `HttpClient` и предоставляет интерфейс для построения запросов, фильтрации данных и выполнения CRUD операций.

---

## Инициализация

### `start(): self`
Создает новый экземпляр сервиса.

```php
$service = OdataService::start();

reset(): self

Сбрасывает все параметры запроса.

$service->reset();

Настройка запроса

endpoint(string $endpoint): self

Устанавливает endpoint для запроса.

$service->endpoint('Catalog_Products');

select(string|array $select): self

Указывает поля для выборки.

$service->select(['Name', 'Price']);
$service->select('Name,Price');

expand(string|array $expand): self

Добавляет условия для расширения связанных сущностей.

$service->expand('Category');
$service->expand(['Category', 'Supplier']);

orderBy(string $order): self

Устанавливает сортировку.

$service->orderBy('Name asc');

top(int $top): self

Ограничивает количество возвращаемых записей.

$service->top(10);

skip(int $skip): self

Пропускает указанное количество записей.

$service->skip(20);

count(): self

Добавляет /$count к endpoint для получения количества записей.

$service->count();

inlineCount(): self

Добавляет параметр $inlinecount=allpages для получения общего количества записей вместе с данными.

$service->inlineCount();

Типы данных

catalog(string $object): self

Устанавливает endpoint для работы с каталогом.

$service->catalog('Products');
// Catalog_Products

document(string $object): self

Устанавливает endpoint для работы с документом.

$service->document('Sales');
// Document_Sales

accRegister(string $object): self

Устанавливает endpoint для работы с регистром накопления.

$service->accRegister('GoodsRemains');
// AccumulationRegister_GoodsRemains

infoRegister(string $object): self

Устанавливает endpoint для работы с регистром сведений.

$service->infoRegister('Prices');
// InformationRegister_Prices

Фильтрация

filter(): self

Применяет установленные фильтры к запросу.

Выбрасывает \Exception, если фильтры не установлены.

setFiltersParams(string $string): self

Добавляет произвольное условие фильтрации.

$service->setFiltersParams("Price gt 1000");

guid(string $name_key, string $guid): self

Добавляет фильтр по GUID.

$service->guid('Ref_Key', '123e4567-e89b-12d3-a456-426614174000');

filterDate(string|\DateTimeInterface $date, string $operator = "eq", string|\DateTimeInterface $date_end = null, string $typeDate = "Date"): self

Добавляет фильтр по дате.

$service->filterDate('2024-01-01');
$service->filterDate('2024-01-01', 'ge', '2024-12-31');
$service->filterDate(now(), 'ge', null, 'DateTime');

filterNowYear(): self

Фильтр за текущий год.

$service->filterNowYear();

filterSubYear(): self

Фильтр за прошлый год.

$service->filterSubYear();

filterNowMonth(): self

Фильтр за текущий месяц.

$service->filterNowMonth();

filterSubMonth($type = 'Date'): self

Фильтр за прошлый месяц.

$service->filterSubMonth();
$service->filterSubMonth('DateTime');

Вспомогательные методы

formatDate(string|\DateTimeInterface $date): string

Форматирует дату для OData запроса.

$formattedDate = $service->formatDate(now());
// 2024-01-01T12:00:00

checkConnection(): string

Проверяет соединение с сервером.

$result = $service->checkConnection();
// 'Подключение успешно установлено.'

CRUD операции

add(array $data): self

Создает новую запись.

$service->catalog('Products')
    ->add([
        'Name' => 'Новый продукт',
        'Price' => 1000
    ]);

update(string $Ref_Key, array $data, string $method = 'PATCH'): self

Обновляет существующую запись.

$service->catalog('Products')
    ->update('123e4567-e89b-12d3-a456-426614174000', [
        'Price' => 1500
    ]);

delete(string $Ref_Key): self

Удаляет запись.

$service->catalog('Products')
    ->delete('123e4567-e89b-12d3-a456-426614174000');

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

Получение данных с фильтрацией

$result = OdataService::start()
    ->catalog('Products')
    ->select(['Name', 'Price', 'Code'])
    ->filterNowYear()
    ->expand('Category')
    ->orderBy('Name asc')
    ->top(10)
    ->get();

Получение количества записей

$count = OdataService::start()
    ->catalog('Products')
    ->filterDate(now()->startOfMonth(), 'ge')
    ->count()
    ->get();

Создание новой записи

$service = OdataService::start()
    ->document('Sales')
    ->add([
        'Number' => '001',
        'Date' => now(),
        'Amount' => 5000
    ]);

Исключения

| Метод | Исключение | |-------|------------| | filter() | \Exception | | update() | GuzzleException | | add() | GuzzleException | | delete() | GuzzleException |


Примечания

  1. Класс наследуется от HttpClient
  2. Все методы поддерживают fluent-интерфейс (цепочки вызовов)
  3. После выполнения запроса используйте reset() для сброса состояния