diff --git a/backend/app/services/exporters/report_docx.py b/backend/app/services/exporters/report_docx.py index d7e95ac8..96663941 100644 --- a/backend/app/services/exporters/report_docx.py +++ b/backend/app/services/exporters/report_docx.py @@ -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 = [ "Сценарий", diff --git a/backend/app/services/exporters/report_pptx.py b/backend/app/services/exporters/report_pptx.py index bffd34c0..2390ffde 100644 --- a/backend/app/services/exporters/report_pptx.py +++ b/backend/app/services/exporters/report_pptx.py @@ -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}") )