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