changed hectare to area

This commit is contained in:
Ali 2025-10-23 14:10:34 +04:00
parent 2c1f431465
commit 2e08089ce1
2 changed files with 89 additions and 51 deletions

View File

@ -153,14 +153,14 @@ function group_and_create_agricultural_rows_silent(frm, table_fieldname, assets,
if (!grouped_assets[group_key]) {
grouped_assets[group_key] = {
asset: asset,
total_hectare: 0,
total_area: 0, // ← ИЗМЕНЕНО с total_hectare
count: 0,
asset_names: []
};
console.log(`Создана новая группа: "${group_key}"`);
}
grouped_assets[group_key].total_hectare += (asset.hectare || 0);
grouped_assets[group_key].total_area += (asset.area || 0); // ← ИЗМЕНЕНО с hectare
grouped_assets[group_key].count += 1;
grouped_assets[group_key].asset_names.push(asset.name);
});
@ -172,7 +172,7 @@ function group_and_create_agricultural_rows_silent(frm, table_fieldname, assets,
Object.entries(grouped_assets).forEach(([key, group]) => {
console.log(`Группа "${key}":`, {
количество_активов: group.count,
общая_площадь: group.total_hectare,
общая_площадь: group.total_area, // ← ИЗМЕНЕНО
активы: group.asset_names
});
});
@ -188,7 +188,7 @@ function group_and_create_agricultural_rows_silent(frm, table_fieldname, assets,
Object.entries(grouped_assets).forEach(function([group_key, group]) {
console.log(`Создание строки для группы: "${group_key}"`);
create_agricultural_row_with_calculation_silent(frm, table_fieldname, group.asset, agricultural_purposes, group.total_hectare, group, function() {
create_agricultural_row_with_calculation_silent(frm, table_fieldname, group.asset, agricultural_purposes, group.total_area, group, function() {
completed_calculations++;
console.log(`Прогресс создания строк: ${completed_calculations}/${total_groups}`);
@ -218,20 +218,20 @@ function create_agricultural_group_key(asset, agricultural_purposes) {
return key_parts.join('|');
}
function create_agricultural_row_with_calculation_silent(frm, table_fieldname, asset, agricultural_purposes, total_hectare, group_info, callback) {
function create_agricultural_row_with_calculation_silent(frm, table_fieldname, asset, agricultural_purposes, total_area, group_info, callback) {
console.log('=== create_agricultural_row_with_calculation_silent ===');
console.log('Актив:', asset.name, 'Общая площадь:', total_hectare);
console.log('Актив:', asset.name, 'Общая площадь:', total_area); // ← ИЗМЕНЕНО
let row = frm.add_child(table_fieldname);
console.log('Строка добавлена в таблицу');
fill_agricultural_row_fields(row, asset, agricultural_purposes, total_hectare, group_info);
fill_agricultural_row_fields(row, asset, agricultural_purposes, total_area, group_info); // ← ИЗМЕНЕНО
console.log('Поля строки заполнены:', row);
calculate_agricultural_tax_for_row_silent(row, asset, total_hectare, group_info, callback);
calculate_agricultural_tax_for_row_silent(row, asset, total_area, group_info, callback); // ← ИЗМЕНЕНО
}
function fill_agricultural_row_fields(row, asset, agricultural_purposes, total_hectare, group_info) {
function fill_agricultural_row_fields(row, asset, agricultural_purposes, total_area, group_info) {
console.log('=== fill_agricultural_row_fields ===');
if (asset.agricultural_purpose && agricultural_purposes[asset.agricultural_purpose]) {
@ -271,19 +271,30 @@ function fill_agricultural_row_fields(row, asset, agricultural_purposes, total_h
}
}
if (total_hectare > 0) {
row.torpaqsahəsi6001kodlarüzrəkvmetrlə6002kodlarüzrəhektarlaümumi = total_hectare;
console.log('Общая площадь:', total_hectare, 'га');
if (total_area > 0) { // ← ИЗМЕНЕНО с total_hectare
row.torpaqsahəsi6001kodlarüzrəkvmetrlə6002kodlarüzrəhektarlaümumi = total_area;
// Определяем единицу измерения для лога
let unit = 'единиц';
if (asset.agricultural_purpose) {
if (asset.agricultural_purpose === 'Təyinatı üzrə istifadə edilməyən kənd təsərrüfatı torpaqları üzrə hesablanmış vergi məbləği') {
unit = 'кв.м';
} else {
unit = 'га';
}
}
console.log('Общая площадь:', total_area, unit);
}
}
function calculate_agricultural_tax_for_row_silent(row, asset, total_hectare, group_info, callback) {
function calculate_agricultural_tax_for_row_silent(row, asset, total_area, group_info, callback) {
console.log('=== calculate_agricultural_tax_for_row_silent ===');
console.log('Параметры расчета:', {
hectare: total_hectare,
area: total_area, // ← ИЗМЕНЕНО с hectare
cadastral_district_name: asset.cadastral_district_name,
quality_groups: asset.quality_groups,
agricultural_land_purpose: asset.agricultural_land_purpose
agricultural_land_purpose: asset.agricultural_land_purpose,
agricultural_purpose: asset.agricultural_purpose
});
if (!asset.cadastral_district_name || !asset.quality_groups || !asset.agricultural_land_purpose) {
@ -295,15 +306,16 @@ function calculate_agricultural_tax_for_row_silent(row, asset, total_hectare, gr
frappe.call({
method: 'taxes_az.taxes_az.doctype.land_tax_declaration.land_tax_declaration.calculate_agricultural_tax',
args: {
hectare: total_hectare,
area_value: total_area, // ← ИЗМЕНЕНО с hectare
cadastral_district_name: asset.cadastral_district_name,
quality_groups: asset.quality_groups,
agricultural_land_purpose: asset.agricultural_land_purpose
agricultural_land_purpose: asset.agricultural_land_purpose,
agricultural_purpose_name: asset.agricultural_purpose // ← ДОБАВЛЕНО
},
callback: function(response) {
console.log('Результат расчета налога:', response);
if (response.message && response.message.tax_amount) {
if (response.message && 'tax_amount' in response.message) { // ← ИСПРАВЛЕНО
row.vergiməbləğimanatla = response.message.tax_amount;
console.log(`✅ Налог рассчитан: ${response.message.tax_amount} манат`);
@ -390,14 +402,14 @@ function group_and_create_industrial_rows_silent(frm, table_fieldname, assets, r
if (!grouped_assets[group_key]) {
grouped_assets[group_key] = {
asset: asset,
total_hectare: 0,
total_area: 0, // ← ИЗМЕНЕНО с total_hectare
count: 0,
asset_names: []
};
console.log(`Создана новая группа: "${group_key}"`);
}
grouped_assets[group_key].total_hectare += (asset.hectare || 0);
grouped_assets[group_key].total_area += (asset.area || 0); // ← ИЗМЕНЕНО с hectare
grouped_assets[group_key].count += 1;
grouped_assets[group_key].asset_names.push(asset.name);
});
@ -409,7 +421,7 @@ function group_and_create_industrial_rows_silent(frm, table_fieldname, assets, r
Object.entries(grouped_assets).forEach(([key, group]) => {
console.log(`Группа "${key}":`, {
количество_активов: group.count,
общая_площадь: group.total_hectare,
общая_площадь: group.total_area, // ← ИЗМЕНЕНО
активы: group.asset_names
});
});
@ -425,7 +437,7 @@ function group_and_create_industrial_rows_silent(frm, table_fieldname, assets, r
Object.entries(grouped_assets).forEach(function([group_key, group]) {
console.log(`Создание строки для группы: "${group_key}"`);
create_industrial_row_with_calculation_silent(frm, table_fieldname, group.asset, group.total_hectare, group, function() {
create_industrial_row_with_calculation_silent(frm, table_fieldname, group.asset, group.total_area, group, function() {
completed_calculations++;
console.log(`Прогресс создания строк: ${completed_calculations}/${total_groups}`);
@ -449,20 +461,20 @@ function create_industrial_group_key(asset) {
return key_parts.join('|');
}
function create_industrial_row_with_calculation_silent(frm, table_fieldname, asset, total_hectare, group_info, callback) {
function create_industrial_row_with_calculation_silent(frm, table_fieldname, asset, total_area, group_info, callback) {
console.log('=== create_industrial_row_with_calculation_silent ===');
console.log('Актив:', asset.name, 'Общая площадь:', total_hectare);
console.log('Актив:', asset.name, 'Общая площадь:', total_area, 'кв.м'); // ← ИЗМЕНЕНО
let row = frm.add_child(table_fieldname);
console.log('Строка добавлена в таблицу');
fill_industrial_row_fields(row, asset, total_hectare, group_info);
fill_industrial_row_fields(row, asset, total_area, group_info); // ← ИЗМЕНЕНО
console.log('Поля строки заполнены:', row);
calculate_industrial_tax_for_row_silent(row, asset, total_hectare, group_info, callback);
calculate_industrial_tax_for_row_silent(row, asset, total_area, group_info, callback); // ← ИЗМЕНЕНО
}
function fill_industrial_row_fields(row, asset, total_hectare, group_info) {
function fill_industrial_row_fields(row, asset, total_area, group_info) {
console.log('=== fill_industrial_row_fields ===');
if (asset.territorial_unit_code) {
@ -493,16 +505,16 @@ function fill_industrial_row_fields(row, asset, total_hectare, group_info) {
console.log('Полезные ископаемые:', asset.mining_note ? 'Да' : 'Нет');
}
if (total_hectare > 0) {
row.torpaqsahəsikvmetrləümumisahə = total_hectare;
console.log('Общая площадь:', total_hectare, 'м²');
if (total_area > 0) { // ← ИЗМЕНЕНО с total_hectare
row.torpaqsahəsikvmetrləümumisahə = total_area;
console.log('Общая площадь:', total_area, 'м²');
}
}
function calculate_industrial_tax_for_row_silent(row, asset, total_hectare, group_info, callback) {
function calculate_industrial_tax_for_row_silent(row, asset, total_area, group_info, callback) {
console.log('=== calculate_industrial_tax_for_row_silent ===');
console.log('Параметры расчета:', {
hectare: total_hectare,
area_sqm: total_area, // ← ИЗМЕНЕНО с hectare
territorial_unit_name: asset.territorial_unit_name,
industrial_land_purpose: asset.industrial_land_purpose
});
@ -516,14 +528,14 @@ function calculate_industrial_tax_for_row_silent(row, asset, total_hectare, grou
frappe.call({
method: 'taxes_az.taxes_az.doctype.land_tax_declaration.land_tax_declaration.calculate_industrial_tax',
args: {
hectare: total_hectare,
area_sqm: total_area, // ← ИЗМЕНЕНО с hectare
territorial_unit_name: asset.territorial_unit_name,
industrial_land_purpose: asset.industrial_land_purpose
},
callback: function(response) {
console.log('Результат расчета налога:', response);
if (response.message && response.message.tax_amount) {
if (response.message && 'tax_amount' in response.message) { // ← ИСПРАВЛЕНО
row.vergiməbləğimanatla = response.message.tax_amount;
console.log(`✅ Налог рассчитан: ${response.message.tax_amount} манат`);

View File

@ -81,14 +81,18 @@ def get_doctype_fields_info():
# ===============================
@frappe.whitelist()
def calculate_agricultural_tax(hectare, cadastral_district_name, quality_groups, agricultural_land_purpose):
def calculate_agricultural_tax(area_value, cadastral_district_name, quality_groups, agricultural_land_purpose, agricultural_purpose_name=None):
"""
Calculates tax for agricultural land
Formula: hectare × score × markup
area_value: может быть в гектарах или кв.м в зависимости от назначения
agricultural_purpose_name: название назначения для определения единицы измерения
"""
params_info = (
f"Параметры расчета:\n"
f" - hectare: {hectare}\n"
f" - area_value: {area_value}\n"
f" - agricultural_purpose_name: {agricultural_purpose_name}\n"
f" - cadastral_district_name: {cadastral_district_name}\n"
f" - quality_groups: {quality_groups}\n"
f" - agricultural_land_purpose: {agricultural_land_purpose}"
@ -97,11 +101,26 @@ def calculate_agricultural_tax(hectare, cadastral_district_name, quality_groups,
try:
# Input validation
if not hectare or not cadastral_district_name or not quality_groups or not agricultural_land_purpose:
if area_value is None or not cadastral_district_name or not quality_groups or not agricultural_land_purpose:
error_msg = "Не все поля заполнены для расчета"
frappe.log_error("Agri Tax Valid", error_msg)
frappe.throw(error_msg)
# Конвертируем площадь в гектары если нужно
hectare_value = float(area_value)
original_unit = "неизвестно"
# Если неиспользуемые земли - area_value в кв.м, конвертируем в гектары
if agricultural_purpose_name == 'Təyinatı üzrə istifadə edilməyən kənd təsərrüfatı torpaqları üzrə hesablanmış vergi məbləği':
if hectare_value > 0:
hectare_value = float(area_value) / 10000
original_unit = "кв.м"
frappe.log_error("Area Convert", f"Неиспользуемые земли: {area_value} кв.м → {hectare_value} гектар")
else:
# Используемые земли - уже в гектарах
original_unit = "гектары"
frappe.log_error("Area Direct", f"Используемые земли: {area_value} гектар (без конвертации)")
# Get score from JSON file
frappe.log_error("Get Cadastral", f"Получение балла для района '{cadastral_district_name}', группа '{quality_groups}'")
score = get_cadastral_score(cadastral_district_name, quality_groups)
@ -112,12 +131,14 @@ def calculate_agricultural_tax(hectare, cadastral_district_name, quality_groups,
markup = get_markup_coefficient(agricultural_land_purpose)
frappe.log_error("Markup Retrieved", f"Получен коэффициент: {markup}")
# Calculate using formula
result = float(hectare) * score * markup
# Calculate using formula (всегда в гектарах)
result = hectare_value * score * markup
calc_summary = (
f"Расчет завершен:\n"
f"Формула: {hectare} × {score} × {markup} = {result}\n"
f"Исходная площадь: {area_value} {original_unit}\n"
f"Площадь для расчета: {hectare_value} га\n"
f"Формула: {hectare_value} га × {score} × {markup} = {result}\n"
f"Результат: {result} манат"
)
frappe.log_error("Agri Tax Done", calc_summary)
@ -125,10 +146,12 @@ def calculate_agricultural_tax(hectare, cadastral_district_name, quality_groups,
return {
'tax_amount': result,
'calculation_details': {
'hectare': float(hectare),
'original_value': float(area_value),
'original_unit': original_unit,
'hectare': hectare_value,
'score': score,
'markup': markup,
'formula': f"{hectare} × {score} × {markup} = {result}"
'formula': f"{hectare_value} га × {score} × {markup} = {result}"
}
}
@ -220,14 +243,16 @@ def get_markup_coefficient(agricultural_land_purpose):
# ===============================
@frappe.whitelist()
def calculate_industrial_tax(hectare, territorial_unit_name, industrial_land_purpose):
def calculate_industrial_tax(area_sqm, territorial_unit_name, industrial_land_purpose):
"""
Calculates tax for industrial land
Formula: (area_in_sqm ÷ 100) × score (progressive system)
area_sqm: площадь в квадратных метрах
"""
params_info = (
f"Параметры расчета:\n"
f" - hectare (площадь в м²): {hectare}\n"
f" - area_sqm (площадь в м²): {area_sqm}\n"
f" - territorial_unit_name: {territorial_unit_name}\n"
f" - industrial_land_purpose: {industrial_land_purpose}"
)
@ -235,14 +260,14 @@ def calculate_industrial_tax(hectare, territorial_unit_name, industrial_land_pur
try:
# Input validation
if not hectare or not territorial_unit_name or not industrial_land_purpose:
if area_sqm is None or not territorial_unit_name or not industrial_land_purpose:
error_msg = "Не все поля заполнены для расчета"
frappe.log_error("Ind Tax Valid", error_msg)
frappe.throw(error_msg)
# Use value as is - this is square meters
area_sqm = float(hectare)
frappe.log_error("Area Converted", f"Площадь для расчета: {area_sqm} м²")
area_sqm_float = float(area_sqm)
frappe.log_error("Area Converted", f"Площадь для расчета: {area_sqm_float} м²")
# Get scores from JSON file
frappe.log_error("Get Ind Scores", f"Получение баллов для '{territorial_unit_name}', назначение '{industrial_land_purpose}'")
@ -251,7 +276,7 @@ def calculate_industrial_tax(hectare, territorial_unit_name, industrial_land_pur
# Calculate using progressive formula
frappe.log_error("Progressive Calc", "Начало расчета по прогрессивной формуле")
calculation_result = calculate_industrial_land_formula(area_sqm, score_data)
calculation_result = calculate_industrial_land_formula(area_sqm_float, score_data)
calc_summary = (
f"Расчет завершен:\n"
@ -443,7 +468,7 @@ def get_assets_for_year(asset_type, year):
'cadastral_district_code',
'quality_groups',
'agricultural_land_purpose',
'hectare',
'area', # ← ИЗМЕНЕНО с hectare на area
'purchase_date'
]
asset_type_short = "Сельхоз земли"
@ -455,7 +480,7 @@ def get_assets_for_year(asset_type, year):
'territorial_unit_code',
'industrial_land_purpose',
'mining_note',
'hectare',
'area', # ← ИЗМЕНЕНО с hectare на area
'purchase_date'
]
asset_type_short = "Промышленные земли"
@ -482,7 +507,8 @@ def get_assets_for_year(asset_type, year):
if purchase_year == target_year:
filtered_assets.append(asset)
frappe.log_error("Asset Matched", f"Актив подходит: {asset['name']} (дата: {asset['purchase_date']})")
area_value = asset.get('area', 0)
frappe.log_error("Asset Matched", f"Актив подходит: {asset['name']} (дата: {asset['purchase_date']}, площадь: {area_value})")
else:
skipped_wrong_year += 1
frappe.log_error("Asset Skipped", f"Актив пропущен: {asset['name']} (год: {purchase_year}, нужен {target_year})")