2 changed files with 10 additions and 8 deletions
|
|
@ -10,7 +10,7 @@
|
||||||
DRY: PURE-хелперы нормализации/форматирования НЕ дублируем — импортируем из
|
DRY: PURE-хелперы нормализации/форматирования НЕ дублируем — импортируем из
|
||||||
`report_pdf` (там они уже есть: `_normalize` — приём инстанса ИЛИ `as_dict()`-словаря,
|
`report_pdf` (там они уже есть: `_normalize` — приём инстанса ИЛИ `as_dict()`-словаря,
|
||||||
`_fmt` — строковое форматирование ячейки/None→"—", `_level_ru`, `_as_dict`/`_as_list`,
|
`_fmt` — строковое форматирование ячейки/None→"—", `_level_ru`, `_as_dict`/`_as_list`,
|
||||||
`_future_supply_pairs`, `_scenario_deficit_index`) + переиспользуем его named-константы
|
`_future_supply_pairs`, `_scenario_deficit_cell`) + переиспользуем его named-константы
|
||||||
(`_DASH`/`_NO_DATA`/`_ADVISORY_MARKER`). Здесь добавлены ТОЛЬКО docx-специфичные
|
(`_DASH`/`_NO_DATA`/`_ADVISORY_MARKER`). Здесь добавлены ТОЛЬКО docx-специфичные
|
||||||
микро-билдеры (заголовки/абзацы/таблицы python-docx).
|
микро-билдеры (заголовки/абзацы/таблицы python-docx).
|
||||||
|
|
||||||
|
|
@ -44,7 +44,7 @@ from app.services.exporters.report_pdf import (
|
||||||
_future_supply_pairs,
|
_future_supply_pairs,
|
||||||
_level_ru,
|
_level_ru,
|
||||||
_normalize,
|
_normalize,
|
||||||
_scenario_deficit_index,
|
_scenario_deficit_cell,
|
||||||
)
|
)
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
|
|
@ -76,7 +76,8 @@ _TABLE_STYLE: str = "Table Grid"
|
||||||
_COMPETITORS_TOP_N: int = 5
|
_COMPETITORS_TOP_N: int = 5
|
||||||
|
|
||||||
# Основной продуктовый горизонт (мес) — подпись столбца сводного дефицита сценария
|
# Основной продуктовый горизонт (мес) — подпись столбца сводного дефицита сценария
|
||||||
# (зеркало report_md._PRIMARY_HORIZON_MONTHS; само значение тянет _scenario_deficit_index).
|
# (зеркало report_md._PRIMARY_HORIZON_MONTHS; значение тянет _scenario_deficit_cell —
|
||||||
|
# при fallback на чужой горизонт ячейка несёт «(гор. N мес)», #1590).
|
||||||
_PRIMARY_HORIZON_MONTHS: int = 12
|
_PRIMARY_HORIZON_MONTHS: int = 12
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -272,7 +273,7 @@ def _build_scenarios(doc: _DocxDocument, report: dict[str, Any]) -> None:
|
||||||
rate_str = (
|
rate_str = (
|
||||||
", ".join(f"{k}: {_fmt(v)}" for k, v in rate_path.items()) if rate_path else None
|
", ".join(f"{k}: {_fmt(v)}" for k, v in rate_path.items()) if rate_path else None
|
||||||
)
|
)
|
||||||
rows.append([name, _scenario_deficit_index(data), rate_str, data.get("advisory")])
|
rows.append([name, _scenario_deficit_cell(data), rate_str, data.get("advisory")])
|
||||||
|
|
||||||
headers = [
|
headers = [
|
||||||
"Сценарий",
|
"Сценарий",
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
DRY: PURE-хелперы нормализации/форматирования НЕ дублируем — импортируем из
|
DRY: PURE-хелперы нормализации/форматирования НЕ дублируем — импортируем из
|
||||||
`report_pdf` (там они уже есть: `_normalize` — приём инстанса ИЛИ `as_dict()`-словаря,
|
`report_pdf` (там они уже есть: `_normalize` — приём инстанса ИЛИ `as_dict()`-словаря,
|
||||||
`_fmt` — строковое форматирование значения/None→"—", `_level_ru`, `_as_dict`/`_as_list`,
|
`_fmt` — строковое форматирование значения/None→"—", `_level_ru`, `_as_dict`/`_as_list`,
|
||||||
`_scenario_deficit_index`) + переиспользуем его named-константы
|
`_scenario_deficit_cell`) + переиспользуем его named-константы
|
||||||
(`_DASH`/`_NO_DATA`/`_ADVISORY_MARKER`). Здесь добавлены ТОЛЬКО pptx-специфичные
|
(`_DASH`/`_NO_DATA`/`_ADVISORY_MARKER`). Здесь добавлены ТОЛЬКО pptx-специфичные
|
||||||
микро-билдеры (слайды/буллеты/таблица python-pptx).
|
микро-билдеры (слайды/буллеты/таблица python-pptx).
|
||||||
|
|
||||||
|
|
@ -46,7 +46,7 @@ from app.services.exporters.report_pdf import (
|
||||||
_fmt,
|
_fmt,
|
||||||
_level_ru,
|
_level_ru,
|
||||||
_normalize,
|
_normalize,
|
||||||
_scenario_deficit_index,
|
_scenario_deficit_cell,
|
||||||
)
|
)
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
|
|
@ -78,7 +78,8 @@ _LAYOUT_TITLE_CONTENT: int = 1
|
||||||
_LAYOUT_TITLE_ONLY: int = 5
|
_LAYOUT_TITLE_ONLY: int = 5
|
||||||
|
|
||||||
# Основной продуктовый горизонт (мес) — подпись сводного дефицита сценария
|
# Основной продуктовый горизонт (мес) — подпись сводного дефицита сценария
|
||||||
# (зеркало report_docx._PRIMARY_HORIZON_MONTHS; само значение тянет _scenario_deficit_index).
|
# (зеркало report_docx._PRIMARY_HORIZON_MONTHS; значение тянет _scenario_deficit_cell —
|
||||||
|
# при fallback на чужой горизонт буллет несёт «(гор. N мес)», #1590).
|
||||||
_PRIMARY_HORIZON_MONTHS: int = 12
|
_PRIMARY_HORIZON_MONTHS: int = 12
|
||||||
|
|
||||||
# Сколько USP-ниш выводить буллетами на слайд «Продукт ТЗ» (колода — держим компактно).
|
# Сколько USP-ниш выводить буллетами на слайд «Продукт ТЗ» (колода — держим компактно).
|
||||||
|
|
@ -235,7 +236,7 @@ def _build_scenarios(prs: _PptxPresentation, report: dict[str, Any]) -> None:
|
||||||
rate_str = (
|
rate_str = (
|
||||||
", ".join(f"{k}: {_fmt(v)}" for k, v in rate_path.items()) if rate_path else _DASH
|
", ".join(f"{k}: {_fmt(v)}" for k, v in rate_path.items()) if rate_path else _DASH
|
||||||
)
|
)
|
||||||
deficit = _fmt(_scenario_deficit_index(data))
|
deficit = _fmt(_scenario_deficit_cell(data))
|
||||||
bullets.append(
|
bullets.append(
|
||||||
(str(name), f"дефицит ({_PRIMARY_HORIZON_MONTHS} мес) {deficit}; ставка {rate_str}")
|
(str(name), f"дефицит ({_PRIMARY_HORIZON_MONTHS} мес) {deficit}; ставка {rate_str}")
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue