Files
dairy-report-generator/examples/russia.js
T
Ник a0af0ba772 feat: chart2/3/4 + section 5 (regional breakdown)
- chart2_leaders: horizontal ranked bars with highlight & category coloring
- chart3_ebitdaGroups: vertical bars colored by sign (green ≥0, orange <0)
- chart4_regionCompare: side-by-side bar panels with shared y-scale
- document.js: new section 5 'Региональный разрез и эффективность' between
  sections 4 and 6, renders chart2/3/4 with figure captions
- index.js: render hooks for data.leaders, data.ebitda, data.regionComparison
- examples/russia.js: demo data for all three new charts
2026-06-08 16:34:07 +03:00

266 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Example: общероссийский отчёт DT
*
* Запуск: node examples/russia.js
* Результат: /tmp/DT_Russia_Example.docx
*/
const fs = require('fs')
const path = require('path')
const { generateReport } = require('../src')
async function main () {
console.log('Генерирую пример: Российская Федерация')
const buf = await generateReport({
subject: {
name: 'Российской Федерации',
shortName: 'Россия',
type: 'region',
},
period: {
historicalFrom: '2024-01-01',
historicalTo: '2026-05-31',
forecastTo: '2026-12-31',
},
data: {
// Цены (агрегаты по DT-индексу)
prices: [
{ date: '2024-01-15', price: 31.05 }, { date: '2024-04-15', price: 31.40 },
{ date: '2024-07-15', price: 31.60 }, { date: '2024-10-15', price: 31.81 },
{ date: '2025-01-15', price: 31.98 }, { date: '2025-02-26', price: 38.94 },
{ date: '2025-04-15', price: 39.79 }, { date: '2025-07-15', price: 39.57 },
{ date: '2025-10-15', price: 39.51 }, { date: '2025-12-15', price: 39.39 },
{ date: '2026-01-15', price: 39.33 }, { date: '2026-02-15', price: 34.45 },
{ date: '2026-04-01', price: 34.01 }, { date: '2026-05-15', price: 34.20 },
],
// Себестоимость (расчётная)
costs: [
{ date: '2024-01-15', cost: 28.5 }, { date: '2024-04-15', cost: 28.7 },
{ date: '2024-07-15', cost: 28.9 }, { date: '2024-10-15', cost: 29.2 },
{ date: '2025-01-15', cost: 29.4 }, { date: '2025-04-15', cost: 29.8 },
{ date: '2025-07-15', cost: 30.1 }, { date: '2025-10-15', cost: 30.5 },
{ date: '2026-01-15', cost: 30.8 }, { date: '2026-04-01', cost: 31.0 },
],
// Прогноз 3 сценария
scenarios: {
base: [
{ date: '2026-04-01', price: 34.01 },
{ date: '2026-06-30', price: 34.5 },
{ date: '2026-09-30', price: 33.5 },
{ date: '2026-12-31', price: 32.0 },
],
opt: [
{ date: '2026-04-01', price: 34.01 },
{ date: '2026-06-30', price: 36.5 },
{ date: '2026-09-30', price: 35.5 },
{ date: '2026-12-31', price: 34.5 },
],
pess: [
{ date: '2026-04-01', price: 34.01 },
{ date: '2026-06-30', price: 32.5 },
{ date: '2026-09-30', price: 31.0 },
{ date: '2026-12-31', price: 29.5 },
],
},
// Барчарт маржи внизу chart1
marginBars: [
{ label: 'I 24', value: 8.5, isForecast: false },
{ label: 'II 24', value: 9.6, isForecast: false },
{ label: 'III 24', value: 9.5, isForecast: false },
{ label: 'IV 24', value: 9.4, isForecast: false },
{ label: 'I 25', value: 9.0, isForecast: false },
{ label: 'II 25', value: 12.8, isForecast: false },
{ label: 'III 25', value: 12.5, isForecast: false },
{ label: 'IV 25', value: 12.4, isForecast: false },
{ label: 'I 26', value: 11.9, isForecast: false },
{ label: 'II 26*', value: 8.5, isForecast: true },
{ label: 'III 26*', value: 5.0, isForecast: true },
{ label: 'IV 26*', value: 1.5, isForecast: true },
],
// Сценарии маржи (chart5)
scenarioMargins: [
{ label: 'II кв. 2026', opt: 15.7, base: 10.0, pess: 1.5 },
{ label: 'III кв. 2026', opt: 12.5, base: 6.5, pess: -4.8 },
{ label: 'IV кв. 2026', opt: 7.8, base: 1.6, pess: -11.7 },
],
// KPI на обложке
kpi: [
{ value: '34,1 ₽/кг', label: 'DT Index (май 2026)' },
{ value: '+24%', label: 'Рост цен 2025 vs 2024' },
{ value: '23 региона', label: 'В базе DT' },
{ value: '16%', label: 'Ключевая ставка ЦБ' },
],
// Допущения сценариев
scenarioAssumptions: [
{ name: 'Базовый', price: '33,534,5 руб./кг', costGrowth: '+5%', rationale: 'Продолжение текущих трендов' },
{ name: 'Оптимистичный', price: '36,037,5 руб./кг', costGrowth: '+3%', rationale: 'Восстановление спроса, ослабление рубля' },
{ name: 'Пессимистичный', price: '30,032,0 руб./кг', costGrowth: '+8%', rationale: 'Давление переработчиков, рост затрат' },
],
// Ретроспективная таблица
retrospective: {
columns: [
{ label: 'Квартал', width: 2200 },
{ label: '2024', width: 1700 },
{ label: '2025', width: 1700 },
{ label: 'III кв. 2026', width: 1800 },
{ label: 'Изм. г/г', width: 2466 },
],
rows: [
['I квартал', '31,14', '36,97', '36,04', { text: '↓ 2,5%', align: 1 }],
['II квартал', '31,47', '39,77', '34,11', { text: '↓ 14,2%', align: 1 }],
['III квартал','31,63', '39,57', 'прогноз', '—'],
['IV квартал', '31,86', '39,49', 'прогноз', '—'],
[{ text: 'Среднегодовая', bold: true }, { text: '31,6', bold: true }, { text: '39,4', bold: true }, { text: '34,5 (оц.)', bold: true }, { text: '↓ 12,4%', bold: true }],
]
},
// Прогнозная таблица
forecastTable: {
columns: [
{ label: 'Квартал', width: 1700 },
{ label: 'Цена руб./кг', width: 1700 },
{ label: 'Себест. руб./кг', width: 1700 },
{ label: 'Маржа %', width: 1700 },
{ label: 'Пр-во тыс. т', width: 1500 },
{ label: 'Сценарий', width: 1566 },
],
rows: [
['II кв. 2026', '35,0', '31,5', '10,0', '175', 'Базовый'],
['III кв. 2026', '34,0', '31,8', '6,5', '168', 'Базовый'],
['IV кв. 2026', '32,5', '32,0', '1,6', '160', 'Базовый'],
['II кв. 2026', '37,0', '31,2', '15,7', '178', { text: 'Оптимистичный', color: '1D9E75' }],
['III кв. 2026', '36,0', '31,5', '12,5', '170', { text: 'Оптимистичный', color: '1D9E75' }],
['IV кв. 2026', '34,5', '31,8', '7,8', '163', { text: 'Оптимистичный', color: '1D9E75' }],
['II кв. 2026', '33,0', '32,5', '1,5', '172', { text: 'Пессимистичный', color: 'C0272D' }],
['III кв. 2026', '31,5', '33,0', '-4,8', '165', { text: 'Пессимистичный', color: 'C0272D' }],
['IV кв. 2026', '30,0', '33,5', '-11,7', '158', { text: 'Пессимистичный', color: 'C0272D' }],
]
},
// chart2 — лидеры по цене (горизонтальные бары)
leaders: {
title: 'Лидеры по закупочной цене',
unit: 'руб./кг',
highlightName: 'РФ (среднее)',
items: [
{ name: 'Кабардино-Балкария', value: 49.0 },
{ name: 'Брянская обл.', value: 46.5 },
{ name: 'Псковская обл.', value: 44.0 },
{ name: 'Ленинградская обл.', value: 42.5 },
{ name: 'Краснодарский край', value: 40.0 },
{ name: 'РФ (среднее)', value: 34.1 },
{ name: 'Нижегородская обл.', value: 30.5 },
{ name: 'Самарская обл.', value: 29.0 },
{ name: 'Республика Татарстан', value: 28.5 },
{ name: 'Чувашия', value: 22.0 },
],
},
// chart3 — EBITDA-маржа по группам эффективности
ebitda: {
groups: [
{ group: 'A', value: 22.0, label: 'Эффективные', share: '25%' },
{ group: 'B', value: 8.5, label: 'Средние', share: '45%' },
{ group: 'C', value: -6.0, label: 'Отстающие', share: '30%' },
],
},
// chart4 — сравнение регионов (две панели)
regionComparison: {
unit: 'руб./кг',
left: {
title: 'Топ-5 по цене',
bars: [
{ label: 'Кабардино-Балкария', value: 49.0 },
{ label: 'Брянская обл.', value: 46.5 },
{ label: 'Псковская обл.', value: 44.0 },
{ label: 'Ленинградская обл.', value: 42.5 },
{ label: 'Краснодарский край', value: 40.0 },
],
},
right: {
title: 'Антитоп-5 по цене',
bars: [
{ label: 'Нижегородская обл.', value: 30.5 },
{ label: 'Ивановская обл.', value: 29.8 },
{ label: 'Самарская обл.', value: 29.0 },
{ label: 'Татарстан', value: 28.5 },
{ label: 'Чувашия', value: 22.0 },
],
},
},
},
text: {
mainConclusion: 'После резкого скачка в феврале–марте 2025 г. (с 32,2 до 39,8 руб./кг) национальный DT-индекс перешёл к плавному снижению. В 2026 г. коридор сузился до 33–35 руб./кг. Региональный разброс высок: от 22 руб./кг (Чувашия) до 49 руб./кг (Кабардино-Балкария). Базовый сценарий: среднегодовая цена 33,5–34,5 руб./кг, маржа 510%.',
conclusions: [
'Национальный DT-индекс в мае 2026 — 34,1 руб./кг: на 16% ниже пика 2025 г. (39,9 руб./кг), но на 10% выше средней 2024 г. (31,6 руб./кг).',
'Региональный спред 2026 рекордный: 27 руб./кг (Чувашия 22 руб./кг vs Кабардино-Балкария 49 руб./кг).',
'Лидеры по цене: СКФО и западное ЦФО/СЗФО (Брянская, Псковская, Ленинградская обл.) — 40–50 руб./кг.',
'Аутсайдеры: Республика Татарстан, Самарская, Нижегородская, Ивановская обл. — 28–31 руб./кг.',
'Ключевой риск — ставка ЦБ 16%: замораживает инвестиции в животноводческую инфраструктуру.',
],
intro: [
'Период анализа: 2024 г. — май 2026 г. Отчёт охватывает всю территорию Российской Федерации по данным 23 активных региональных панелей системы Dairy Trends (DT).',
'Основные источники: данные Dairy Trends (DT) — еженедельные цены на сырое молоко; статистика Росстата; макроэкономические индикаторы ЦБ РФ; данные GDT и МСХ Беларуси как ориентиры ЕАЭС.',
'Ключевая ставка ЦБ РФ — 16% (май 2026). Рост цен на электроэнергию: +17–24% в 2025 году, +320% в I кв. 2026. Комбикорма: +12% в 2025.',
],
methodology: [
'Экстраполяция трендов с учётом сезонности (квартальные коэффициенты за 2024–2025 гг.).',
'Корректировка на макроиндексы: электроэнергия +4–6% в квартал, комбикорма +5–8% за год.',
'Сценарный анализ: три сценария с разными допущениями по динамике цены и затрат.',
],
retrospectiveSummary: 'В 2024 году национальный DT-индекс показал стабильный медленный рост: 30,97 → 31,93 руб./кг (+3% за год). В феврале–марте 2025 произошёл резкий скачок: за 10 дней индекс вырос с 32,2 до 38,9 руб./кг (+21%). К апрелю достиг плато 39,8 руб./кг, удерживалось до декабря 2025. В январе–мае 2026 — нисходящая коррекция до 34,1 руб./кг (–13,5% с начала года).',
regionalSummary: 'Региональный разброс закупочных цен в 2026 г. — рекордный: от 22 руб./кг (Чувашия) до 49 руб./кг (Кабардино-Балкария), спред 27 руб./кг. Высокие цены концентрируются в СКФО и западном поясе ЦФО/СЗФО, где сильна конкуренция переработчиков за сырьё. Низкие — в Поволжье с профицитом сырого молока.',
efficiencySummary: 'Группа A (эффективные, надой >9 000 кг/гол.) сохраняет двузначную EBITDA-маржу даже при текущих ценах. Группа C (отстающие, надой <6 000 кг/гол.) уже работает в убыток и наиболее уязвима к дальнейшему снижению цены и росту ставки ЦБ.',
forecastSummary: 'В базовом сценарии большинство производителей сохранят маржу 5–10%. В оптимистичном (цена до 36–37 руб./кг) даже менее эффективные хозяйства выйдут в плюс. В пессимистичном убытки накопят 30–40% предприятий.',
risks: [
'Погодные условия — засуха поднимет цены на комбикорма на 15–20%.',
'Регуляторные риски — изменение импортных пошлин ЕАЭС, белорусские фиксированные цены.',
'Кредитное сжатие — ставка ЦБ 16% уже заморозила инвестиционные программы ряда хозяйств.',
'Валютный фактор — укрепление рубля снижает конкурентоспособность на экспортных рынках.',
],
recommendations: {
'Для руководителей хозяйств': [
'Снижайте себестоимость через повышение надоя (цель: >9 000 кг/год) и оптимизацию кормления.',
'Не наращивайте поголовье без долгосрочных контрактов. Инвестируйте в роботизацию доения.',
'Хеджируйте цену форвардными контрактами на 30–40% объёма (приоритет — осень).',
],
'Для менеджеров по продажам кормов и оборудования': [
'Приоритет: клиенты с II >80, OH >70.',
'Прогноз спроса: +2–3% в тоннах. Логистические окна: май и сентябрь.',
'Ужесточайте контроль дебиторки с предприятиями группы В.',
],
'Для инвесторов': [
'M&A: фермы группы В по цене 0,5–0,7 годовой выручки с последующей модернизацией.',
'IRR новой фермы 1 200 коров — 9–11% при цене 34–35 руб./кг, что ниже WACC 14–15%. Без господдержки нецелесообразно.',
],
},
},
})
const outPath = path.join('/tmp', 'DT_Russia_Example.docx')
fs.writeFileSync(outPath, buf)
console.log(`✓ Готово: ${outPath} (${(buf.length/1024).toFixed(0)} KB)`)
}
main().catch(e => { console.error(e); process.exit(1) })