<?php
+/**
+ * Загрузка переменных окружения из .env файла
+ *
+ * ВАЖНО: Используем createUnsafeImmutable() вместо createImmutable()
+ * потому что createImmutable() в Dotenv v5 НЕ вызывает putenv() автоматически.
+ * Это приводит к тому, что getenv() возвращает false, хотя $_ENV заполнен.
+ *
+ * createUnsafeImmutable() включает PutenvAdapter, который:
+ * - Заполняет $_ENV
+ * - Заполняет $_SERVER
+ * - Вызывает putenv() для каждой переменной
+ *
+ * "Unsafe" означает только то, что putenv() не thread-safe в многопоточных SAPI,
+ * но для PHP-FPM (prefork модель) это безопасно.
+ */
+
try {
- $dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/../');
+ $dotenv = Dotenv\Dotenv::createUnsafeImmutable(__DIR__ . '/../');
$dotenv->load();
// Обязательные переменные окружения
$dotenv->ifPresent('DB_PORT')->isInteger();
$dotenv->ifPresent('DB_REMOTE_PORT')->isInteger();
- foreach ($_ENV as $key => $value) {
- if (is_scalar($value)) {
- putenv("$key=$value");
- } else {
- Yii::warning("Переменная окружения $key имеет нескалярное значение и не может быть установлена через putenv");
- }
- }
} catch (\Dotenv\Exception\InvalidPathException $e) {
putenv("APP_ENV=development");
- Yii::error('Файл .env не найден: ' . $e->getMessage());
+ error_log('[ENV ERROR] Файл .env не найден: ' . $e->getMessage());
} catch (\Dotenv\Exception\ValidationException $e) {
- Yii::error('Ошибка валидации .env: ' . $e->getMessage());
+ error_log('[ENV ERROR] Ошибка валидации .env: ' . $e->getMessage());
throw $e; // Прекращаем выполнение при отсутствии обязательных переменных
}
{
$result = new ControlReportResult();
- $result->hungInDelivery = [
- new OrderIssue(OrderIssue::TYPE_HUNG_IN_DELIVERY, 1, 'FW-1'),
- ];
- $result->successNoCheck = [
- new OrderIssue(OrderIssue::TYPE_SUCCESS_NO_CHECK, 2, 'YM-2'),
- ];
- $result->cancelNoProcess = [
- new OrderIssue(OrderIssue::TYPE_CANCEL_NO_PROCESS, 3, 'FW-3'),
- ];
- $result->successMissingData = [
- new OrderIssue(OrderIssue::TYPE_SUCCESS_MISSING_DATA, 4, 'FW-4'),
- ];
+ $issue1 = new OrderIssue(OrderIssue::TYPE_HUNG_IN_DELIVERY, 1, 'FW-1');
+ $issue1->mpStatus = 'В доставке';
+ $issue1->rmkStatus = 'Курьеру';
+
+ $issue2 = new OrderIssue(OrderIssue::TYPE_SUCCESS_NO_CHECK, 2, 'YM-2');
+ $issue2->mpStatus = 'Доставлен';
+ $issue2->rmkStatus = 'Новый';
+
+ $issue3 = new OrderIssue(OrderIssue::TYPE_CANCEL_NO_PROCESS, 3, 'FW-3');
+ $issue3->mpStatus = 'Отменён';
+ $issue3->rmkStatus = 'Новый';
+
+ $issue4 = new OrderIssue(OrderIssue::TYPE_SUCCESS_MISSING_DATA, 4, 'FW-4');
+ $issue4->mpStatus = 'Доставлен';
+ $issue4->rmkStatus = 'Успех';
+ $issue4->issueReason = 'no_seller_id';
+
+ $result->hungInDelivery = [$issue1];
+ $result->successNoCheck = [$issue2];
+ $result->cancelNoProcess = [$issue3];
+ $result->successMissingData = [$issue4];
$result->calculateTotal();
$message = $this->service->formatTelegramControlReport($result);
public function testFormatTelegramControlReportUsesCodeBlock(): void
{
$result = new ControlReportResult();
- $result->hungInDelivery = [
- new OrderIssue(OrderIssue::TYPE_HUNG_IN_DELIVERY, 1, 'FW-1'),
- ];
+
+ $issue = new OrderIssue(OrderIssue::TYPE_HUNG_IN_DELIVERY, 1, 'FW-1');
+ $issue->mpStatus = 'В доставке';
+ $issue->rmkStatus = 'Курьеру';
+
+ $result->hungInDelivery = [$issue];
$result->calculateTotal();
$message = $this->service->formatTelegramControlReport($result);