в данном коде проблема.. когда бот возвращает сообщение Склад: ${getWarehouseNameById(warehouseID)} внутри нет значение из за этого написано неизвестный склад , исправь эту ошибку , остальную логику в коде не нарушай , вот два файла с кодом первый utils.js import { fetchAcceptanceCoefficients } from './api.js';
import { trackingIntervals } from './handlers.js';

const boxTypeNames = {
  2: '📦 Короба',
  5: '🧱 Монопаллеты',
  6: '🔒 Суперсейф',
};

let warehousesCache = [];

export function getWarehouseNameById(id) {
  const warehouse = warehousesCache.find((w) => w.ID === id);
  return warehouse ? warehouse.name : 'Неизвестный склад';
}

export function getWarehouseKeyboard(warehouses, page) {
  const itemsPerPage = 10;
  const startIndex = page * itemsPerPage;
  const endIndex = startIndex + itemsPerPage;
  const warehouseButtons = warehouses
    .slice(startIndex, endIndex)
    .map((warehouse) => [
      { text: warehouse.name, callback_data: JSON.stringify({ warehouseID: warehouse.ID }) },
    ]);

  const navigationButtons = [];
  if (page > 0) {
    navigationButtons.push([
      { text: '⬅️ Назад', callback_data: JSON.stringify({ page: page - 1 }) },
    ]);
  }
  if (endIndex < warehouses.length) {
    navigationButtons.push([
      { text: 'Вперёд ➡️', callback_data: JSON.stringify({ page: page + 1 }) },
    ]);
  }

  return [...warehouseButtons, ...navigationButtons];
}

export function formatCoefficientsMessage(coefficients, warehouseID, boxTypeID) {
  let replyMessage = '🚚 Обнаружены доступные поставки:\n\n';
  coefficients.forEach((coeff) => {
    const date = new Date(coeff.date).toLocaleDateString();
    let cost =
      coeff.coefficient === 0
        ? '🆓 Бесплатная приёмка'
        : `💰 Платная приёмка коэффициент ${coeff.coefficient}`;
    replyMessage += `📅 Дата: ${date} \n${cost}\n\n Тип: ${coeff.boxTypeName}\n`;
  });
  return (
    `🏢 Склад: ${getWarehouseNameById(warehouseID)}, Тип поставки: ${boxTypeNames[boxTypeID]}\n` +
    replyMessage
  );
}

export async function startMonitoring(ctx, warehouseID, boxTypeID) {
  if (trackingIntervals[ctx.chat.id]) {
    clearInterval(trackingIntervals[ctx.chat.id]);
  }

  trackingIntervals[ctx.chat.id] = setInterval(async () => {
    const coefficients = await fetchAcceptanceCoefficients(ctx.session.apiKey, warehouseID);

    if (coefficients) {
      const filteredCoefficients = coefficients.filter(
        (coeff) => coeff.coefficient !== -1 && coeff.boxTypeID === boxTypeID,
      );

      if (filteredCoefficients.length > 0) {
        clearInterval(trackingIntervals[ctx.chat.id]);
        trackingIntervals[ctx.chat.id] = null;

        const replyMessage = formatCoefficientsMessage(
          filteredCoefficients,
          warehouseID,
          boxTypeID,
        );

        await ctx.reply(replyMessage, {
          reply_markup: {
            inline_keyboard: [
              [
                {
                  text: 'Искать другой город?',
                  callback_data: JSON.stringify({
                    warehouseID,
                    boxTypeID,
                    changeWarehouse: true,
                  }),
                },
                {
                  text: 'Повторить поиск',
                  callback_data: JSON.stringify({
                    warehouseID,
                    boxTypeID,
                    repeatSearch: true,
                  }),
                },
                {
                  text: 'Закончить поиск',
                  callback_data: JSON.stringify({
                    warehouseID,
                    boxTypeID,
                    continueSearch: false,
                  }),
                },
              ],
            ],
          },
        });
      }
    }
  }, 60000); // интервал 1 минута
}

export function stopMonitoring(ctx) {
  if (trackingIntervals[ctx.chat.id]) {
    clearInterval(trackingIntervals[ctx.chat.id]);
    delete trackingIntervals[ctx.chat.id];
  }
}

export { boxTypeNames };
 второй handlers.js import { fetchWarehouses, fetchAcceptanceCoefficients } from './api.js';
import {
  getWarehouseNameById,
  getWarehouseKeyboard,
  formatCoefficientsMessage,
  startMonitoring,
  stopMonitoring,
  boxTypeNames,
} from './utils.js';

export let trackingIntervals = {};
let warehousesCache = [];

const helpMessage =
  '📜 Доступные команды:\n' +
  '/start - Начать мониторинг\n' +
  '/stop - Остановить мониторинг\n' +
  '/changeapi - Сменить API ключ\n' +
  '/help - Показать справку\n\n' +
  '🤖 Как работать с ботом:\n' +
  '1. Нажмите /start для начала мониторинга.\n' +
  '2. Выберите представленный склад.\n' +
  '3. Выберите тип поставки.\n' +
  '4. Бот будет отслеживать доступные поставки и уведомлять вас о них.';

async function fetchAndFilterCoefficients(ctx, warehouseID, boxTypeID) {
  const coefficients = await fetchAcceptanceCoefficients(ctx.session.apiKey, warehouseID);

  if (!coefficients || coefficients.length === 0) {
    await ctx.editMessageText('❌ На этом складе нет доступных коэффициентов для приёмки.');
    return null;
  }

  const filteredCoefficients = coefficients.filter(
    (coeff) => coeff.coefficient !== -1 && coeff.boxTypeID === boxTypeID,
  );

  if (filteredCoefficients.length === 0) {
    await ctx.editMessageText('❌ Нет доступных поставок по выбранному типу.');
    await ctx.reply('🔍 Будем отслеживать?', {
      reply_markup: {
        inline_keyboard: [
          [
            {
              text: 'Да',
              callback_data: JSON.stringify({ warehouseID, boxTypeID, monitor: true }),
            },
            {
              text: 'Нет',
              callback_data: JSON.stringify({ warehouseID, boxTypeID, monitor: false }),
            },
          ],
        ],
      },
    });
    return null;
  }

  return filteredCoefficients;
}

async function displayCoefficients(ctx, filteredCoefficients, warehouseID, boxTypeID) {
  const currentTime = new Date().toLocaleTimeString();
  const replyMessage = formatCoefficientsMessage(filteredCoefficients, warehouseID, boxTypeID);
  await ctx.editMessageText(`${replyMessage}\n\n🕒 Обновлено в ${currentTime}`, {
    reply_markup: {
      inline_keyboard: [
        [
          {
            text: '🏠 Другой склад',
            callback_data: JSON.stringify({ warehouseID, boxTypeID, changeWarehouse: true }),
          },
          {
            text: '🔁 Повторить поиск',
            callback_data: JSON.stringify({ warehouseID, boxTypeID, repeatSearch: true }),
          },
          {
            text: '🚫 Закончить поиск',
            callback_data: JSON.stringify({ warehouseID, boxTypeID, continueSearch: false }),
          },
        ],
      ],
    },
  });
}

export async function handleStart(ctx) {
  if (!ctx.session.apiKey) {
    ctx.reply('🔑 Пожалуйста, отправьте ваш API ключ.');
    return;
  }

  const warehouses = await fetchWarehouses(ctx.session.apiKey);

  if (!warehouses || warehouses.length === 0) {
    ctx.reply('❌ Нет доступных складов.');
    return;
  }

  warehousesCache = warehouses;
  ctx.session.currentPage = 0;
  const message = await ctx.reply('🏢 Выберите склад:', {
    reply_markup: {
      inline_keyboard: getWarehouseKeyboard(warehouses, 0),
    },
  });

  // Сохраняем идентификатор сообщения в контексте
  ctx.session.messageId = message.message_id;
}

export async function handleCallbackQuery(ctx) {
  const { warehouseID, boxTypeID, monitor, continueSearch, changeWarehouse, repeatSearch, page } =
    JSON.parse(ctx.callbackQuery.data);

  if (page !== undefined) {
    // Если нажата кнопка навигации
    ctx.session.currentPage = page;
    await ctx.editMessageText('🏢 Выберите склад:', {
      reply_markup: {
        inline_keyboard: getWarehouseKeyboard(warehousesCache, page),
      },
    });
    return;
  }

  if (warehouseID && !boxTypeID) {
    // Если выбран склад, предложить выбрать тип поставки
    ctx.answerCbQuery();
    await ctx.editMessageText('🚚 Выберите тип поставки:', {
      reply_markup: {
        inline_keyboard: Object.keys(boxTypeNames).map((typeID) => [
          {
            text: boxTypeNames[typeID],
            callback_data: JSON.stringify({ warehouseID, boxTypeID: parseInt(typeID) }),
          },
        ]),
      },
    });
    return;
  }

  if (monitor !== undefined) {
    // Если ответ на вопрос об отслеживании
    if (monitor) {
      await ctx.editMessageText('🔍 Выбран мониторинг. Мы начнем отслеживать.');
      startMonitoring(ctx, warehouseID, boxTypeID);
    } else {
      await ctx.editMessageText('🚫 Мониторинг не будет запущен.');
    }
    return;
  }

  if (continueSearch !== undefined) {
    // Если ответ на вопрос о продолжении поиска
    if (continueSearch) {
      await ctx.editMessageText('🔍 Продолжаем поиск...');
      startMonitoring(ctx, warehouseID, boxTypeID);
    } else {
      await ctx.editMessageText('🚫 Мониторинг остановлен.');
      stopMonitoring(ctx);
    }
    return;
  }

  if (changeWarehouse !== undefined) {
    // Если ответ на вопрос о смене склада
    ctx.session.currentPage = 0;
    await ctx.editMessageText('🏢 Выберите склад:', {
      reply_markup: {
        inline_keyboard: getWarehouseKeyboard(warehousesCache, 0),
      },
    });
    return;
  }

  if (repeatSearch !== undefined || boxTypeID) {
    ctx.answerCbQuery();

    const filteredCoefficients = await fetchAndFilterCoefficients(ctx, warehouseID, boxTypeID);
    if (filteredCoefficients) {
      await displayCoefficients(ctx, filteredCoefficients, warehouseID, boxTypeID);
    }
  }
}

export async function handleText(ctx) {
  if (ctx.message.text.startsWith('/changeapi')) {
    return;
  }
  if (ctx.message.text.startsWith('/help')) {
    ctx.reply(helpMessage);
    return;
  }
  ctx.session.apiKey = ctx.message.text;
  ctx.reply(
    '🔑 API ключ сохранен. Теперь вы можете использовать команду /start для начала мониторинга.',
  );
}

export async function handleHelp(ctx) {
  ctx.reply(helpMessage);
}