diff --git a/taxes_az/taxes_az/report/land_tax_report/land_tax_report.py b/taxes_az/taxes_az/report/land_tax_report/land_tax_report.py index 9488129..5c2019b 100644 --- a/taxes_az/taxes_az/report/land_tax_report/land_tax_report.py +++ b/taxes_az/taxes_az/report/land_tax_report/land_tax_report.py @@ -4,6 +4,10 @@ import frappe from frappe import _ from frappe.utils import flt +from taxes_az.taxes_az.doctype.land_tax_declaration.land_tax_declaration import ( + calculate_agricultural_tax, + calculate_industrial_tax +) def execute(filters=None): @@ -47,13 +51,15 @@ def get_data(filters): full_article_name = tax_article_names_mapping[tax_article_name] if full_article_name in tax_articles_mapping: field_key = tax_articles_mapping[full_article_name] - asset_cost = flt(asset['total_asset_cost']) - + + # ИЗМЕНЕНИЕ: Рассчитываем налог по формуле + calculated_tax = calculate_tax_for_agricultural_asset(asset) + # Для статьи 207.8 применяем коэффициент 75% if field_key == 'vm_207_8': - asset_cost = asset_cost * 0.75 - - row[field_key] = asset_cost + calculated_tax = calculated_tax * 0.75 + + row[field_key] = calculated_tax # Проверяем industrial_tax_article elif asset.get('industrial_tax_article'): @@ -62,13 +68,15 @@ def get_data(filters): full_article_name = tax_article_names_mapping[tax_article_name] if full_article_name in tax_articles_mapping: field_key = tax_articles_mapping[full_article_name] - asset_cost = flt(asset['total_asset_cost']) - + + # ИЗМЕНЕНИЕ: Рассчитываем налог по формуле + calculated_tax = calculate_tax_for_industrial_asset(asset) + # Для статьи 207.8 применяем коэффициент 75% if field_key == 'vm_207_8': - asset_cost = asset_cost * 0.75 - - row[field_key] = asset_cost + calculated_tax = calculated_tax * 0.75 + + row[field_key] = calculated_tax # Добавляем строку только если есть tax_article if asset.get('agricultural_tax_article') or asset.get('industrial_tax_article'): @@ -110,17 +118,28 @@ def get_assets(filters): where_clause = "WHERE " + " AND ".join(conditions) query = f""" - SELECT + SELECT name, asset_name, company, agricultural_tax_article, industrial_tax_article, - total_asset_cost - FROM + total_asset_cost, + agricultural_purpose, + cadastral_district_name, + cadastral_district_code, + quality_groups, + agricultural_land_purpose, + territorial_unit_name, + territorial_unit_code, + industrial_land_purpose, + mining_note, + tax_exempt_area, + area + FROM `tabAsset` {where_clause} - ORDER BY + ORDER BY name """ @@ -164,7 +183,7 @@ def get_field_to_label_mapping(): def get_columns(): """Создает колонки отчета""" columns = [] - + # Основные колонки columns.extend([ { @@ -181,10 +200,10 @@ def get_columns(): "width": 200 } ]) - + # Получаем маппинг полей к названиям field_to_label = get_field_to_label_mapping() - + # Создаем колонки для каждого поля в правильном порядке for field_key in sorted(field_to_label.keys()): label = field_to_label[field_key] @@ -194,5 +213,54 @@ def get_columns(): "fieldtype": "Currency", "width": 120 }) - - return columns \ No newline at end of file + + return columns + + +def calculate_tax_for_agricultural_asset(asset): + """Рассчитывает налог для сельскохозяйственной земли""" + try: + # Определяем agricultural_purpose_name + agricultural_purpose_name = get_agricultural_purpose_name(asset.get('agricultural_purpose')) + + # Вызываем функцию расчета из land_tax_declaration + result = calculate_agricultural_tax( + area_value=asset.get('area'), + cadastral_district_name=asset.get('cadastral_district_name'), + quality_groups=asset.get('quality_groups'), + agricultural_land_purpose=asset.get('agricultural_land_purpose'), + agricultural_purpose_name=agricultural_purpose_name + ) + + return result.get('tax_amount', 0) if isinstance(result, dict) else 0 + except Exception as e: + frappe.log_error(f"Error calculating agricultural tax for asset {asset.get('name')}: {str(e)}") + return 0 + + +def calculate_tax_for_industrial_asset(asset): + """Рассчитывает налог для промышленной земли""" + try: + # Вызываем функцию расчета из land_tax_declaration + result = calculate_industrial_tax( + area_sqm=asset.get('area'), + territorial_unit_name=asset.get('territorial_unit_name'), + industrial_land_purpose=asset.get('industrial_land_purpose') + ) + + return result.get('tax_amount', 0) if isinstance(result, dict) else 0 + except Exception as e: + frappe.log_error(f"Error calculating industrial tax for asset {asset.get('name')}: {str(e)}") + return 0 + + +def get_agricultural_purpose_name(agricultural_purpose_id): + """Получает название agricultural purpose по ID""" + if not agricultural_purpose_id: + return None + + try: + purpose_doc = frappe.get_doc('Agricultural Purpose Type', agricultural_purpose_id) + return purpose_doc.purpose_name + except: + return None \ No newline at end of file