Bug fix for property tax return
This commit is contained in:
parent
ffd35450e0
commit
536b2b8406
|
|
@ -0,0 +1,104 @@
|
||||||
|
# ПРАВИЛЬНАЯ ВЕРСИЯ ФУНКЦИИ populate_property_tax_tables
|
||||||
|
# Скопируй эту функцию в property_tax_return.py, заменив старую версию (строки 15-96)
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def populate_property_tax_tables(company, year, from_date, to_date, calculation_mode, existing_elave_1, existing_elave_2):
|
||||||
|
"""
|
||||||
|
Main method to populate Property Tax Return child tables from Asset data
|
||||||
|
|
||||||
|
Args:
|
||||||
|
company: Company name
|
||||||
|
year: Tax year (integer)
|
||||||
|
from_date: Start date (YYYY-MM-DD)
|
||||||
|
to_date: End date (YYYY-MM-DD)
|
||||||
|
calculation_mode: 'tam_il' or 'il_erzinde'
|
||||||
|
existing_elave_1: Existing Əlavə 1 rows (JSON array)
|
||||||
|
existing_elave_2: Existing Əlavə 2 rows (JSON array)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Dictionary with elave_1_data and elave_2_data mappings
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# Parse JSON if needed
|
||||||
|
if isinstance(existing_elave_1, str):
|
||||||
|
existing_elave_1 = json.loads(existing_elave_1)
|
||||||
|
if isinstance(existing_elave_2, str):
|
||||||
|
existing_elave_2 = json.loads(existing_elave_2)
|
||||||
|
|
||||||
|
# Get aggregated asset data
|
||||||
|
taxable_aggregated = get_taxable_assets_aggregated(company, from_date, to_date)
|
||||||
|
tax_exempt_aggregated = get_tax_exempt_assets_aggregated(company, from_date, to_date)
|
||||||
|
|
||||||
|
# Map to rows with proper field names based on calculation_mode
|
||||||
|
# Use fuzzy matching for Əlavə 2 (Taxable Assets)
|
||||||
|
elave_2_data = {}
|
||||||
|
for category, data in taxable_aggregated.items():
|
||||||
|
# Find matching row by partial match (e.g., "Mənzillər" matches "1.5 Mənzillər")
|
||||||
|
matching_key = find_matching_category(category, existing_elave_2)
|
||||||
|
|
||||||
|
if matching_key:
|
||||||
|
if calculation_mode == 'tam_il':
|
||||||
|
elave_2_data[matching_key] = {
|
||||||
|
'hesabatilininəvvəlinəəsasvəsaitlərinqalıqdəyəri': data['value_as_on_from_date'],
|
||||||
|
'hesabatilinsonunaəsasvəsaitlərinqalıqdəyəri': data['net_asset_value_as_on_to_date'],
|
||||||
|
'hesabatilierzindeuçotaalınan': 0
|
||||||
|
}
|
||||||
|
else: # il_erzinde
|
||||||
|
# Бизнес-правило: Для компаний, созданных в течение года (İl Ərzində),
|
||||||
|
# если нет новых покупок (value_of_new_purchase < 0.01), то все поля = 0
|
||||||
|
if flt(data.get('value_of_new_purchase', 0)) >= 0.01:
|
||||||
|
elave_2_data[matching_key] = {
|
||||||
|
'hesabatilierzindeuçotaalınan': data['value_of_new_purchase'],
|
||||||
|
'hesabatilinsonunaəsasvəsaitlərinqalıqdəyəri': data['net_asset_value_as_on_to_date'],
|
||||||
|
'hesabatilininəvvəlinəəsasvəsaitlərinqalıqdəyəri': 0
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
# Нет новых покупок - очистить все поля
|
||||||
|
elave_2_data[matching_key] = {
|
||||||
|
'hesabatilierzindeuçotaalınan': 0,
|
||||||
|
'hesabatilinsonunaəsasvəsaitlərinqalıqdəyəri': 0,
|
||||||
|
'hesabatilininəvvəlinəəsasvəsaitlərinqalıqdəyəri': 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Map to rows with fuzzy matching for Əlavə 1 (Tax Exempt Assets)
|
||||||
|
elave_1_data = {}
|
||||||
|
for article_number, data in tax_exempt_aggregated.items():
|
||||||
|
# Find matching row by article number in "Azadolma səbəbi"
|
||||||
|
matching_key = find_matching_azadolma_sebeb(article_number, existing_elave_1)
|
||||||
|
|
||||||
|
if matching_key:
|
||||||
|
if calculation_mode == 'tam_il':
|
||||||
|
elave_1_data[matching_key] = {
|
||||||
|
'hesabatilininəvvəlinəəsasvəsaitlərinqalıqdəyərimanatla5012': data['value_as_on_from_date'],
|
||||||
|
'ilinsonunaəsasvəsaitlərinqalıqdəyəri': data['net_asset_value_as_on_to_date'],
|
||||||
|
'hesabatiliərzindəəsasvəsaitlərinqalıqdəyəri': 0
|
||||||
|
}
|
||||||
|
else: # il_erzinde
|
||||||
|
# Бизнес-правило: Для компаний, созданных в течение года (İl Ərzində),
|
||||||
|
# если нет новых покупок (value_of_new_purchase < 0.01), то все поля = 0
|
||||||
|
if flt(data.get('value_of_new_purchase', 0)) >= 0.01:
|
||||||
|
elave_1_data[matching_key] = {
|
||||||
|
'hesabatiliərzindəəsasvəsaitlərinqalıqdəyəri': data['value_of_new_purchase'],
|
||||||
|
'ilinsonunaəsasvəsaitlərinqalıqdəyəri': data['net_asset_value_as_on_to_date'],
|
||||||
|
'hesabatilininəvvəlinəəsasvəsaitlərinqalıqdəyərimanatla5012': 0
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
# Нет новых покупок - очистить все поля
|
||||||
|
elave_1_data[matching_key] = {
|
||||||
|
'hesabatiliərzindəəsasvəsaitlərinqalıqdəyəri': 0,
|
||||||
|
'ilinsonunaəsasvəsaitlərinqalıqdəyəri': 0,
|
||||||
|
'hesabatilininəvvəlinəəsasvəsaitlərinqalıqdəyərimanatla5012': 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': True,
|
||||||
|
'elave_1_data': elave_1_data,
|
||||||
|
'elave_2_data': elave_2_data
|
||||||
|
}
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
frappe.log_error(f"Error in populate_property_tax_tables: {str(e)}", "Property Tax Return")
|
||||||
|
return {
|
||||||
|
'success': False,
|
||||||
|
'error': str(e)
|
||||||
|
}
|
||||||
|
|
@ -56,15 +56,20 @@ def populate_property_tax_tables(company, year, from_date, to_date, calculation_
|
||||||
}
|
}
|
||||||
else: # il_erzinde
|
else: # il_erzinde
|
||||||
# Бизнес-правило: Для компаний, созданных в течение года (İl Ərzində),
|
# Бизнес-правило: Для компаний, созданных в течение года (İl Ərzində),
|
||||||
# заполнять поля только если есть реальные новые покупки.
|
# если нет новых покупок (value_of_new_purchase < 0.01), то все поля = 0
|
||||||
# Если value_of_new_purchase = 0 или < 0.01, пропустить эту категорию,
|
|
||||||
# чтобы строка осталась без изменений.
|
|
||||||
if flt(data.get('value_of_new_purchase', 0)) >= 0.01:
|
if flt(data.get('value_of_new_purchase', 0)) >= 0.01:
|
||||||
elave_2_data[matching_key] = {
|
elave_2_data[matching_key] = {
|
||||||
'hesabatilierzindeuçotaalınan': data['value_of_new_purchase'],
|
'hesabatilierzindeuçotaalınan': data['value_of_new_purchase'],
|
||||||
'hesabatilinsonunaəsasvəsaitlərinqalıqdəyəri': data['net_asset_value_as_on_to_date'],
|
'hesabatilinsonunaəsasvəsaitlərinqalıqdəyəri': data['net_asset_value_as_on_to_date'],
|
||||||
'hesabatilininəvvəlinəəsasvəsaitlərinqalıqdəyəri': 0
|
'hesabatilininəvvəlinəəsasvəsaitlərinqalıqdəyəri': 0
|
||||||
}
|
}
|
||||||
|
else:
|
||||||
|
# Нет новых покупок - очистить все поля
|
||||||
|
elave_2_data[matching_key] = {
|
||||||
|
'hesabatilierzindeuçotaalınan': 0,
|
||||||
|
'hesabatilinsonunaəsasvəsaitlərinqalıqdəyəri': 0,
|
||||||
|
'hesabatilininəvvəlinəəsasvəsaitlərinqalıqdəyəri': 0
|
||||||
|
}
|
||||||
|
|
||||||
# Map to rows with fuzzy matching for Əlavə 1 (Tax Exempt Assets)
|
# Map to rows with fuzzy matching for Əlavə 1 (Tax Exempt Assets)
|
||||||
elave_1_data = {}
|
elave_1_data = {}
|
||||||
|
|
@ -81,15 +86,20 @@ def populate_property_tax_tables(company, year, from_date, to_date, calculation_
|
||||||
}
|
}
|
||||||
else: # il_erzinde
|
else: # il_erzinde
|
||||||
# Бизнес-правило: Для компаний, созданных в течение года (İl Ərzində),
|
# Бизнес-правило: Для компаний, созданных в течение года (İl Ərzində),
|
||||||
# заполнять поля только если есть реальные новые покупки.
|
# если нет новых покупок (value_of_new_purchase < 0.01), то все поля = 0
|
||||||
# Если value_of_new_purchase = 0 или < 0.01, пропустить эту категорию,
|
|
||||||
# чтобы строка осталась без изменений.
|
|
||||||
if flt(data.get('value_of_new_purchase', 0)) >= 0.01:
|
if flt(data.get('value_of_new_purchase', 0)) >= 0.01:
|
||||||
elave_1_data[matching_key] = {
|
elave_1_data[matching_key] = {
|
||||||
'hesabatiliərzindəəsasvəsaitlərinqalıqdəyəri': data['value_of_new_purchase'],
|
'hesabatiliərzindəəsasvəsaitlərinqalıqdəyəri': data['value_of_new_purchase'],
|
||||||
'ilinsonunaəsasvəsaitlərinqalıqdəyəri': data['net_asset_value_as_on_to_date'],
|
'ilinsonunaəsasvəsaitlərinqalıqdəyəri': data['net_asset_value_as_on_to_date'],
|
||||||
'hesabatilininəvvəlinəəsasvəsaitlərinqalıqdəyərimanatla5012': 0
|
'hesabatilininəvvəlinəəsasvəsaitlərinqalıqdəyərimanatla5012': 0
|
||||||
}
|
}
|
||||||
|
else:
|
||||||
|
# Нет новых покупок - очистить все поля
|
||||||
|
elave_1_data[matching_key] = {
|
||||||
|
'hesabatiliərzindəəsasvəsaitlərinqalıqdəyəri': 0,
|
||||||
|
'ilinsonunaəsasvəsaitlərinqalıqdəyəri': 0,
|
||||||
|
'hesabatilininəvvəlinəəsasvəsaitlərinqalıqdəyərimanatla5012': 0
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': True,
|
'success': True,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
===========================================
|
||||||
|
ИНСТРУКЦИЯ ПО ПРИМЕНЕНИЮ ИСПРАВЛЕНИЯ
|
||||||
|
===========================================
|
||||||
|
|
||||||
|
ПРОБЛЕМА:
|
||||||
|
---------
|
||||||
|
Когда выбран режим "İl Ərzində" и в поле "Value of New Purchase" (503.x) = 0,
|
||||||
|
система все равно показывала цифры в полях 501.x и 504.x (старые значения от Tam İl).
|
||||||
|
|
||||||
|
РЕШЕНИЕ:
|
||||||
|
--------
|
||||||
|
В режиме İl Ərzində ВСЕГДА обновлять строку:
|
||||||
|
- Если value_of_new_purchase >= 0.01: заполнить 503.x и 504.x
|
||||||
|
- Если value_of_new_purchase < 0.01: установить ВСЕ поля = 0 (очистка)
|
||||||
|
|
||||||
|
ЧТО ДЕЛАТЬ:
|
||||||
|
-----------
|
||||||
|
|
||||||
|
1. Открой файл:
|
||||||
|
/home/frappe/frappe-bench/apps/taxes_az/taxes_az/taxes_az/doctype/property_tax_return/property_tax_return.py
|
||||||
|
|
||||||
|
2. Найди функцию populate_property_tax_tables (начинается на строке ~15)
|
||||||
|
|
||||||
|
3. ЗАМЕНИ ВСЮ ФУНКЦИЮ (от @frappe.whitelist() до конца функции, около 82 строк)
|
||||||
|
на код из файла: FIXED_populate_function.py
|
||||||
|
|
||||||
|
4. Сохрани файл
|
||||||
|
|
||||||
|
5. Очисти кэш и перезапусти:
|
||||||
|
cd /home/frappe/frappe-bench
|
||||||
|
bench --site site1 clear-cache
|
||||||
|
bench restart
|
||||||
|
|
||||||
|
ИЗМЕНЕНИЯ В JS:
|
||||||
|
---------------
|
||||||
|
НЕ НУЖНЫ! Все изменения только в Python файле.
|
||||||
|
|
||||||
|
ПРОВЕРКА:
|
||||||
|
---------
|
||||||
|
1. Открой Property Tax Return
|
||||||
|
2. Выбери İl Ərzində, год 2025
|
||||||
|
3. Если нет новых покупок активов (503.1 = 0)
|
||||||
|
→ Должны быть ВСЕ поля = 0 (501.1 = 0, 503.1 = 0, 504.1 = 0)
|
||||||
|
|
||||||
|
4. Если есть новые покупки (503.1 > 0)
|
||||||
|
→ Должны заполниться 503.1 и 504.1, а 501.1 = 0
|
||||||
|
|
||||||
|
ФАЙЛЫ:
|
||||||
|
------
|
||||||
|
- FIXED_populate_function.py - правильная версия функции
|
||||||
|
- ИНСТРУКЦИЯ.txt - эта инструкция
|
||||||
|
|
||||||
|
===========================================
|
||||||
Loading…
Reference in New Issue