fixed bugs with reports ui and added rounding

This commit is contained in:
Ali 2025-07-16 17:26:40 +04:00
parent e589956878
commit 7b811fb607
3 changed files with 53 additions and 12 deletions

View File

@ -416,10 +416,11 @@ def extract_field_from_report(data, columns, field_name):
else: else:
value = None value = None
# Преобразуем в число # Преобразуем в число и округляем до 2 знаков
try: try:
if value is not None: if value is not None:
return float(value) num_value = float(value)
return round(num_value, 2)
except (ValueError, TypeError): except (ValueError, TypeError):
pass pass
@ -449,7 +450,8 @@ def extract_field_from_report(data, columns, field_name):
except (ValueError, TypeError): except (ValueError, TypeError):
pass pass
return total # Округляем итоговую сумму до 2 знаков
return round(total, 2)
return 0 return 0

View File

@ -205,16 +205,33 @@ function loadReportFilters(d, reportName, existingFilters = null) {
}, },
callback: function(r) { callback: function(r) {
if (r.message && r.message.length > 0) { if (r.message && r.message.length > 0) {
// Показываем секцию фильтров // Фильтруем ненужные базовые поля, которые автоматически обрабатываются
d.set_df_property('filters_section', 'hidden', 0); const excludeFields = ['company', 'from_date', 'to_date', 'fiscal_year', 'period_start_date', 'period_end_date'];
d.set_df_property('filters_helper', 'hidden', 0); const filteredFilters = r.message.filter(filter =>
!excludeFields.includes(filter.fieldname)
);
// Генерируем HTML для фильтров if (filteredFilters.length > 0) {
const filtersHtml = generateUniversalFiltersHtml(r.message, existingFilters); // Показываем секцию фильтров
d.fields_dict.filters_container.$wrapper.html(filtersHtml); d.set_df_property('filters_section', 'hidden', 0);
d.set_df_property('filters_helper', 'hidden', 0);
// Инициализируем контролы фильтров
initUniversalFilterControls(d, r.message, existingFilters); // Генерируем 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(
'<div class="text-muted small"></div>'
);
d.set_df_property('filters_section', 'hidden', 0);
}
} else { } else {
clearFiltersSection(d); clearFiltersSection(d);
} }
@ -516,6 +533,15 @@ function createFallbackControl($container, filter, currentValue, d) {
function collectFiltersFromControls(d) { function collectFiltersFromControls(d) {
const values = {}; const values = {};
// Автоматически добавляем базовые фильтры с их специальными значениями
values.company = '$DefaultCompany';
values.from_date = '$AyIlSpecial';
values.to_date = '$AyIlSpecial';
// Добавляем фискальный год, если нужен
values.fiscal_year = '$DefaultFiscalYear';
// Добавляем значения от пользовательских контролов
if (d.filter_controls) { if (d.filter_controls) {
Object.keys(d.filter_controls).forEach(fieldname => { Object.keys(d.filter_controls).forEach(fieldname => {
const ctrl = d.filter_controls[fieldname]; const ctrl = d.filter_controls[fieldname];
@ -539,6 +565,15 @@ function updateFiltersJson(d) {
try { try {
const filtersJson = collectFiltersFromControls(d); const filtersJson = collectFiltersFromControls(d);
d.set_value('filters_json', filtersJson); d.set_value('filters_json', filtersJson);
// Также обновляем поля отчета при изменении фильтров
const reportName = d.get_value('report');
if (reportName) {
// Небольшая задержка для применения изменений
setTimeout(() => {
loadReportFields(d, reportName);
}, 300);
}
} catch (e) { } catch (e) {
console.error('Error updating filters JSON:', 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); let value = parseFloat(result.message);
if (isNaN(value)) value = 0; if (isNaN(value)) value = 0;
// Округляем до 2 знаков после запятой
value = Math.round(value * 100) / 100;
// Сохраняем в кеш // Сохраняем в кеш
window.reportCache[cacheKey] = { window.reportCache[cacheKey] = {

View File

@ -0,0 +1 @@
/home/frappe/frappe-bench/apps/formula_editor/node_modules