2015-03-03 14:55:30 +05:30
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
2013-12-26 11:07:58 +05:30
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
2018-05-17 23:29:37 +05:30
import frappe , erpnext
2018-02-12 10:34:50 +01:00
from erpnext import get_company_currency , get_default_company
from erpnext . accounts . report . utils import get_currency , convert_to_presentation_currency
2018-01-18 09:32:43 +05:30
from frappe . utils import getdate , cstr , flt , fmt_money
2017-11-15 16:29:53 +05:30
from frappe import _ , _dict
2015-09-28 13:31:17 +05:30
from erpnext . accounts . utils import get_account_currency
2018-09-07 13:17:11 +05:30
from erpnext . accounts . report . financial_statements import get_cost_centers_with_children
2018-05-23 01:01:24 -05:00
from six import iteritems
2020-03-17 10:53:24 +05:30
from erpnext . accounts . doctype . accounting_dimension . accounting_dimension import get_accounting_dimensions , get_dimension_with_children
2019-06-21 08:50:37 -03:00
from collections import OrderedDict
2018-02-12 10:34:50 +01:00
2013-12-26 11:07:58 +05:30
def execute ( filters = None ) :
2018-05-16 23:31:09 +05:30
if not filters :
return [ ] , [ ]
2013-12-27 17:33:55 +05:30
account_details = { }
2018-01-18 09:32:43 +05:30
if filters and filters . get ( ' print_in_account_currency ' ) and \
not filters . get ( ' account ' ) :
frappe . throw ( _ ( " Select an account to print in account currency " ) )
2015-04-23 13:14:17 +05:30
for acc in frappe . db . sql ( """ select name, is_group from tabAccount """ , as_dict = 1 ) :
2015-05-27 13:01:38 +05:30
account_details . setdefault ( acc . name , acc )
2014-05-20 15:07:18 +05:30
2018-05-03 19:00:43 +05:30
if filters . get ( ' party ' ) :
2019-06-19 12:15:37 +05:30
filters . party = frappe . parse_json ( filters . get ( " party " ) )
2018-05-03 19:00:43 +05:30
2013-12-26 11:07:58 +05:30
validate_filters ( filters , account_details )
2015-09-28 13:31:17 +05:30
2015-04-20 17:13:43 +05:30
validate_party ( filters )
2015-09-28 13:31:17 +05:30
filters = set_account_currency ( filters )
2014-05-20 15:07:18 +05:30
2015-08-31 15:39:03 +05:30
columns = get_columns ( filters )
2014-05-20 15:07:18 +05:30
2013-12-27 17:33:55 +05:30
res = get_result ( filters , account_details )
2013-12-26 11:07:58 +05:30
2013-12-27 17:33:55 +05:30
return columns , res
2014-05-20 15:07:18 +05:30
2018-02-12 10:34:50 +01:00
2013-12-26 11:07:58 +05:30
def validate_filters ( filters , account_details ) :
2020-08-17 12:44:52 +05:30
if not filters . get ( " company " ) :
frappe . throw ( _ ( " {0} is mandatory " ) . format ( _ ( " Company " ) ) )
if not filters . get ( " from_date " ) and not filters . get ( " to_date " ) :
frappe . throw ( _ ( " {0} and {1} are mandatory " ) . format ( frappe . bold ( _ ( " From Date " ) ) , frappe . bold ( _ ( " To Date " ) ) ) )
2016-08-09 16:43:15 +05:30
2014-08-18 15:38:04 +05:30
if filters . get ( " account " ) and not account_details . get ( filters . account ) :
frappe . throw ( _ ( " Account {0} does not exists " ) . format ( filters . account ) )
2018-11-12 16:58:24 +05:30
if ( filters . get ( " account " ) and filters . get ( " group_by " ) == _ ( ' Group by Account ' )
2018-04-17 15:12:26 +05:30
and account_details [ filters . account ] . is_group == 0 ) :
2014-02-14 15:47:51 +05:30
frappe . throw ( _ ( " Can not filter based on Account, if grouped by Account " ) )
2014-05-20 15:07:18 +05:30
2018-11-12 16:58:24 +05:30
if ( filters . get ( " voucher_no " )
2019-02-28 16:07:19 +05:30
and filters . get ( " group_by " ) in [ _ ( ' Group by Voucher ' ) ] ) :
2014-02-14 15:47:51 +05:30
frappe . throw ( _ ( " Can not filter based on Voucher No, if grouped by Voucher " ) )
2014-05-20 15:07:18 +05:30
2013-12-27 17:33:55 +05:30
if filters . from_date > filters . to_date :
2014-02-14 15:47:51 +05:30
frappe . throw ( _ ( " From Date must be before To Date " ) )
2014-05-20 15:07:18 +05:30
2018-08-27 12:08:53 +05:30
if filters . get ( ' project ' ) :
2019-06-19 12:15:37 +05:30
filters . project = frappe . parse_json ( filters . get ( ' project ' ) )
2018-08-27 12:08:53 +05:30
if filters . get ( ' cost_center ' ) :
2019-06-19 12:15:37 +05:30
filters . cost_center = frappe . parse_json ( filters . get ( ' cost_center ' ) )
2018-08-27 12:08:53 +05:30
2015-04-20 17:13:43 +05:30
def validate_party ( filters ) :
party_type , party = filters . get ( " party_type " ) , filters . get ( " party " )
if party :
if not party_type :
frappe . throw ( _ ( " To filter based on Party, select Party Type first " ) )
2018-05-03 19:00:43 +05:30
else :
for d in party :
if not frappe . db . exists ( party_type , d ) :
frappe . throw ( _ ( " Invalid {0} : {1} " ) . format ( party_type , d ) )
2018-02-12 10:34:50 +01:00
2015-08-31 15:39:03 +05:30
def set_account_currency ( filters ) :
2018-05-03 19:00:43 +05:30
if filters . get ( " account " ) or ( filters . get ( ' party ' ) and len ( filters . party ) == 1 ) :
2018-08-08 16:37:31 +05:30
filters [ " company_currency " ] = frappe . get_cached_value ( ' Company ' , filters . company , " default_currency " )
2015-08-31 15:39:03 +05:30
account_currency = None
2015-09-28 13:31:17 +05:30
2015-08-31 15:39:03 +05:30
if filters . get ( " account " ) :
2015-09-28 13:31:17 +05:30
account_currency = get_account_currency ( filters . account )
2015-08-31 15:39:03 +05:30
elif filters . get ( " party " ) :
2018-02-12 10:34:50 +01:00
gle_currency = frappe . db . get_value (
" GL Entry " , {
2018-05-03 19:00:43 +05:30
" party_type " : filters . party_type , " party " : filters . party [ 0 ] , " company " : filters . company
2018-02-12 10:34:50 +01:00
} ,
" account_currency "
)
2015-08-31 15:39:03 +05:30
if gle_currency :
account_currency = gle_currency
else :
2018-05-22 09:10:01 +05:30
account_currency = ( None if filters . party_type in [ " Employee " , " Student " , " Shareholder " , " Member " ] else
2018-08-14 16:28:14 +05:30
frappe . db . get_value ( filters . party_type , filters . party [ 0 ] , " default_currency " ) )
2015-09-28 13:31:17 +05:30
2015-08-31 15:39:03 +05:30
filters [ " account_currency " ] = account_currency or filters . company_currency
2019-02-12 16:41:20 +05:30
if filters . account_currency != filters . company_currency and not filters . presentation_currency :
2018-08-14 16:28:14 +05:30
filters . presentation_currency = filters . account_currency
2015-09-28 13:31:17 +05:30
2018-05-03 19:00:43 +05:30
return filters
2015-09-28 13:31:17 +05:30
2014-05-20 15:07:18 +05:30
def get_result ( filters , account_details ) :
2020-08-14 06:42:54 +00:00
accounting_dimensions = [ ]
if filters . get ( " include_dimensions " ) :
accounting_dimensions = get_accounting_dimensions ( )
2013-12-27 17:33:55 +05:30
2020-08-14 06:42:54 +00:00
gl_entries = get_gl_entries ( filters , accounting_dimensions )
data = get_data_with_opening_closing ( filters , account_details ,
accounting_dimensions , gl_entries )
2014-05-20 15:07:18 +05:30
2015-08-31 15:39:03 +05:30
result = get_result_as_list ( data , filters )
2013-12-27 17:33:55 +05:30
return result
2014-05-20 15:07:18 +05:30
2020-08-14 06:42:54 +00:00
def get_gl_entries ( filters , accounting_dimensions ) :
2018-02-12 10:34:50 +01:00
currency_map = get_currency ( filters )
2018-11-12 16:58:24 +05:30
select_fields = """ , debit, credit, debit_in_account_currency,
credit_in_account_currency """
2020-01-23 17:42:57 +05:30
order_by_statement = " order by posting_date, account, creation "
2018-11-12 16:58:24 +05:30
if filters . get ( " group_by " ) == _ ( " Group by Voucher " ) :
order_by_statement = " order by posting_date, voucher_type, voucher_no "
2018-02-12 10:34:50 +01:00
2019-06-18 18:34:14 +05:30
if filters . get ( " include_default_book_entries " ) :
filters [ ' company_fb ' ] = frappe . db . get_value ( " Company " ,
filters . get ( " company " ) , ' default_finance_book ' )
2020-08-14 06:42:54 +00:00
dimension_fields = " "
if accounting_dimensions :
dimension_fields = ' , ' . join ( accounting_dimensions ) + ' , '
2020-06-08 12:20:21 +05:30
distributed_cost_center_query = " "
if filters and filters . get ( ' cost_center ' ) :
select_fields_with_percentage = """ , debit*(DCC_allocation.percentage_allocation/100) as debit, credit*(DCC_allocation.percentage_allocation/100) as credit, debit_in_account_currency*(DCC_allocation.percentage_allocation/100) as debit_in_account_currency,
credit_in_account_currency * ( DCC_allocation . percentage_allocation / 100 ) as credit_in_account_currency """
2020-08-17 12:44:52 +05:30
2020-06-08 12:20:21 +05:30
distributed_cost_center_query = """
UNION ALL
SELECT name as gl_entry ,
posting_date ,
account ,
party_type ,
party ,
voucher_type ,
2020-08-14 06:42:54 +00:00
voucher_no , { dimension_fields }
2020-06-08 12:20:21 +05:30
cost_center , project ,
against_voucher_type ,
against_voucher ,
account_currency ,
2020-08-17 12:44:52 +05:30
remarks , against ,
2020-06-08 12:20:21 +05:30
is_opening , ` tabGL Entry ` . creation { select_fields_with_percentage }
FROM ` tabGL Entry ` ,
(
SELECT parent , sum ( percentage_allocation ) as percentage_allocation
FROM ` tabDistributed Cost Center `
WHERE cost_center IN % ( cost_center ) s
AND parent NOT IN % ( cost_center ) s
GROUP BY parent
) as DCC_allocation
WHERE company = % ( company ) s
{ conditions }
AND posting_date < = % ( to_date ) s
AND cost_center = DCC_allocation . parent
2020-08-14 06:42:54 +00:00
""" .format(dimension_fields=dimension_fields,select_fields_with_percentage=select_fields_with_percentage, conditions=get_conditions(filters).replace( " and cost_center in %(cost_center)s " , ' ' ))
2020-06-08 12:20:21 +05:30
2018-02-12 10:34:50 +01:00
gl_entries = frappe . db . sql (
"""
2016-08-09 16:43:15 +05:30
select
2020-03-26 13:37:40 +05:30
name as gl_entry , posting_date , account , party_type , party ,
2020-08-14 06:42:54 +00:00
voucher_type , voucher_no , { dimension_fields }
cost_center , project ,
2018-02-12 10:34:50 +01:00
against_voucher_type , against_voucher , account_currency ,
2020-06-08 12:20:21 +05:30
remarks , against , is_opening , creation { select_fields }
2013-12-26 11:07:58 +05:30
from ` tabGL Entry `
2019-08-20 12:35:15 +05:30
where company = % ( company ) s { conditions }
2020-06-08 12:20:21 +05:30
{ distributed_cost_center_query }
2018-11-12 16:58:24 +05:30
{ order_by_statement }
2018-02-12 10:34:50 +01:00
""" .format(
2020-08-14 06:42:54 +00:00
dimension_fields = dimension_fields , select_fields = select_fields , conditions = get_conditions ( filters ) , distributed_cost_center_query = distributed_cost_center_query ,
2018-11-12 16:58:24 +05:30
order_by_statement = order_by_statement
2018-02-12 10:34:50 +01:00
) ,
filters , as_dict = 1 )
if filters . get ( ' presentation_currency ' ) :
2020-08-22 12:31:06 +05:30
return convert_to_presentation_currency ( gl_entries , currency_map , filters . get ( ' company ' ) )
2018-02-12 10:34:50 +01:00
else :
return gl_entries
2014-05-20 15:07:18 +05:30
2013-12-26 11:07:58 +05:30
def get_conditions ( filters ) :
conditions = [ ]
if filters . get ( " account " ) :
2014-02-26 12:35:33 +05:30
lft , rgt = frappe . db . get_value ( " Account " , filters [ " account " ] , [ " lft " , " rgt " ] )
2014-05-20 15:07:18 +05:30
conditions . append ( """ account in (select name from tabAccount
2013-12-26 11:07:58 +05:30
where lft > = % s and rgt < = % s and docstatus < 2 ) """ % (lft, rgt))
2014-05-20 15:07:18 +05:30
2018-09-06 13:09:35 +04:00
if filters . get ( " cost_center " ) :
2018-09-07 13:17:11 +05:30
filters . cost_center = get_cost_centers_with_children ( filters . cost_center )
conditions . append ( " cost_center in %(cost_center)s " )
2018-09-06 13:09:35 +04:00
2013-12-26 11:07:58 +05:30
if filters . get ( " voucher_no " ) :
conditions . append ( " voucher_no= %(voucher_no)s " )
2014-05-20 15:07:18 +05:30
2018-04-17 15:12:26 +05:30
if filters . get ( " group_by " ) == " Group by Party " and not filters . get ( " party_type " ) :
conditions . append ( " party_type in ( ' Customer ' , ' Supplier ' ) " )
2015-04-20 17:13:43 +05:30
if filters . get ( " party_type " ) :
conditions . append ( " party_type= %(party_type)s " )
if filters . get ( " party " ) :
2018-05-03 19:00:43 +05:30
conditions . append ( " party in %(party)s " )
2015-09-28 13:31:17 +05:30
2018-04-17 15:12:26 +05:30
if not ( filters . get ( " account " ) or filters . get ( " party " ) or
filters . get ( " group_by " ) in [ " Group by Account " , " Group by Party " ] ) :
2015-06-14 17:49:29 +05:30
conditions . append ( " posting_date >= %(from_date)s " )
2019-08-20 12:35:15 +05:30
conditions . append ( " (posting_date <= %(to_date)s or is_opening = ' Yes ' ) " )
2014-05-20 15:07:18 +05:30
2017-01-24 06:42:24 -03:00
if filters . get ( " project " ) :
2018-08-27 12:08:53 +05:30
conditions . append ( " project in %(project)s " )
2019-04-16 19:16:14 +05:30
if filters . get ( " finance_book " ) :
2019-06-18 18:34:14 +05:30
if filters . get ( " include_default_book_entries " ) :
2020-01-27 15:18:51 +05:30
conditions . append ( " (finance_book in ( %(finance_book)s , %(company_fb)s , ' ' ) OR finance_book IS NULL) " )
2019-06-18 18:34:14 +05:30
else :
conditions . append ( " finance_book in ( %(finance_book)s ) " )
2018-04-23 02:29:48 +05:30
2020-04-30 10:38:58 +05:30
if not filters . get ( " show_cancelled_entries " ) :
conditions . append ( " is_cancelled = 0 " )
2014-09-09 16:15:35 +05:30
from frappe . desk . reportview import build_match_conditions
2014-01-09 12:44:44 +05:30
match_conditions = build_match_conditions ( " GL Entry " )
2018-02-12 10:34:50 +01:00
if match_conditions :
conditions . append ( match_conditions )
2014-05-20 15:07:18 +05:30
2020-03-17 10:53:24 +05:30
accounting_dimensions = get_accounting_dimensions ( as_list = False )
2019-05-12 18:34:23 +05:30
if accounting_dimensions :
for dimension in accounting_dimensions :
2020-03-17 10:53:24 +05:30
if filters . get ( dimension . fieldname ) :
if frappe . get_cached_value ( ' DocType ' , dimension . document_type , ' is_tree ' ) :
filters [ dimension . fieldname ] = get_dimension_with_children ( dimension . document_type ,
filters . get ( dimension . fieldname ) )
2020-04-07 15:17:06 +05:30
conditions . append ( " {0} in % ( {0} )s " . format ( dimension . fieldname ) )
else :
conditions . append ( " {0} in ( % ( {0} )s) " . format ( dimension . fieldname ) )
2019-05-12 18:34:23 +05:30
2013-12-26 11:07:58 +05:30
return " and {} " . format ( " and " . join ( conditions ) ) if conditions else " "
2013-12-27 17:33:55 +05:30
2018-02-12 10:34:50 +01:00
2020-08-14 06:42:54 +00:00
def get_data_with_opening_closing ( filters , account_details , accounting_dimensions , gl_entries ) :
2013-12-26 11:07:58 +05:30
data = [ ]
2018-04-17 15:12:26 +05:30
gle_map = initialize_gle_map ( gl_entries , filters )
2014-05-20 15:07:18 +05:30
2020-08-14 06:42:54 +00:00
totals , entries = get_accountwise_gle ( filters , accounting_dimensions , gl_entries , gle_map )
2014-05-20 15:07:18 +05:30
2013-12-27 17:33:55 +05:30
# Opening for filtered account
2017-11-15 16:29:53 +05:30
data . append ( totals . opening )
2013-12-27 17:33:55 +05:30
2018-11-12 16:58:24 +05:30
if filters . get ( " group_by " ) != _ ( ' Group by Voucher (Consolidated) ' ) :
2018-05-23 01:01:24 -05:00
for acc , acc_dict in iteritems ( gle_map ) :
2018-04-17 15:12:26 +05:30
# acc
2015-09-24 15:03:53 +05:30
if acc_dict . entries :
2017-11-15 16:29:53 +05:30
# opening
data . append ( { } )
2018-11-12 16:58:24 +05:30
if filters . get ( " group_by " ) != _ ( " Group by Voucher " ) :
2018-08-20 17:19:29 +05:00
data . append ( acc_dict . totals . opening )
2015-09-24 15:03:53 +05:30
data + = acc_dict . entries
2017-11-15 16:29:53 +05:30
# totals
data . append ( acc_dict . totals . total )
2015-09-24 15:03:53 +05:30
2017-11-15 16:29:53 +05:30
# closing
2018-11-12 16:58:24 +05:30
if filters . get ( " group_by " ) != _ ( " Group by Voucher " ) :
2018-08-20 17:19:29 +05:00
data . append ( acc_dict . totals . closing )
2017-11-15 16:29:53 +05:30
data . append ( { } )
2015-09-24 15:03:53 +05:30
else :
2017-11-15 16:29:53 +05:30
data + = entries
# totals
data . append ( totals . total )
# closing
data . append ( totals . closing )
2014-05-20 15:07:18 +05:30
2013-12-26 11:07:58 +05:30
return data
2013-12-27 17:33:55 +05:30
2017-11-15 16:29:53 +05:30
def get_totals_dict ( ) :
def _get_debit_credit_dict ( label ) :
return _dict (
2018-02-12 10:34:50 +01:00
account = " ' {0} ' " . format ( label ) ,
debit = 0.0 ,
credit = 0.0 ,
debit_in_account_currency = 0.0 ,
credit_in_account_currency = 0.0
2017-11-15 16:29:53 +05:30
)
return _dict (
opening = _get_debit_credit_dict ( _ ( ' Opening ' ) ) ,
total = _get_debit_credit_dict ( _ ( ' Total ' ) ) ,
2018-01-18 09:32:43 +05:30
closing = _get_debit_credit_dict ( _ ( ' Closing (Opening + Total) ' ) )
2017-11-15 16:29:53 +05:30
)
2018-08-20 17:19:29 +05:00
def group_by_field ( group_by ) :
2018-11-12 16:58:24 +05:30
if group_by == _ ( ' Group by Party ' ) :
2018-08-20 17:19:29 +05:00
return ' party '
2018-11-12 16:58:24 +05:30
elif group_by in [ _ ( ' Group by Voucher (Consolidated) ' ) , _ ( ' Group by Account ' ) ] :
2018-08-20 17:19:29 +05:00
return ' account '
2018-11-12 16:58:24 +05:30
else :
return ' voucher_no '
2018-02-12 10:34:50 +01:00
2018-04-17 15:12:26 +05:30
def initialize_gle_map ( gl_entries , filters ) :
2019-06-21 08:50:37 -03:00
gle_map = OrderedDict ( )
2018-08-20 17:19:29 +05:00
group_by = group_by_field ( filters . get ( ' group_by ' ) )
2018-04-17 15:12:26 +05:30
2013-12-27 17:33:55 +05:30
for gle in gl_entries :
2018-04-17 15:12:26 +05:30
gle_map . setdefault ( gle . get ( group_by ) , _dict ( totals = get_totals_dict ( ) , entries = [ ] ) )
2013-12-27 17:33:55 +05:30
return gle_map
2018-02-12 10:34:50 +01:00
2020-08-14 06:42:54 +00:00
def get_accountwise_gle ( filters , accounting_dimensions , gl_entries , gle_map ) :
2017-11-15 16:29:53 +05:30
totals = get_totals_dict ( )
entries = [ ]
2019-08-20 12:35:15 +05:30
consolidated_gle = OrderedDict ( )
2018-08-20 17:19:29 +05:00
group_by = group_by_field ( filters . get ( ' group_by ' ) )
2015-09-28 13:31:17 +05:30
2017-11-15 16:29:53 +05:30
def update_value_in_dict ( data , key , gle ) :
data [ key ] . debit + = flt ( gle . debit )
data [ key ] . credit + = flt ( gle . credit )
2015-09-28 13:31:17 +05:30
2017-11-15 16:29:53 +05:30
data [ key ] . debit_in_account_currency + = flt ( gle . debit_in_account_currency )
data [ key ] . credit_in_account_currency + = flt ( gle . credit_in_account_currency )
2015-09-28 13:31:17 +05:30
2020-05-19 20:51:30 +05:30
if data [ key ] . against_voucher and gle . against_voucher :
2020-05-05 16:17:15 +05:30
data [ key ] . against_voucher + = ' , ' + gle . against_voucher
2017-11-15 16:29:53 +05:30
from_date , to_date = getdate ( filters . from_date ) , getdate ( filters . to_date )
for gle in gl_entries :
2019-05-20 12:25:53 +05:30
if ( gle . posting_date < from_date or
( cstr ( gle . is_opening ) == " Yes " and not filters . get ( " show_opening_entries " ) ) ) :
2018-04-17 15:12:26 +05:30
update_value_in_dict ( gle_map [ gle . get ( group_by ) ] . totals , ' opening ' , gle )
2017-11-15 16:29:53 +05:30
update_value_in_dict ( totals , ' opening ' , gle )
2018-02-12 10:34:50 +01:00
2018-04-17 15:12:26 +05:30
update_value_in_dict ( gle_map [ gle . get ( group_by ) ] . totals , ' closing ' , gle )
2017-12-15 19:40:55 +05:30
update_value_in_dict ( totals , ' closing ' , gle )
2015-09-28 13:31:17 +05:30
2015-06-14 17:49:29 +05:30
elif gle . posting_date < = to_date :
2018-04-17 15:12:26 +05:30
update_value_in_dict ( gle_map [ gle . get ( group_by ) ] . totals , ' total ' , gle )
2017-11-15 16:29:53 +05:30
update_value_in_dict ( totals , ' total ' , gle )
2018-11-12 16:58:24 +05:30
if filters . get ( " group_by " ) != _ ( ' Group by Voucher (Consolidated) ' ) :
2018-04-17 15:12:26 +05:30
gle_map [ gle . get ( group_by ) ] . entries . append ( gle )
2019-08-20 12:35:15 +05:30
elif filters . get ( " group_by " ) == _ ( ' Group by Voucher (Consolidated) ' ) :
2020-08-14 06:42:54 +00:00
keylist = [ gle . get ( " voucher_type " ) , gle . get ( " voucher_no " ) , gle . get ( " account " ) ]
for dim in accounting_dimensions :
keylist . append ( gle . get ( dim ) )
keylist . append ( gle . get ( " cost_center " ) )
key = tuple ( keylist )
2019-08-20 12:35:15 +05:30
if key not in consolidated_gle :
consolidated_gle . setdefault ( key , gle )
else :
update_value_in_dict ( consolidated_gle , key , gle )
2015-09-28 13:31:17 +05:30
2018-04-17 15:12:26 +05:30
update_value_in_dict ( gle_map [ gle . get ( group_by ) ] . totals , ' closing ' , gle )
2017-12-15 19:40:55 +05:30
update_value_in_dict ( totals , ' closing ' , gle )
2015-09-28 13:31:17 +05:30
2019-08-20 12:35:15 +05:30
for key , value in consolidated_gle . items ( ) :
entries . append ( value )
2017-11-15 16:29:53 +05:30
return totals , entries
2014-05-20 15:07:18 +05:30
2015-08-31 15:39:03 +05:30
def get_result_as_list ( data , filters ) :
2018-01-18 09:32:43 +05:30
balance , balance_in_account_currency = 0 , 0
inv_details = get_supplier_invoice_details ( )
2013-12-27 17:33:55 +05:30
for d in data :
2018-01-19 19:06:39 +05:30
if not d . get ( ' posting_date ' ) :
2018-01-18 09:32:43 +05:30
balance , balance_in_account_currency = 0 , 0
2018-02-07 12:10:14 +05:30
balance = get_balance ( d , balance , ' debit ' , ' credit ' )
d [ ' balance ' ] = balance
2015-09-28 13:31:17 +05:30
2018-01-18 09:32:43 +05:30
d [ ' account_currency ' ] = filters . account_currency
2018-01-19 19:06:39 +05:30
d [ ' bill_no ' ] = inv_details . get ( d . get ( ' against_voucher ' ) , ' ' )
2015-09-28 13:31:17 +05:30
2018-01-18 09:32:43 +05:30
return data
2014-05-20 15:07:18 +05:30
2018-01-18 09:32:43 +05:30
def get_supplier_invoice_details ( ) :
inv_details = { }
for d in frappe . db . sql ( """ select name, bill_no from `tabPurchase Invoice`
where docstatus = 1 and bill_no is not null and bill_no != ' ' """ , as_dict=1):
inv_details [ d . name ] = d . bill_no
return inv_details
def get_balance ( row , balance , debit_field , credit_field ) :
balance + = ( row . get ( debit_field , 0 ) - row . get ( credit_field , 0 ) )
2018-02-07 12:10:14 +05:30
return balance
2018-01-18 09:32:43 +05:30
def get_columns ( filters ) :
2018-02-12 10:34:50 +01:00
if filters . get ( " presentation_currency " ) :
currency = filters [ " presentation_currency " ]
else :
if filters . get ( " company " ) :
currency = get_company_currency ( filters [ " company " ] )
else :
company = get_default_company ( )
currency = get_company_currency ( company )
2018-01-18 09:32:43 +05:30
columns = [
2020-03-26 13:37:40 +05:30
{
2020-04-17 19:52:47 +05:30
" label " : _ ( " GL Entry " ) ,
2020-03-26 13:37:40 +05:30
" fieldname " : " gl_entry " ,
" fieldtype " : " Link " ,
" options " : " GL Entry " ,
" hidden " : 1
} ,
2018-01-18 09:32:43 +05:30
{
" label " : _ ( " Posting Date " ) ,
" fieldname " : " posting_date " ,
" fieldtype " : " Date " ,
" width " : 90
} ,
{
" label " : _ ( " Account " ) ,
" fieldname " : " account " ,
" fieldtype " : " Link " ,
" options " : " Account " ,
" width " : 180
} ,
{
2020-01-29 15:06:18 +05:30
" label " : _ ( " Debit ( {0} ) " ) . format ( currency ) ,
2018-01-18 09:32:43 +05:30
" fieldname " : " debit " ,
" fieldtype " : " Float " ,
" width " : 100
} ,
{
2020-01-29 15:06:18 +05:30
" label " : _ ( " Credit ( {0} ) " ) . format ( currency ) ,
2018-01-18 09:32:43 +05:30
" fieldname " : " credit " ,
" fieldtype " : " Float " ,
" width " : 100
} ,
{
2020-01-29 15:06:18 +05:30
" label " : _ ( " Balance ( {0} ) " ) . format ( currency ) ,
2018-01-18 09:32:43 +05:30
" fieldname " : " balance " ,
2018-02-07 12:10:14 +05:30
" fieldtype " : " Float " ,
" width " : 130
2018-01-18 09:32:43 +05:30
}
]
columns . extend ( [
{
" label " : _ ( " Voucher Type " ) ,
" fieldname " : " voucher_type " ,
" width " : 120
} ,
{
" label " : _ ( " Voucher No " ) ,
" fieldname " : " voucher_no " ,
" fieldtype " : " Dynamic Link " ,
" options " : " voucher_type " ,
" width " : 180
} ,
{
" label " : _ ( " Against Account " ) ,
" fieldname " : " against " ,
" width " : 120
} ,
{
" label " : _ ( " Party Type " ) ,
" fieldname " : " party_type " ,
" width " : 100
} ,
{
" label " : _ ( " Party " ) ,
" fieldname " : " party " ,
" width " : 100
} ,
{
" label " : _ ( " Project " ) ,
" options " : " Project " ,
" fieldname " : " project " ,
" width " : 100
2020-08-14 06:42:54 +00:00
}
] )
if filters . get ( " include_dimensions " ) :
for dim in get_accounting_dimensions ( as_list = False ) :
columns . append ( {
" label " : _ ( dim . label ) ,
" options " : dim . label ,
" fieldname " : dim . fieldname ,
" width " : 100
} )
columns . extend ( [
2018-01-18 09:32:43 +05:30
{
" label " : _ ( " Cost Center " ) ,
" options " : " Cost Center " ,
" fieldname " : " cost_center " ,
" width " : 100
} ,
{
" label " : _ ( " Against Voucher Type " ) ,
" fieldname " : " against_voucher_type " ,
" width " : 100
} ,
{
" label " : _ ( " Against Voucher " ) ,
" fieldname " : " against_voucher " ,
" fieldtype " : " Dynamic Link " ,
" options " : " against_voucher_type " ,
" width " : 100
} ,
{
" label " : _ ( " Supplier Invoice No " ) ,
" fieldname " : " bill_no " ,
" fieldtype " : " Data " ,
" width " : 100
} ,
{
" label " : _ ( " Remarks " ) ,
" fieldname " : " remarks " ,
" width " : 400
}
] )
return columns