fixed bugs with reports ui and added rounding
This commit is contained in:
parent
e589956878
commit
7b811fb607
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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] = {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
/home/frappe/frappe-bench/apps/formula_editor/node_modules
|
||||||
Loading…
Reference in New Issue