137 lines
4.4 KiB
Python
137 lines
4.4 KiB
Python
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# License: GNU General Public License v3. See license.txt
|
|
|
|
from __future__ import unicode_literals
|
|
import frappe
|
|
from frappe import _
|
|
from frappe.utils import flt, cint
|
|
from erpnext.accounts.report.financial_statements import (get_period_list, get_columns, get_data)
|
|
|
|
def execute(filters=None):
|
|
period_list = get_period_list(filters.from_fiscal_year, filters.to_fiscal_year, filters.periodicity, filters.company)
|
|
|
|
asset = get_data(filters.company, "Asset", "Debit", period_list, only_current_fiscal_year=False)
|
|
liability = get_data(filters.company, "Liability", "Credit", period_list, only_current_fiscal_year=False)
|
|
equity = get_data(filters.company, "Equity", "Credit", period_list, only_current_fiscal_year=False)
|
|
|
|
provisional_profit_loss, total_credit = get_provisional_profit_loss(asset, liability, equity,
|
|
period_list, filters.company)
|
|
|
|
message, opening_balance = check_opening_balance(asset, liability, equity)
|
|
|
|
data = []
|
|
data.extend(asset or [])
|
|
data.extend(liability or [])
|
|
data.extend(equity or [])
|
|
if opening_balance and round(opening_balance,2) !=0:
|
|
unclosed ={
|
|
"account_name": "'" + _("Unclosed Fiscal Years Profit / Loss (Credit)") + "'",
|
|
"account": None,
|
|
"warn_if_negative": True,
|
|
"currency": frappe.db.get_value("Company", filters.company, "default_currency")
|
|
}
|
|
for period in period_list:
|
|
unclosed[period.key] = opening_balance
|
|
if provisional_profit_loss:
|
|
provisional_profit_loss[period.key] = provisional_profit_loss[period.key] - opening_balance
|
|
|
|
unclosed["total"]=opening_balance
|
|
data.append(unclosed)
|
|
|
|
if provisional_profit_loss:
|
|
data.append(provisional_profit_loss)
|
|
if total_credit:
|
|
data.append(total_credit)
|
|
|
|
columns = get_columns(filters.periodicity, period_list, company=filters.company)
|
|
|
|
chart = get_chart_data(columns, asset, liability, equity)
|
|
|
|
return columns, data, message, chart
|
|
|
|
def get_provisional_profit_loss(asset, liability, equity, period_list, company):
|
|
provisional_profit_loss = {}
|
|
total_row = {}
|
|
if asset and (liability or equity):
|
|
total = total_row_total=0
|
|
currency = frappe.db.get_value("Company", company, "default_currency")
|
|
total_row = {
|
|
"account_name": "'" + _("Total (Credit)") + "'",
|
|
"account": None,
|
|
"warn_if_negative": True,
|
|
"currency": currency
|
|
}
|
|
has_value = False
|
|
|
|
for period in period_list:
|
|
effective_liability = 0.0
|
|
if liability:
|
|
effective_liability += flt(liability[-2].get(period.key))
|
|
if equity:
|
|
effective_liability += flt(equity[-2].get(period.key))
|
|
|
|
provisional_profit_loss[period.key] = flt(asset[-2].get(period.key)) - effective_liability
|
|
total_row[period.key] = effective_liability + provisional_profit_loss[period.key]
|
|
|
|
if provisional_profit_loss[period.key]:
|
|
has_value = True
|
|
|
|
total += flt(provisional_profit_loss[period.key])
|
|
provisional_profit_loss["total"] = total
|
|
|
|
total_row_total += flt(total_row[period.key])
|
|
total_row["total"] = total_row_total
|
|
|
|
if has_value:
|
|
provisional_profit_loss.update({
|
|
"account_name": "'" + _("Provisional Profit / Loss (Credit)") + "'",
|
|
"account": None,
|
|
"warn_if_negative": True,
|
|
"currency": currency
|
|
})
|
|
|
|
return provisional_profit_loss, total_row
|
|
|
|
def check_opening_balance(asset, liability, equity):
|
|
# Check if previous year balance sheet closed
|
|
opening_balance = 0
|
|
float_precision = cint(frappe.db.get_default("float_precision")) or 2
|
|
if asset:
|
|
opening_balance = flt(asset[0].get("opening_balance", 0), float_precision)
|
|
if liability:
|
|
opening_balance -= flt(liability[0].get("opening_balance", 0), float_precision)
|
|
if equity:
|
|
opening_balance -= flt(equity[0].get("opening_balance", 0), float_precision)
|
|
|
|
if opening_balance:
|
|
return _("Previous Financial Year is not closed"),opening_balance
|
|
return None,None
|
|
|
|
def get_chart_data(columns, asset, liability, equity):
|
|
x_intervals = ['x'] + [d.get("label") for d in columns[2:]]
|
|
|
|
asset_data, liability_data, equity_data = [], [], []
|
|
|
|
for p in columns[2:]:
|
|
if asset:
|
|
asset_data.append(asset[-2].get(p.get("fieldname")))
|
|
if liability:
|
|
liability_data.append(liability[-2].get(p.get("fieldname")))
|
|
if equity:
|
|
equity_data.append(equity[-2].get(p.get("fieldname")))
|
|
|
|
columns = [x_intervals]
|
|
if asset_data:
|
|
columns.append(["Assets"] + asset_data)
|
|
if liability_data:
|
|
columns.append(["Liabilities"] + liability_data)
|
|
if equity_data:
|
|
columns.append(["Equity"] + equity_data)
|
|
|
|
return {
|
|
"data": {
|
|
'x': 'x',
|
|
'columns': columns
|
|
}
|
|
}
|