fixed tax exempt report
This commit is contained in:
parent
1bfb268a68
commit
2af0325808
|
|
@ -24,8 +24,8 @@ def get_data(filters):
|
|||
if not assets_data:
|
||||
return []
|
||||
|
||||
# Получаем расчеты остатков для этих активов
|
||||
asset_balances = get_asset_balances(filters, [asset['name'] for asset in assets_data])
|
||||
# Получаем расчеты балансов для этих активов из стандартного отчета
|
||||
asset_balances = get_asset_balances_from_standard_report(filters, [asset['name'] for asset in assets_data])
|
||||
|
||||
# Формируем итоговые данные
|
||||
data = []
|
||||
|
|
@ -42,20 +42,9 @@ def get_data(filters):
|
|||
# Находим баланс для этого актива
|
||||
asset_balance = next((bal for bal in asset_balances if bal['asset'] == asset['name']), {})
|
||||
|
||||
# Рассчитываем остатки на начало и конец периода
|
||||
# Берем значения из стандартного отчета
|
||||
value_as_on_from_date = flt(asset_balance.get('value_as_on_from_date', 0))
|
||||
value_of_new_purchase = flt(asset_balance.get('value_of_new_purchase', 0))
|
||||
value_of_sold_asset = flt(asset_balance.get('value_of_sold_asset', 0))
|
||||
value_of_scrapped_asset = flt(asset_balance.get('value_of_scrapped_asset', 0))
|
||||
value_of_capitalized_asset = flt(asset_balance.get('value_of_capitalized_asset', 0))
|
||||
|
||||
value_as_on_to_date = (
|
||||
value_as_on_from_date +
|
||||
value_of_new_purchase -
|
||||
value_of_sold_asset -
|
||||
value_of_scrapped_asset -
|
||||
value_of_capitalized_asset
|
||||
)
|
||||
net_asset_value_as_on_to_date = flt(asset_balance.get('net_asset_value_as_on_to_date', 0))
|
||||
|
||||
# Инициализируем все колонки нулями
|
||||
for article in tax_exempt_articles:
|
||||
|
|
@ -68,7 +57,7 @@ def get_data(filters):
|
|||
if asset['tax_exempt_tax_article']:
|
||||
article_key = get_field_key(asset['tax_exempt_tax_article'])
|
||||
row[f"{article_key}_value_from"] = value_as_on_from_date
|
||||
row[f"{article_key}_value_to"] = value_as_on_to_date
|
||||
row[f"{article_key}_value_to"] = net_asset_value_as_on_to_date
|
||||
row[f"{article_key}_insured"] = row.insured_value
|
||||
|
||||
data.append(row)
|
||||
|
|
@ -220,84 +209,140 @@ def get_assets_with_tax_exempt_articles(filters, tax_exempt_articles):
|
|||
return frappe.db.sql(query, values, as_dict=True)
|
||||
|
||||
|
||||
def get_asset_balances(filters, asset_names):
|
||||
"""Рассчитывает остатки активов на основе стандартной логики"""
|
||||
def get_asset_balances_from_standard_report(filters, asset_names):
|
||||
"""Получает балансы активов используя логику стандартного отчета Asset Depreciations and Balances"""
|
||||
|
||||
if not asset_names:
|
||||
return []
|
||||
|
||||
# Получаем детали активов
|
||||
asset_details = get_asset_details_for_tax_exempt(filters, asset_names)
|
||||
|
||||
# Получаем депреciацию активов
|
||||
asset_depreciation = get_asset_depreciation_for_tax_exempt(filters, asset_names)
|
||||
|
||||
# Получаем корректировки стоимости
|
||||
asset_value_adjustments = get_asset_value_adjustments_for_tax_exempt(filters, asset_names)
|
||||
|
||||
# Объединяем данные
|
||||
result = []
|
||||
|
||||
for asset_detail in asset_details:
|
||||
asset_name = asset_detail.get('name')
|
||||
|
||||
# Находим депреciацию для актива
|
||||
depreciation = next(
|
||||
(dep for dep in asset_depreciation if dep['asset'] == asset_name),
|
||||
{}
|
||||
)
|
||||
|
||||
# Находим корректировки для актива
|
||||
adjustments = asset_value_adjustments.get(asset_name, {
|
||||
'adjustment_before_from_date': 0.0,
|
||||
'adjustment_till_to_date': 0.0
|
||||
})
|
||||
|
||||
# Рассчитываем значения по логике стандартного отчета
|
||||
adjustment_before_from_date = flt(adjustments['adjustment_before_from_date'])
|
||||
adjustment_till_to_date = flt(adjustments['adjustment_till_to_date'])
|
||||
adjustment_during_period = adjustment_till_to_date - adjustment_before_from_date
|
||||
|
||||
value_as_on_from_date = flt(asset_detail.get('value_as_on_from_date', 0)) + adjustment_before_from_date
|
||||
|
||||
value_as_on_to_date = (
|
||||
value_as_on_from_date +
|
||||
flt(asset_detail.get('value_of_new_purchase', 0)) -
|
||||
flt(asset_detail.get('value_of_sold_asset', 0)) -
|
||||
flt(asset_detail.get('value_of_scrapped_asset', 0)) -
|
||||
flt(asset_detail.get('value_of_capitalized_asset', 0)) +
|
||||
adjustment_during_period
|
||||
)
|
||||
|
||||
accumulated_depreciation_as_on_from_date = flt(depreciation.get('accumulated_depreciation_as_on_from_date', 0))
|
||||
|
||||
accumulated_depreciation_as_on_to_date = (
|
||||
accumulated_depreciation_as_on_from_date +
|
||||
flt(depreciation.get('depreciation_amount_during_the_period', 0)) -
|
||||
flt(depreciation.get('depreciation_eliminated_during_the_period', 0)) -
|
||||
flt(depreciation.get('depreciation_eliminated_via_reversal', 0))
|
||||
)
|
||||
|
||||
net_asset_value_as_on_to_date = value_as_on_to_date - accumulated_depreciation_as_on_to_date
|
||||
|
||||
result.append({
|
||||
'asset': asset_name,
|
||||
'value_as_on_from_date': value_as_on_from_date,
|
||||
'net_asset_value_as_on_to_date': net_asset_value_as_on_to_date
|
||||
})
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def get_asset_details_for_tax_exempt(filters, asset_names):
|
||||
"""Получает детали активов (из стандартного отчета)"""
|
||||
|
||||
asset_placeholders = ", ".join(["%s"] * len(asset_names))
|
||||
|
||||
# Используем ту же логику что в стандартном отчете для расчета остатков
|
||||
query = f"""
|
||||
SELECT
|
||||
a.name as asset,
|
||||
IFNULL(SUM(CASE WHEN a.purchase_date < %s THEN
|
||||
CASE WHEN IFNULL(a.disposal_date, 0) = 0 OR a.disposal_date >= %s THEN
|
||||
a.gross_purchase_amount
|
||||
ELSE
|
||||
0
|
||||
END
|
||||
ELSE
|
||||
0
|
||||
END), 0) as value_as_on_from_date,
|
||||
|
||||
IFNULL(SUM(CASE WHEN a.purchase_date >= %s THEN
|
||||
a.gross_purchase_amount
|
||||
ELSE
|
||||
0
|
||||
END), 0) as value_of_new_purchase,
|
||||
|
||||
IFNULL(SUM(CASE WHEN IFNULL(a.disposal_date, 0) != 0
|
||||
AND a.disposal_date >= %s
|
||||
AND a.disposal_date <= %s THEN
|
||||
CASE WHEN a.status = "Sold" THEN
|
||||
a.gross_purchase_amount
|
||||
ELSE
|
||||
0
|
||||
END
|
||||
ELSE
|
||||
0
|
||||
END), 0) as value_of_sold_asset,
|
||||
|
||||
IFNULL(SUM(CASE WHEN IFNULL(a.disposal_date, 0) != 0
|
||||
AND a.disposal_date >= %s
|
||||
AND a.disposal_date <= %s THEN
|
||||
CASE WHEN a.status = "Scrapped" THEN
|
||||
a.gross_purchase_amount
|
||||
ELSE
|
||||
0
|
||||
END
|
||||
ELSE
|
||||
0
|
||||
END), 0) as value_of_scrapped_asset,
|
||||
|
||||
IFNULL(SUM(CASE WHEN IFNULL(a.disposal_date, 0) != 0
|
||||
AND a.disposal_date >= %s
|
||||
AND a.disposal_date <= %s THEN
|
||||
CASE WHEN a.status = "Capitalized" THEN
|
||||
a.gross_purchase_amount
|
||||
ELSE
|
||||
0
|
||||
END
|
||||
ELSE
|
||||
0
|
||||
END), 0) as value_of_capitalized_asset
|
||||
FROM
|
||||
`tabAsset` a
|
||||
WHERE
|
||||
a.docstatus = 1
|
||||
AND a.company = %s
|
||||
AND a.purchase_date <= %s
|
||||
AND a.name IN ({asset_placeholders})
|
||||
AND NOT EXISTS(
|
||||
SELECT 1 FROM `tabAsset Capitalization Asset Item` acai
|
||||
JOIN `tabAsset Capitalization` ac ON acai.parent = ac.name
|
||||
WHERE acai.asset = a.name
|
||||
AND ac.posting_date < %s
|
||||
AND ac.docstatus = 1
|
||||
SELECT a.name,
|
||||
ifnull(sum(case when a.purchase_date < %s then
|
||||
case when ifnull(a.disposal_date, 0) = 0 or a.disposal_date >= %s then
|
||||
a.net_purchase_amount
|
||||
else
|
||||
0
|
||||
end
|
||||
else
|
||||
0
|
||||
end), 0) as value_as_on_from_date,
|
||||
ifnull(sum(case when a.purchase_date >= %s then
|
||||
a.net_purchase_amount
|
||||
else
|
||||
0
|
||||
end), 0) as value_of_new_purchase,
|
||||
ifnull(sum(case when ifnull(a.disposal_date, 0) != 0
|
||||
and a.disposal_date >= %s
|
||||
and a.disposal_date <= %s then
|
||||
case when a.status = "Sold" then
|
||||
a.net_purchase_amount
|
||||
else
|
||||
0
|
||||
end
|
||||
else
|
||||
0
|
||||
end), 0) as value_of_sold_asset,
|
||||
ifnull(sum(case when ifnull(a.disposal_date, 0) != 0
|
||||
and a.disposal_date >= %s
|
||||
and a.disposal_date <= %s then
|
||||
case when a.status = "Scrapped" then
|
||||
a.net_purchase_amount
|
||||
else
|
||||
0
|
||||
end
|
||||
else
|
||||
0
|
||||
end), 0) as value_of_scrapped_asset,
|
||||
ifnull(sum(case when ifnull(a.disposal_date, 0) != 0
|
||||
and a.disposal_date >= %s
|
||||
and a.disposal_date <= %s then
|
||||
case when a.status = "Capitalized" then
|
||||
a.net_purchase_amount
|
||||
else
|
||||
0
|
||||
end
|
||||
else
|
||||
0
|
||||
end), 0) as value_of_capitalized_asset
|
||||
from `tabAsset` a
|
||||
where a.docstatus=1 and a.company=%s and a.purchase_date <= %s
|
||||
and a.name IN ({asset_placeholders})
|
||||
and not exists(
|
||||
select 1 from `tabAsset Capitalization Asset Item` acai
|
||||
join `tabAsset Capitalization` ac on acai.parent=ac.name
|
||||
where acai.asset = a.name
|
||||
and ac.posting_date < %s
|
||||
and ac.docstatus=1
|
||||
)
|
||||
GROUP BY a.name
|
||||
group by a.name
|
||||
"""
|
||||
|
||||
values = [
|
||||
|
|
@ -319,6 +364,167 @@ def get_asset_balances(filters, asset_names):
|
|||
return frappe.db.sql(query, values, as_dict=True)
|
||||
|
||||
|
||||
def get_asset_depreciation_for_tax_exempt(filters, asset_names):
|
||||
"""Получает депреciацию активов (из стандартного отчета)"""
|
||||
|
||||
asset_placeholders = ", ".join(["%s"] * len(asset_names))
|
||||
|
||||
query = f"""
|
||||
SELECT results.name as asset,
|
||||
sum(results.accumulated_depreciation_as_on_from_date) as accumulated_depreciation_as_on_from_date,
|
||||
sum(results.depreciation_eliminated_via_reversal) as depreciation_eliminated_via_reversal,
|
||||
sum(results.depreciation_eliminated_during_the_period) as depreciation_eliminated_during_the_period,
|
||||
sum(results.depreciation_amount_during_the_period) as depreciation_amount_during_the_period
|
||||
from (SELECT a.name as name,
|
||||
ifnull(sum(case when gle.posting_date < %s and (ifnull(a.disposal_date, 0) = 0 or a.disposal_date >= %s) then
|
||||
gle.debit
|
||||
else
|
||||
0
|
||||
end), 0) as accumulated_depreciation_as_on_from_date,
|
||||
ifnull(sum(case when gle.posting_date <= %s and ifnull(a.disposal_date, 0) = 0 then
|
||||
gle.credit
|
||||
else
|
||||
0
|
||||
end), 0) as depreciation_eliminated_via_reversal,
|
||||
ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and a.disposal_date >= %s
|
||||
and a.disposal_date <= %s and gle.posting_date <= a.disposal_date then
|
||||
gle.debit
|
||||
else
|
||||
0
|
||||
end), 0) as depreciation_eliminated_during_the_period,
|
||||
ifnull(sum(case when gle.posting_date >= %s and gle.posting_date <= %s
|
||||
and (ifnull(a.disposal_date, 0) = 0 or gle.posting_date <= a.disposal_date) then
|
||||
gle.debit
|
||||
else
|
||||
0
|
||||
end), 0) as depreciation_amount_during_the_period
|
||||
from `tabGL Entry` gle
|
||||
join `tabAsset` a on
|
||||
gle.against_voucher = a.name
|
||||
join `tabAsset Category Account` aca on
|
||||
aca.parent = a.asset_category and aca.company_name = %s
|
||||
join `tabCompany` company on
|
||||
company.name = %s
|
||||
where
|
||||
a.docstatus=1
|
||||
and a.company=%s
|
||||
and a.purchase_date <= %s
|
||||
and gle.is_cancelled = 0
|
||||
and gle.account = ifnull(aca.depreciation_expense_account, company.depreciation_expense_account)
|
||||
and a.name IN ({asset_placeholders})
|
||||
group by a.name
|
||||
union
|
||||
SELECT a.name as name,
|
||||
ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and a.disposal_date < %s then
|
||||
0
|
||||
else
|
||||
a.opening_accumulated_depreciation
|
||||
end), 0) as accumulated_depreciation_as_on_from_date,
|
||||
0 as depreciation_as_on_from_date_credit,
|
||||
ifnull(sum(case when a.disposal_date >= %s and a.disposal_date <= %s then
|
||||
a.opening_accumulated_depreciation
|
||||
else
|
||||
0
|
||||
end), 0) as depreciation_eliminated_during_the_period,
|
||||
0 as depreciation_amount_during_the_period
|
||||
from `tabAsset` a
|
||||
where a.docstatus=1 and a.company=%s and a.purchase_date <= %s
|
||||
and a.name IN ({asset_placeholders})
|
||||
group by a.name) as results
|
||||
group by results.name
|
||||
"""
|
||||
|
||||
values = [
|
||||
filters.get("from_date"), # accumulated_depreciation_as_on_from_date condition 1
|
||||
filters.get("from_date"), # accumulated_depreciation_as_on_from_date condition 2
|
||||
filters.get("to_date"), # depreciation_eliminated_via_reversal
|
||||
filters.get("from_date"), # depreciation_eliminated_during_the_period condition 1
|
||||
filters.get("to_date"), # depreciation_eliminated_during_the_period condition 2
|
||||
filters.get("from_date"), # depreciation_amount_during_the_period condition 1
|
||||
filters.get("to_date"), # depreciation_amount_during_the_period condition 2
|
||||
filters.get("company"), # aca.company_name
|
||||
filters.get("company"), # company.name
|
||||
filters.get("company"), # a.company
|
||||
filters.get("to_date"), # a.purchase_date
|
||||
*asset_names, # asset names for IN clause (first union)
|
||||
filters.get("from_date"), # disposal_date condition (second union)
|
||||
filters.get("from_date"), # disposal_date condition (second union)
|
||||
filters.get("to_date"), # disposal_date condition (second union)
|
||||
filters.get("company"), # a.company (second union)
|
||||
filters.get("to_date"), # a.purchase_date (second union)
|
||||
*asset_names # asset names for IN clause (second union)
|
||||
]
|
||||
|
||||
return frappe.db.sql(query, values, as_dict=True)
|
||||
|
||||
|
||||
def get_asset_value_adjustments_for_tax_exempt(filters, asset_names):
|
||||
"""Получает корректировки стоимости активов (из стандартного отчета)"""
|
||||
|
||||
asset_placeholders = ", ".join(["%s"] * len(asset_names))
|
||||
|
||||
query = f"""
|
||||
SELECT
|
||||
a.name AS asset,
|
||||
IFNULL(
|
||||
SUM(
|
||||
CASE
|
||||
WHEN gle.posting_date < %s
|
||||
AND (a.disposal_date IS NULL OR a.disposal_date >= %s)
|
||||
THEN gle.debit - gle.credit
|
||||
ELSE 0
|
||||
END
|
||||
),
|
||||
0) AS value_adjustment_before_from_date,
|
||||
IFNULL(
|
||||
SUM(
|
||||
CASE
|
||||
WHEN gle.posting_date <= %s
|
||||
AND (a.disposal_date IS NULL OR a.disposal_date >= %s)
|
||||
THEN gle.debit - gle.credit
|
||||
ELSE 0
|
||||
END
|
||||
),
|
||||
0) AS value_adjustment_till_to_date
|
||||
|
||||
FROM `tabGL Entry` gle
|
||||
JOIN `tabAsset` a ON gle.against_voucher = a.name
|
||||
JOIN `tabAsset Category Account` aca
|
||||
ON aca.parent = a.asset_category
|
||||
AND aca.company_name = %s
|
||||
WHERE gle.is_cancelled = 0
|
||||
AND a.docstatus = 1
|
||||
AND a.company = %s
|
||||
AND a.purchase_date <= %s
|
||||
AND gle.account = aca.fixed_asset_account
|
||||
AND a.name IN ({asset_placeholders})
|
||||
GROUP BY a.name
|
||||
"""
|
||||
|
||||
values = [
|
||||
filters.get("from_date"), # value_adjustment_before_from_date condition 1
|
||||
filters.get("from_date"), # value_adjustment_before_from_date condition 2
|
||||
filters.get("to_date"), # value_adjustment_till_to_date condition 1
|
||||
filters.get("to_date"), # value_adjustment_till_to_date condition 2
|
||||
filters.get("company"), # aca.company_name
|
||||
filters.get("company"), # a.company
|
||||
filters.get("to_date"), # a.purchase_date
|
||||
*asset_names # asset names for IN clause
|
||||
]
|
||||
|
||||
asset_with_value_adjustments = frappe.db.sql(query, values, as_dict=True)
|
||||
|
||||
asset_value_adjustment_map = {}
|
||||
|
||||
for r in asset_with_value_adjustments:
|
||||
asset_value_adjustment_map[r["asset"]] = {
|
||||
"adjustment_before_from_date": flt(r.get("value_adjustment_before_from_date", 0)),
|
||||
"adjustment_till_to_date": flt(r.get("value_adjustment_till_to_date", 0)),
|
||||
}
|
||||
|
||||
return asset_value_adjustment_map
|
||||
|
||||
|
||||
def get_columns(filters):
|
||||
"""Создает колонки отчета"""
|
||||
columns = []
|
||||
|
|
|
|||
Loading…
Reference in New Issue