Розробка бота 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 робочі дні.







