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]) { if (!grouped_assets[group_key]) {
grouped_assets[group_key] = { grouped_assets[group_key] = {
asset: asset, asset: asset,
total_hectare: 0, total_area: 0, // ← ИЗМЕНЕНО с total_hectare
count: 0, count: 0,
asset_names: [] asset_names: []
}; };
console.log(`Создана новая группа: "${group_key}"`); 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].count += 1;
grouped_assets[group_key].asset_names.push(asset.name); 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]) => { Object.entries(grouped_assets).forEach(([key, group]) => {
console.log(`Группа "${key}":`, { console.log(`Группа "${key}":`, {
количество_активов: group.count, количество_активов: group.count,
общая_площадь: group.total_hectare, общая_площадь: group.total_area, // ← ИЗМЕНЕНО
активы: group.asset_names активы: 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]) { Object.entries(grouped_assets).forEach(function([group_key, group]) {
console.log(`Создание строки для группы: "${group_key}"`); 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++; completed_calculations++;
console.log(`Прогресс создания строк: ${completed_calculations}/${total_groups}`); console.log(`Прогресс создания строк: ${completed_calculations}/${total_groups}`);
@ -218,20 +218,20 @@ function create_agricultural_group_key(asset, agricultural_purposes) {
return key_parts.join('|'); 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('=== 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); let row = frm.add_child(table_fieldname);
console.log('Строка добавлена в таблицу'); 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); 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 ==='); console.log('=== fill_agricultural_row_fields ===');
if (asset.agricultural_purpose && agricultural_purposes[asset.agricultural_purpose]) { 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) { if (total_area > 0) { // ← ИЗМЕНЕНО с total_hectare
row.torpaqsahəsi6001kodlarüzrəkvmetrlə6002kodlarüzrəhektarlaümumi = total_hectare; row.torpaqsahəsi6001kodlarüzrəkvmetrlə6002kodlarüzrəhektarlaümumi = total_area;
console.log('Общая площадь:', total_hectare, 'га');
// Определяем единицу измерения для лога
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('=== calculate_agricultural_tax_for_row_silent ===');
console.log('Параметры расчета:', { console.log('Параметры расчета:', {
hectare: total_hectare, area: total_area, // ← ИЗМЕНЕНО с hectare
cadastral_district_name: asset.cadastral_district_name, cadastral_district_name: asset.cadastral_district_name,
quality_groups: asset.quality_groups, 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) { 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({ frappe.call({
method: 'taxes_az.taxes_az.doctype.land_tax_declaration.land_tax_declaration.calculate_agricultural_tax', method: 'taxes_az.taxes_az.doctype.land_tax_declaration.land_tax_declaration.calculate_agricultural_tax',
args: { args: {
hectare: total_hectare, area_value: total_area, // ← ИЗМЕНЕНО с hectare
cadastral_district_name: asset.cadastral_district_name, cadastral_district_name: asset.cadastral_district_name,
quality_groups: asset.quality_groups, 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) { callback: function(response) {
console.log('Результат расчета налога:', 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; row.vergiməbləğimanatla = response.message.tax_amount;
console.log(`✅ Налог рассчитан: ${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]) { if (!grouped_assets[group_key]) {
grouped_assets[group_key] = { grouped_assets[group_key] = {
asset: asset, asset: asset,
total_hectare: 0, total_area: 0, // ← ИЗМЕНЕНО с total_hectare
count: 0, count: 0,
asset_names: [] asset_names: []
}; };
console.log(`Создана новая группа: "${group_key}"`); 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].count += 1;
grouped_assets[group_key].asset_names.push(asset.name); 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]) => { Object.entries(grouped_assets).forEach(([key, group]) => {
console.log(`Группа "${key}":`, { console.log(`Группа "${key}":`, {
количество_активов: group.count, количество_активов: group.count,
общая_площадь: group.total_hectare, общая_площадь: group.total_area, // ← ИЗМЕНЕНО
активы: group.asset_names активы: 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]) { Object.entries(grouped_assets).forEach(function([group_key, group]) {
console.log(`Создание строки для группы: "${group_key}"`); 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++; completed_calculations++;
console.log(`Прогресс создания строк: ${completed_calculations}/${total_groups}`); console.log(`Прогресс создания строк: ${completed_calculations}/${total_groups}`);
@ -449,20 +461,20 @@ function create_industrial_group_key(asset) {
return key_parts.join('|'); 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('=== 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); let row = frm.add_child(table_fieldname);
console.log('Строка добавлена в таблицу'); 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); 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 ==='); console.log('=== fill_industrial_row_fields ===');
if (asset.territorial_unit_code) { 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 ? 'Да' : 'Нет'); console.log('Полезные ископаемые:', asset.mining_note ? 'Да' : 'Нет');
} }
if (total_hectare > 0) { if (total_area > 0) { // ← ИЗМЕНЕНО с total_hectare
row.torpaqsahəsikvmetrləümumisahə = total_hectare; row.torpaqsahəsikvmetrləümumisahə = total_area;
console.log('Общая площадь:', total_hectare, 'м²'); 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('=== calculate_industrial_tax_for_row_silent ===');
console.log('Параметры расчета:', { console.log('Параметры расчета:', {
hectare: total_hectare, area_sqm: total_area, // ← ИЗМЕНЕНО с hectare
territorial_unit_name: asset.territorial_unit_name, territorial_unit_name: asset.territorial_unit_name,
industrial_land_purpose: asset.industrial_land_purpose 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({ frappe.call({
method: 'taxes_az.taxes_az.doctype.land_tax_declaration.land_tax_declaration.calculate_industrial_tax', method: 'taxes_az.taxes_az.doctype.land_tax_declaration.land_tax_declaration.calculate_industrial_tax',
args: { args: {
hectare: total_hectare, area_sqm: total_area, // ← ИЗМЕНЕНО с hectare
territorial_unit_name: asset.territorial_unit_name, territorial_unit_name: asset.territorial_unit_name,
industrial_land_purpose: asset.industrial_land_purpose industrial_land_purpose: asset.industrial_land_purpose
}, },
callback: function(response) { callback: function(response) {
console.log('Результат расчета налога:', 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; row.vergiməbləğimanatla = response.message.tax_amount;
console.log(`✅ Налог рассчитан: ${response.message.tax_amount} манат`); console.log(`✅ Налог рассчитан: ${response.message.tax_amount} манат`);

View File

@ -81,14 +81,18 @@ def get_doctype_fields_info():
# =============================== # ===============================
@frappe.whitelist() @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 Calculates tax for agricultural land
Formula: hectare × score × markup Formula: hectare × score × markup
area_value: может быть в гектарах или кв.м в зависимости от назначения
agricultural_purpose_name: название назначения для определения единицы измерения
""" """
params_info = ( params_info = (
f"Параметры расчета:\n" 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" - cadastral_district_name: {cadastral_district_name}\n"
f" - quality_groups: {quality_groups}\n" f" - quality_groups: {quality_groups}\n"
f" - agricultural_land_purpose: {agricultural_land_purpose}" f" - agricultural_land_purpose: {agricultural_land_purpose}"
@ -97,11 +101,26 @@ def calculate_agricultural_tax(hectare, cadastral_district_name, quality_groups,
try: try:
# Input validation # 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 = "Не все поля заполнены для расчета" error_msg = "Не все поля заполнены для расчета"
frappe.log_error("Agri Tax Valid", error_msg) frappe.log_error("Agri Tax Valid", error_msg)
frappe.throw(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 # Get score from JSON file
frappe.log_error("Get Cadastral", f"Получение балла для района '{cadastral_district_name}', группа '{quality_groups}'") frappe.log_error("Get Cadastral", f"Получение балла для района '{cadastral_district_name}', группа '{quality_groups}'")
score = get_cadastral_score(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) markup = get_markup_coefficient(agricultural_land_purpose)
frappe.log_error("Markup Retrieved", f"Получен коэффициент: {markup}") frappe.log_error("Markup Retrieved", f"Получен коэффициент: {markup}")
# Calculate using formula # Calculate using formula (всегда в гектарах)
result = float(hectare) * score * markup result = hectare_value * score * markup
calc_summary = ( calc_summary = (
f"Расчет завершен:\n" 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} манат" f"Результат: {result} манат"
) )
frappe.log_error("Agri Tax Done", calc_summary) frappe.log_error("Agri Tax Done", calc_summary)
@ -125,10 +146,12 @@ def calculate_agricultural_tax(hectare, cadastral_district_name, quality_groups,
return { return {
'tax_amount': result, 'tax_amount': result,
'calculation_details': { 'calculation_details': {
'hectare': float(hectare), 'original_value': float(area_value),
'original_unit': original_unit,
'hectare': hectare_value,
'score': score, 'score': score,
'markup': markup, '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() @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 Calculates tax for industrial land
Formula: (area_in_sqm ÷ 100) × score (progressive system) Formula: (area_in_sqm ÷ 100) × score (progressive system)
area_sqm: площадь в квадратных метрах
""" """
params_info = ( params_info = (
f"Параметры расчета:\n" f"Параметры расчета:\n"
f" - hectare (площадь в м²): {hectare}\n" f" - area_sqm (площадь в м²): {area_sqm}\n"
f" - territorial_unit_name: {territorial_unit_name}\n" f" - territorial_unit_name: {territorial_unit_name}\n"
f" - industrial_land_purpose: {industrial_land_purpose}" f" - industrial_land_purpose: {industrial_land_purpose}"
) )
@ -235,14 +260,14 @@ def calculate_industrial_tax(hectare, territorial_unit_name, industrial_land_pur
try: try:
# Input validation # 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 = "Не все поля заполнены для расчета" error_msg = "Не все поля заполнены для расчета"
frappe.log_error("Ind Tax Valid", error_msg) frappe.log_error("Ind Tax Valid", error_msg)
frappe.throw(error_msg) frappe.throw(error_msg)
# Use value as is - this is square meters # Use value as is - this is square meters
area_sqm = float(hectare) area_sqm_float = float(area_sqm)
frappe.log_error("Area Converted", f"Площадь для расчета: {area_sqm} м²") frappe.log_error("Area Converted", f"Площадь для расчета: {area_sqm_float} м²")
# Get scores from JSON file # Get scores from JSON file
frappe.log_error("Get Ind Scores", f"Получение баллов для '{territorial_unit_name}', назначение '{industrial_land_purpose}'") 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 # Calculate using progressive formula
frappe.log_error("Progressive Calc", "Начало расчета по прогрессивной формуле") 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 = ( calc_summary = (
f"Расчет завершен:\n" f"Расчет завершен:\n"
@ -443,7 +468,7 @@ def get_assets_for_year(asset_type, year):
'cadastral_district_code', 'cadastral_district_code',
'quality_groups', 'quality_groups',
'agricultural_land_purpose', 'agricultural_land_purpose',
'hectare', 'area', # ← ИЗМЕНЕНО с hectare на area
'purchase_date' 'purchase_date'
] ]
asset_type_short = "Сельхоз земли" asset_type_short = "Сельхоз земли"
@ -455,7 +480,7 @@ def get_assets_for_year(asset_type, year):
'territorial_unit_code', 'territorial_unit_code',
'industrial_land_purpose', 'industrial_land_purpose',
'mining_note', 'mining_note',
'hectare', 'area', # ← ИЗМЕНЕНО с hectare на area
'purchase_date' 'purchase_date'
] ]
asset_type_short = "Промышленные земли" asset_type_short = "Промышленные земли"
@ -482,7 +507,8 @@ def get_assets_for_year(asset_type, year):
if purchase_year == target_year: if purchase_year == target_year:
filtered_assets.append(asset) 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: else:
skipped_wrong_year += 1 skipped_wrong_year += 1
frappe.log_error("Asset Skipped", f"Актив пропущен: {asset['name']} (год: {purchase_year}, нужен {target_year})") frappe.log_error("Asset Skipped", f"Актив пропущен: {asset['name']} (год: {purchase_year}, нужен {target_year})")