From 7b811fb60788bff7e808ac83fa514eba59d10a3b Mon Sep 17 00:00:00 2001 From: Ali <010109ali@gmail.com> Date: Wed, 16 Jul 2025 17:26:40 +0400 Subject: [PATCH] fixed bugs with reports ui and added rounding --- formula_editor/api.py | 8 ++- .../public/js/formula_editor_reports.js | 56 ++++++++++++++++--- formula_editor/public/node_modules | 1 + 3 files changed, 53 insertions(+), 12 deletions(-) create mode 120000 formula_editor/public/node_modules diff --git a/formula_editor/api.py b/formula_editor/api.py index f3667b0..e2fbcd9 100644 --- a/formula_editor/api.py +++ b/formula_editor/api.py @@ -416,10 +416,11 @@ def extract_field_from_report(data, columns, field_name): else: value = None - # Преобразуем в число + # Преобразуем в число и округляем до 2 знаков try: if value is not None: - return float(value) + num_value = float(value) + return round(num_value, 2) except (ValueError, TypeError): pass @@ -449,7 +450,8 @@ def extract_field_from_report(data, columns, field_name): except (ValueError, TypeError): pass - return total + # Округляем итоговую сумму до 2 знаков + return round(total, 2) return 0 diff --git a/formula_editor/public/js/formula_editor_reports.js b/formula_editor/public/js/formula_editor_reports.js index 73e7e76..3153354 100644 --- a/formula_editor/public/js/formula_editor_reports.js +++ b/formula_editor/public/js/formula_editor_reports.js @@ -205,16 +205,33 @@ function loadReportFilters(d, reportName, existingFilters = null) { }, callback: function(r) { if (r.message && r.message.length > 0) { - // Показываем секцию фильтров - d.set_df_property('filters_section', 'hidden', 0); - d.set_df_property('filters_helper', 'hidden', 0); + // Фильтруем ненужные базовые поля, которые автоматически обрабатываются + const excludeFields = ['company', 'from_date', 'to_date', 'fiscal_year', 'period_start_date', 'period_end_date']; + const filteredFilters = r.message.filter(filter => + !excludeFields.includes(filter.fieldname) + ); - // Генерируем HTML для фильтров - const filtersHtml = generateUniversalFiltersHtml(r.message, existingFilters); - d.fields_dict.filters_container.$wrapper.html(filtersHtml); - - // Инициализируем контролы фильтров - initUniversalFilterControls(d, r.message, existingFilters); + if (filteredFilters.length > 0) { + // Показываем секцию фильтров + d.set_df_property('filters_section', 'hidden', 0); + d.set_df_property('filters_helper', 'hidden', 0); + + // Генерируем HTML для фильтров + const filtersHtml = generateUniversalFiltersHtml(filteredFilters, existingFilters); + d.fields_dict.filters_container.$wrapper.html(filtersHtml); + + // Инициализируем контролы фильтров + initUniversalFilterControls(d, filteredFilters, existingFilters); + } else { + // Если после фильтрации не осталось полей, скрываем секцию + clearFiltersSection(d); + + // Показываем информационное сообщение + d.fields_dict.filters_container.$wrapper.html( + '
' + ); + d.set_df_property('filters_section', 'hidden', 0); + } } else { clearFiltersSection(d); } @@ -516,6 +533,15 @@ function createFallbackControl($container, filter, currentValue, d) { function collectFiltersFromControls(d) { const values = {}; + // Автоматически добавляем базовые фильтры с их специальными значениями + values.company = '$DefaultCompany'; + values.from_date = '$AyIlSpecial'; + values.to_date = '$AyIlSpecial'; + + // Добавляем фискальный год, если нужен + values.fiscal_year = '$DefaultFiscalYear'; + + // Добавляем значения от пользовательских контролов if (d.filter_controls) { Object.keys(d.filter_controls).forEach(fieldname => { const ctrl = d.filter_controls[fieldname]; @@ -539,6 +565,15 @@ function updateFiltersJson(d) { try { const filtersJson = collectFiltersFromControls(d); d.set_value('filters_json', filtersJson); + + // Также обновляем поля отчета при изменении фильтров + const reportName = d.get_value('report'); + if (reportName) { + // Небольшая задержка для применения изменений + setTimeout(() => { + loadReportFields(d, reportName); + }, 300); + } } catch (e) { console.error('Error updating filters JSON:', e); } @@ -914,6 +949,9 @@ async function getReportFieldValue(frm, reportName, filters, fieldName, aggregat let value = parseFloat(result.message); if (isNaN(value)) value = 0; + + // Округляем до 2 знаков после запятой + value = Math.round(value * 100) / 100; // Сохраняем в кеш window.reportCache[cacheKey] = { diff --git a/formula_editor/public/node_modules b/formula_editor/public/node_modules new file mode 120000 index 0000000..bc426b4 --- /dev/null +++ b/formula_editor/public/node_modules @@ -0,0 +1 @@ +/home/frappe/frappe-bench/apps/formula_editor/node_modules \ No newline at end of file