Разработка бота уведомлений в Telegram об изменении цен поставщиков
Бот отслеживает цены поставщиков (через API, парсинг или загрузку прайс-листов) и немедленно уведомляет ответственных об изменениях, требующих реакции: рост цены, появление позиций в дефиците, изменение условий.
Логика отслеживания
class SupplierPriceMonitor
{
public function checkChanges(Supplier $supplier): void
{
$newPrices = $this->fetchPrices($supplier);
foreach ($newPrices as $sku => $newPrice) {
$oldPrice = SupplierPrice::where([
'supplier_id' => $supplier->id,
'sku' => $sku,
])->value('price');
if ($oldPrice === null) continue; // новая позиция — не уведомляем
$changePercent = abs($newPrice - $oldPrice) / $oldPrice * 100;
if ($changePercent >= config('suppliers.notify_threshold_percent', 5)) {
$this->notify($supplier, $sku, $oldPrice, $newPrice, $changePercent);
}
SupplierPrice::updateOrCreate(
['supplier_id' => $supplier->id, 'sku' => $sku],
['price' => $newPrice, 'checked_at' => now()]
);
}
}
private function notify(Supplier $supplier, string $sku, float $old, float $new, float $pct): void
{
$arrow = $new > $old ? '📈' : '📉';
$direction = $new > $old ? 'вырос' : 'снизился';
$message = "{$arrow} <b>Цена {$direction}</b>\n\n" .
"Поставщик: {$supplier->name}\n" .
"SKU: <code>{$sku}</code>\n" .
"Было: " . number_format($old, 2) . " ₽\n" .
"Стало: " . number_format($new, 2) . " ₽\n" .
"Изменение: <b>" . round($pct, 1) . "%</b>";
$this->telegram->sendToChannel(config('telegram.pricing_channel'), $message);
}
}
Порог уведомления (5% по умолчанию) настраивается в конфигурации. Проверка запускается по расписанию через Cron/Celery Beat.
Время реализации: 2–3 рабочих дня.







