# YandexPayAndSplit\Logger

Библиотека для логирования в CMS. Чтобы была возможность заранее выявлять проблемы и проще диагностировать.

## Установка

```bash
composer require yandex_pay_and_split/logger -d path/to/project
```

## Использование

Добавляется как отдельный файл в CMS и конфигурируется. Далее используется явно в необходимых сценариях.

### Создание

```php
use YandexPayAndSplit\Logger\Logger;
use YandexPayAndSplit\Logger\Handlers\YaHandler;
use YandexPayAndSplit\Logger\Variables\ModuleVariables;

$logger = Logger::create([YaHandler::create()]); // Создаём сам логгер и сразу привязываем стандартный хэндлер

// При таком создании, есть валидация на обязательность параметров
$module = ModuleVariables::create([
    'cmsName' => 'cms',
    'cmsVersion' => '1.0.0',
    'moduleVersion' => '1.0.1',
]);

// Прицепляем параметры, которые всегда будем отправлять
$logger->addVariables($module->toArray());
$logger->addVariables([
    'checkoutModule' => 'custom_checkout_module',
]);
```

### Логирование

```php
$logger->logInfo('some_info_event', [
    'merchantId' => 'merchant_id_value',
]);

$logger->logError('some_error_event', new \Exception('some_exception'), [
    'additionalData' => 'some_additional_data',
]);
```

### Добавить обработчик

Должно быть полезно для поддержания стандартной механики логирования

1. Реализуем обработчик в соответствии с контрактом:

```php
use YandexPayAndSplit\Logger\Handlers\AbstractHandler;

class ExampleHandler extends AbstractHandler
{
    public function logInfo($event, $variables = [])
    {
        // Реализуем логику для обработчика
    }

    public function logError($event, $error = null, $variables = [])
    {
        // Реализуем логику для обработчика
    }
}
```

2. Подключаем обработчик к логгеру

```php
$logger->addHandler(new ExampleHandler());
```

## YaHandler

Стандартный обработчик в модуле. Имеет часть возможностей для поддержки разных CMS

### Переопредление транспорта

Некоторые CMS требуют использовать их транспорт. Для этого можно воспользоваться такой механикой

```php
use YandexPayAndSplit\Logger\Transport\AbstractTransport;

class ExampleTransport extends AbstractTransport
{
    public function send($url, $data)
    {
        // Реализуем логику для запроса
    }
}

$yaHadler = YaHandler::create([]);
$yaHadler->setTransport(new ExampleTransport()); // Переопределяем транспорт
```

## Пример настройки

Чтобы использовать `env` со иным значением, надо определить `YA_HANDLER_ENV` в переменных окружения запуска. В иных случаях будет "production" всегда.

```php
<?php

use YandexPayAndSplit\Logger\Logger;
use YandexPayAndSplit\Logger\Handlers\YaHandler;
use YandexPayAndSplit\Logger\Variables\ModuleVariables;

$moduleVars = ModuleVariables::create([
    'cmsName' => 'cms',
    'cmsVersion' => '1',
    'moduleVersion' => '1',
]);

$logger = Logger::create([YaHandler::create()]);
$logger->addVariables($moduleVars->toArray());
```

Дальше используем как описано выше. Накапливать контекст можно через `array()`/`array_push()`.

## События ошибок

| Значение                                             | Описание                                                                                         |
| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| `ErrorsEventEnum::CREATE_ORDER_FLOW_ERROR`           | ошибка при создании заказа и формировании ссылки на оплату (где это отдельно реализуется)        |
| `ErrorsEventEnum::INITIATE_PAYMENT_FLOW_ERROR`       | ошибка для CMS где отдельная страница платежа (и попытка получить заказ и попытка создать заказ) |
| `ErrorsEventEnum::WEBHOOK_FLOW_ERROR`                | ошибка в процессе обработкиar вебхука (любая, тут метой будет уточняться)                        |
| `ErrorsEventEnum::REFUND_ORDER_FLOW_ERROR`           | ошибка в процессе возврата (как полного, так и частичного)                                       |
| `ErrorsEventEnum::PARTIALLY_REFUND_ORDER_FLOW_ERROR` | ошибка в процессе частичного возврата (где это отдельно реализуется)                             |
| `ErrorsEventEnum::GET_ORDER_FLOW_ERROR`              | ошибка при попытке получить заказ (где это отдельно реализуется)                                 |
