2013-11-20 07:29:58 +00:00
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
2013-08-05 09:29:54 +00:00
# License: GNU General Public License v3. See license.txt
2013-01-29 06:02:38 +00:00
from __future__ import unicode_literals
2014-02-14 10:17:51 +00:00
import frappe
from frappe . utils import nowdate , cstr , flt , now , getdate , add_months
2014-04-14 13:50:45 +00:00
from frappe import throw , _
2014-02-14 10:17:51 +00:00
from frappe . utils import formatdate
2014-05-26 12:14:24 +00:00
import frappe . widgets . reportview
2013-01-29 06:02:38 +00:00
2014-02-14 10:17:51 +00:00
class FiscalYearError ( frappe . ValidationError ) : pass
class BudgetError ( frappe . ValidationError ) : pass
2013-08-22 12:55:43 +00:00
2013-01-29 06:02:38 +00:00
2013-07-11 12:19:18 +00:00
def get_fiscal_year ( date = None , fiscal_year = None , label = " Date " , verbose = 1 ) :
2013-12-23 11:37:57 +00:00
return get_fiscal_years ( date , fiscal_year , label , verbose ) [ 0 ]
2014-04-08 08:23:35 +00:00
2013-07-11 12:19:18 +00:00
def get_fiscal_years ( date = None , fiscal_year = None , label = " Date " , verbose = 1 ) :
2013-01-29 06:02:38 +00:00
# if year start date is 2012-04-01, year end date should be 2013-03-31 (hence subdate)
2013-06-20 11:05:09 +00:00
cond = " "
if fiscal_year :
2014-03-03 10:21:13 +00:00
cond = " name = ' %s ' " % fiscal_year . replace ( " ' " , " \' " )
2013-06-20 11:05:09 +00:00
else :
2013-11-25 14:21:18 +00:00
cond = " ' %s ' >= year_start_date and ' %s ' <= year_end_date " % \
2013-06-20 11:05:09 +00:00
( date , date )
2014-02-26 07:05:33 +00:00
fy = frappe . db . sql ( """ select name, year_start_date, year_end_date
2013-11-25 14:21:18 +00:00
from ` tabFiscal Year ` where % s order by year_start_date desc """ % c ond)
2014-04-08 08:23:35 +00:00
2013-01-29 06:02:38 +00:00
if not fy :
2015-01-07 06:03:14 +00:00
error_msg = _ ( """ {0} {1} not in any Fiscal Year. For more details check {2} . """ ) . format ( label , formatdate ( date ) , " https://erpnext.com/kb/accounts/fiscal-year-error " )
2014-02-14 10:17:51 +00:00
if verbose : frappe . msgprint ( error_msg )
2013-01-29 06:02:38 +00:00
raise FiscalYearError , error_msg
2014-04-08 08:23:35 +00:00
2013-02-05 17:55:37 +00:00
return fy
2014-04-08 08:23:35 +00:00
2013-02-05 06:01:27 +00:00
def validate_fiscal_year ( date , fiscal_year , label = " Date " ) :
2013-07-11 12:19:18 +00:00
years = [ f [ 0 ] for f in get_fiscal_years ( date , label = label ) ]
2013-02-05 17:55:37 +00:00
if fiscal_year not in years :
2014-04-14 13:50:45 +00:00
throw ( _ ( " {0} ' {1} ' not in Fiscal Year {2} " ) . format ( label , formatdate ( date ) , fiscal_year ) )
2013-01-29 06:02:38 +00:00
2014-02-14 10:17:51 +00:00
@frappe.whitelist ( )
2013-01-29 06:02:38 +00:00
def get_balance_on ( account = None , date = None ) :
2014-02-14 10:17:51 +00:00
if not account and frappe . form_dict . get ( " account " ) :
account = frappe . form_dict . get ( " account " )
date = frappe . form_dict . get ( " date " )
2014-04-08 08:23:35 +00:00
2014-08-01 10:43:44 +00:00
acc = frappe . get_doc ( " Account " , account )
acc . check_permission ( " read " )
2014-04-21 07:12:21 +00:00
2013-01-29 06:02:38 +00:00
cond = [ ]
if date :
cond . append ( " posting_date <= ' %s ' " % date )
else :
# get balance of all entries that exist
date = nowdate ( )
2014-04-08 08:23:35 +00:00
2013-01-29 06:02:38 +00:00
try :
year_start_date = get_fiscal_year ( date , verbose = 0 ) [ 1 ]
2014-04-14 13:50:45 +00:00
except FiscalYearError :
2013-01-29 06:02:38 +00:00
if getdate ( date ) > getdate ( nowdate ( ) ) :
# if fiscal year not found and the date is greater than today
# get fiscal year for today's date and its corresponding year start date
year_start_date = get_fiscal_year ( nowdate ( ) , verbose = 1 ) [ 1 ]
else :
# this indicates that it is a date older than any existing fiscal year.
# hence, assuming balance as 0.0
return 0.0
2014-04-08 08:23:35 +00:00
2013-01-29 06:02:38 +00:00
# for pl accounts, get balance within a fiscal year
2014-03-25 12:58:49 +00:00
if acc . report_type == ' Profit and Loss ' :
2013-01-29 06:02:38 +00:00
cond . append ( " posting_date >= ' %s ' and voucher_type != ' Period Closing Voucher ' " \
% year_start_date )
2014-04-08 08:23:35 +00:00
2013-01-29 06:02:38 +00:00
# different filter for group and ledger - improved performance
if acc . group_or_ledger == " Group " :
cond . append ( """ exists (
select * from ` tabAccount ` ac where ac . name = gle . account
and ac . lft > = % s and ac . rgt < = % s
) """ % (acc.lft, acc.rgt))
else :
2014-07-01 14:16:22 +00:00
cond . append ( """ gle.account = " %s " """ % ( account . replace ( ' " ' , ' \\ " ' ) , ) )
2014-04-08 08:23:35 +00:00
2014-02-26 07:05:33 +00:00
bal = frappe . db . sql ( """
2014-04-08 08:23:35 +00:00
SELECT sum ( ifnull ( debit , 0 ) ) - sum ( ifnull ( credit , 0 ) )
2013-01-29 06:02:38 +00:00
FROM ` tabGL Entry ` gle
2013-08-21 12:17:11 +00:00
WHERE % s """ % " and " .join(cond))[0][0]
2013-01-29 06:02:38 +00:00
# if bal is None, return 0
2013-07-19 10:03:11 +00:00
return flt ( bal )
2013-01-30 13:46:13 +00:00
2014-02-14 10:17:51 +00:00
@frappe.whitelist ( )
2013-01-30 13:46:13 +00:00
def add_ac ( args = None ) :
if not args :
2014-02-14 10:17:51 +00:00
args = frappe . local . form_dict
2013-01-30 13:46:13 +00:00
args . pop ( " cmd " )
2014-04-08 08:23:35 +00:00
2014-04-22 13:24:54 +00:00
ac = frappe . new_doc ( " Account " )
ac . update ( args )
2014-03-28 08:25:00 +00:00
ac . old_parent = " "
ac . freeze_account = " No "
2013-01-30 13:46:13 +00:00
ac . insert ( )
2014-04-22 13:24:54 +00:00
2014-03-28 08:25:00 +00:00
return ac . name
2013-01-30 13:46:13 +00:00
2014-02-14 10:17:51 +00:00
@frappe.whitelist ( )
2013-01-30 13:46:13 +00:00
def add_cc ( args = None ) :
if not args :
2014-02-14 10:17:51 +00:00
args = frappe . local . form_dict
2013-01-30 13:46:13 +00:00
args . pop ( " cmd " )
2014-04-08 08:23:35 +00:00
2014-04-22 13:24:54 +00:00
cc = frappe . new_doc ( " Cost Center " )
cc . update ( args )
2014-03-28 08:25:00 +00:00
cc . old_parent = " "
2013-01-30 13:46:13 +00:00
cc . insert ( )
2014-03-28 08:25:00 +00:00
return cc . name
2013-01-30 13:46:13 +00:00
def reconcile_against_document ( args ) :
"""
Cancel JV , Update aginst document , split if required and resubmit jv
"""
for d in args :
check_if_jv_modified ( d )
2014-04-30 14:00:50 +00:00
validate_allocated_amount ( d )
2013-01-30 13:46:13 +00:00
against_fld = {
' Journal Voucher ' : ' against_jv ' ,
' Sales Invoice ' : ' against_invoice ' ,
' Purchase Invoice ' : ' against_voucher '
}
2014-04-08 08:23:35 +00:00
2013-01-30 13:46:13 +00:00
d [ ' against_fld ' ] = against_fld [ d [ ' against_voucher_type ' ] ]
# cancel JV
2014-03-31 11:57:06 +00:00
jv_obj = frappe . get_doc ( ' Journal Voucher ' , d [ ' voucher_no ' ] )
2014-04-08 08:23:35 +00:00
2013-01-30 13:46:13 +00:00
jv_obj . make_gl_entries ( cancel = 1 , adv_adj = 1 )
2014-04-08 08:23:35 +00:00
2013-01-30 13:46:13 +00:00
# update ref in JV Detail
update_against_doc ( d , jv_obj )
# re-submit JV
2014-03-31 11:57:06 +00:00
jv_obj = frappe . get_doc ( ' Journal Voucher ' , d [ ' voucher_no ' ] )
2013-01-30 13:46:13 +00:00
jv_obj . make_gl_entries ( cancel = 0 , adv_adj = 1 )
def check_if_jv_modified ( args ) :
"""
check if there is already a voucher reference
check if amount is same
check if jv is submitted
"""
2014-02-26 07:05:33 +00:00
ret = frappe . db . sql ( """
2014-07-21 13:52:02 +00:00
select t2 . { dr_or_cr } from ` tabJournal Voucher ` t1 , ` tabJournal Voucher Detail ` t2
where t1 . name = t2 . parent and t2 . account = % ( account ) s
2014-04-08 08:23:35 +00:00
and ifnull ( t2 . against_voucher , ' ' ) = ' '
2013-01-30 13:46:13 +00:00
and ifnull ( t2 . against_invoice , ' ' ) = ' ' and ifnull ( t2 . against_jv , ' ' ) = ' '
2014-07-21 13:52:02 +00:00
and t1 . name = % ( voucher_no ) s and t2 . name = % ( voucher_detail_no ) s
and t1 . docstatus = 1 """ .format(dr_or_cr = args.get( " dr_or_cr " )), args)
2014-04-08 08:23:35 +00:00
2013-01-30 13:46:13 +00:00
if not ret :
2014-01-29 11:01:38 +00:00
throw ( _ ( """ Payment Entry has been modified after you pulled it. Please pull it again. """ ) )
2013-01-30 13:46:13 +00:00
2014-04-30 14:00:50 +00:00
def validate_allocated_amount ( args ) :
if args . get ( " allocated_amt " ) < 0 :
throw ( _ ( " Allocated amount can not be negative " ) )
elif args . get ( " allocated_amt " ) > args . get ( " unadjusted_amt " ) :
throw ( _ ( " Allocated amount can not greater than unadusted amount " ) )
2013-01-30 13:46:13 +00:00
def update_against_doc ( d , jv_obj ) :
"""
Updates against document , if partial amount splits into rows
"""
2014-04-08 08:23:35 +00:00
jv_detail = jv_obj . get ( " entries " , { " name " : d [ " voucher_detail_no " ] } ) [ 0 ]
jv_detail . set ( d [ " dr_or_cr " ] , d [ " allocated_amt " ] )
jv_detail . set ( d [ " against_fld " ] , d [ " against_voucher " ] )
2013-01-30 13:46:13 +00:00
if d [ ' allocated_amt ' ] < d [ ' unadjusted_amt ' ] :
2014-04-08 08:23:35 +00:00
jvd = frappe . db . sql ( """ select cost_center, balance, against_account, is_advance
2013-01-30 13:46:13 +00:00
from ` tabJournal Voucher Detail ` where name = % s """ , d[ ' voucher_detail_no ' ])
# new entry with balance amount
2014-03-27 10:42:56 +00:00
ch = jv_obj . append ( " entries " )
2013-01-30 13:46:13 +00:00
ch . account = d [ ' account ' ]
ch . cost_center = cstr ( jvd [ 0 ] [ 0 ] )
2014-07-07 10:24:11 +00:00
ch . balance = flt ( jvd [ 0 ] [ 1 ] )
2014-03-28 08:25:00 +00:00
ch . set ( d [ ' dr_or_cr ' ] , flt ( d [ ' unadjusted_amt ' ] ) - flt ( d [ ' allocated_amt ' ] ) )
ch . set ( d [ ' dr_or_cr ' ] == ' debit ' and ' credit ' or ' debit ' , 0 )
2013-01-30 13:46:13 +00:00
ch . against_account = cstr ( jvd [ 0 ] [ 2 ] )
ch . is_advance = cstr ( jvd [ 0 ] [ 3 ] )
ch . docstatus = 1
2014-04-08 08:23:35 +00:00
# will work as update after submit
jv_obj . ignore_validate_update_after_submit = True
jv_obj . save ( )
2013-03-20 11:30:41 +00:00
def remove_against_link_from_jv ( ref_type , ref_no , against_field ) :
2014-04-08 08:23:35 +00:00
linked_jv = frappe . db . sql_list ( """ select parent from `tabJournal Voucher Detail`
2014-01-03 09:42:16 +00:00
where ` % s ` = % s and docstatus < 2 """ % (against_field, " %s " ), (ref_no))
2014-04-08 08:23:35 +00:00
if linked_jv :
2014-02-26 07:05:33 +00:00
frappe . db . sql ( """ update `tabJournal Voucher Detail` set ` %s `=null,
2014-01-03 09:42:16 +00:00
modified = % s , modified_by = % s
2014-04-08 08:23:35 +00:00
where ` % s ` = % s and docstatus < 2 """ % (against_field, " %s " , " %s " , against_field, " %s " ),
2014-02-14 10:17:51 +00:00
( now ( ) , frappe . session . user , ref_no ) )
2014-04-08 08:23:35 +00:00
2014-02-26 07:05:33 +00:00
frappe . db . sql ( """ update `tabGL Entry`
2014-01-03 09:42:16 +00:00
set against_voucher_type = null , against_voucher = null ,
modified = % s , modified_by = % s
where against_voucher_type = % s and against_voucher = % s
and voucher_no != ifnull ( against_voucher , ' ' ) """ ,
2014-02-14 10:17:51 +00:00
( now ( ) , frappe . session . user , ref_type , ref_no ) )
2014-04-08 08:23:35 +00:00
2014-04-16 11:51:25 +00:00
frappe . msgprint ( _ ( " Journal Vouchers {0} are un-linked " . format ( " \n " . join ( linked_jv ) ) ) )
2014-04-08 08:23:35 +00:00
2013-03-25 05:36:00 +00:00
2014-02-14 10:17:51 +00:00
@frappe.whitelist ( )
2013-03-25 05:36:00 +00:00
def get_company_default ( company , fieldname ) :
2014-02-26 07:05:33 +00:00
value = frappe . db . get_value ( " Company " , company , fieldname )
2014-04-08 08:23:35 +00:00
2013-03-25 05:36:00 +00:00
if not value :
2014-04-16 11:51:25 +00:00
throw ( _ ( " Please set default value {0} in Company {0} " ) . format ( frappe . get_meta ( " Company " ) . get_label ( fieldname ) , company ) )
2014-04-08 08:23:35 +00:00
2013-03-25 05:36:00 +00:00
return value
2013-05-28 11:22:30 +00:00
def fix_total_debit_credit ( ) :
2014-04-08 08:23:35 +00:00
vouchers = frappe . db . sql ( """ select voucher_type, voucher_no,
sum ( debit ) - sum ( credit ) as diff
from ` tabGL Entry `
2013-05-28 11:22:30 +00:00
group by voucher_type , voucher_no
having sum ( ifnull ( debit , 0 ) ) != sum ( ifnull ( credit , 0 ) ) """ , as_dict=1)
2014-04-08 08:23:35 +00:00
2013-05-28 11:22:30 +00:00
for d in vouchers :
if abs ( d . diff ) > 0 :
dr_or_cr = d . voucher_type == " Sales Invoice " and " credit " or " debit "
2014-04-08 08:23:35 +00:00
2014-02-26 07:05:33 +00:00
frappe . db . sql ( """ update `tabGL Entry` set %s = %s + %s
2013-05-28 11:22:30 +00:00
where voucher_type = % s and voucher_no = % s and % s > 0 limit 1 """ %
2014-04-08 08:23:35 +00:00
( dr_or_cr , dr_or_cr , ' %s ' , ' %s ' , ' %s ' , dr_or_cr ) ,
2013-08-02 06:14:29 +00:00
( d . diff , d . voucher_type , d . voucher_no ) )
2014-04-08 08:23:35 +00:00
2013-08-26 11:23:30 +00:00
def get_stock_and_account_difference ( account_list = None , posting_date = None ) :
2013-12-12 13:42:19 +00:00
from erpnext . stock . utils import get_stock_balance_on
2014-04-08 08:23:35 +00:00
2013-08-26 11:23:30 +00:00
if not posting_date : posting_date = nowdate ( )
2014-04-08 08:23:35 +00:00
2013-08-02 06:14:29 +00:00
difference = { }
2014-04-08 08:23:35 +00:00
account_warehouse = dict ( frappe . db . sql ( """ select name, master_name from tabAccount
where account_type = ' Warehouse ' and ifnull ( master_name , ' ' ) != ' '
2013-09-25 05:02:51 +00:00
and name in ( % s ) """ % ' , ' .join([ ' %s ' ]*len(account_list)), account_list))
2014-04-08 08:23:35 +00:00
2013-09-25 05:02:51 +00:00
for account , warehouse in account_warehouse . items ( ) :
2013-08-26 11:23:30 +00:00
account_balance = get_balance_on ( account , posting_date )
2013-09-25 05:02:51 +00:00
stock_value = get_stock_balance_on ( warehouse , posting_date )
2013-08-07 08:51:04 +00:00
if abs ( flt ( stock_value ) - flt ( account_balance ) ) > 0.005 :
2013-08-07 07:03:37 +00:00
difference . setdefault ( account , flt ( stock_value ) - flt ( account_balance ) )
2013-08-07 08:51:04 +00:00
2013-08-06 10:49:18 +00:00
return difference
2013-08-22 09:08:46 +00:00
def validate_expense_against_budget ( args ) :
2014-02-14 10:17:51 +00:00
args = frappe . _dict ( args )
2014-03-21 05:44:49 +00:00
if frappe . db . get_value ( " Account " , { " name " : args . account , " report_type " : " Profit and Loss " } ) :
2014-02-26 07:05:33 +00:00
budget = frappe . db . sql ( """
2014-04-08 08:23:35 +00:00
select bd . budget_allocated , cc . distribution_id
2013-08-22 09:08:46 +00:00
from ` tabCost Center ` cc , ` tabBudget Detail ` bd
where cc . name = bd . parent and cc . name = % s and account = % s and bd . fiscal_year = % s
""" , (args.cost_center, args.account, args.fiscal_year), as_dict=True)
2014-04-08 08:23:35 +00:00
2013-08-22 09:08:46 +00:00
if budget and budget [ 0 ] . budget_allocated :
2014-04-08 08:23:35 +00:00
yearly_action , monthly_action = frappe . db . get_value ( " Company " , args . company ,
2013-08-22 09:08:46 +00:00
[ " yearly_bgt_flag " , " monthly_bgt_flag " ] )
2013-08-22 12:55:43 +00:00
action_for = action = " "
if monthly_action in [ " Stop " , " Warn " ] :
2014-04-08 08:23:35 +00:00
budget_amount = get_allocated_budget ( budget [ 0 ] . distribution_id ,
2013-08-22 12:55:43 +00:00
args . posting_date , args . fiscal_year , budget [ 0 ] . budget_allocated )
2014-04-08 08:23:35 +00:00
args [ " month_end_date " ] = frappe . db . sql ( " select LAST_DAY( %s ) " ,
2013-08-23 05:16:41 +00:00
args . posting_date ) [ 0 ] [ 0 ]
2014-04-15 11:00:55 +00:00
action_for , action = _ ( " Monthly " ) , monthly_action
2014-04-08 08:23:35 +00:00
2013-08-22 12:55:43 +00:00
elif yearly_action in [ " Stop " , " Warn " ] :
budget_amount = budget [ 0 ] . budget_allocated
2014-04-15 11:00:55 +00:00
action_for , action = _ ( " Annual " ) , yearly_action
2013-08-23 05:16:41 +00:00
2013-08-22 12:55:43 +00:00
if action_for :
actual_expense = get_actual_expense ( args )
if actual_expense > budget_amount :
2014-04-15 11:00:55 +00:00
frappe . msgprint ( _ ( " {0} budget for Account {1} against Cost Center {2} will exceed by {3} " ) . format (
_ ( action_for ) , args . account , args . cost_center , cstr ( actual_expense - budget_amount ) ) )
if action == " Stop " :
raise BudgetError
2014-04-08 08:23:35 +00:00
2013-08-22 12:55:43 +00:00
def get_allocated_budget ( distribution_id , posting_date , fiscal_year , yearly_budget ) :
if distribution_id :
distribution = { }
2014-04-08 08:23:35 +00:00
for d in frappe . db . sql ( """ select bdd.month, bdd.percentage_allocation
2013-08-22 12:55:43 +00:00
from ` tabBudget Distribution Detail ` bdd , ` tabBudget Distribution ` bd
where bdd . parent = bd . name and bd . fiscal_year = % s """ , fiscal_year, as_dict=1):
distribution . setdefault ( d . month , d . percentage_allocation )
2013-08-23 05:16:41 +00:00
2014-02-26 07:05:33 +00:00
dt = frappe . db . get_value ( " Fiscal Year " , fiscal_year , " year_start_date " )
2013-08-22 12:55:43 +00:00
budget_percentage = 0.0
2014-04-08 08:23:35 +00:00
2013-08-22 12:55:43 +00:00
while ( dt < = getdate ( posting_date ) ) :
if distribution_id :
2013-08-23 05:16:41 +00:00
budget_percentage + = distribution . get ( getdate ( dt ) . strftime ( " % B " ) , 0 )
2013-08-22 12:55:43 +00:00
else :
budget_percentage + = 100.0 / 12
2014-04-08 08:23:35 +00:00
2013-08-22 12:55:43 +00:00
dt = add_months ( dt , 1 )
2014-04-08 08:23:35 +00:00
2013-08-22 12:55:43 +00:00
return yearly_budget * budget_percentage / 100
2014-04-08 08:23:35 +00:00
2013-08-22 09:08:46 +00:00
def get_actual_expense ( args ) :
2013-08-23 05:16:41 +00:00
args [ " condition " ] = " and posting_date<= ' %s ' " % args . month_end_date \
if args . get ( " month_end_date " ) else " "
2014-04-08 08:23:35 +00:00
2014-02-26 07:05:33 +00:00
return frappe . db . sql ( """
2013-08-22 09:08:46 +00:00
select sum ( ifnull ( debit , 0 ) ) - sum ( ifnull ( credit , 0 ) )
from ` tabGL Entry `
2014-04-08 08:23:35 +00:00
where account = ' %(account)s ' and cost_center = ' %(cost_center)s '
2013-08-23 05:16:41 +00:00
and fiscal_year = ' %(fiscal_year)s ' and company = ' %(company)s ' % ( condition ) s
2013-11-26 09:33:51 +00:00
""" % (args))[0][0]
2014-04-08 08:23:35 +00:00
2014-08-04 07:34:50 +00:00
def rename_account_for ( dt , olddn , newdn , merge , company = None ) :
if not company :
companies = [ d [ 0 ] for d in frappe . db . sql ( " select name from tabCompany " ) ]
else :
companies = [ company ]
for company in companies :
old_account = get_account_for ( dt , olddn , company )
if old_account :
new_account = None
if not merge :
if old_account == add_abbr_if_missing ( olddn , company ) :
new_account = frappe . rename_doc ( " Account " , old_account , newdn )
else :
existing_new_account = get_account_for ( dt , newdn , company )
new_account = frappe . rename_doc ( " Account " , old_account ,
existing_new_account or newdn , merge = True if existing_new_account else False )
frappe . db . set_value ( " Account " , new_account or old_account , " master_name " , newdn )
2014-04-08 08:23:35 +00:00
2014-02-05 12:45:12 +00:00
def add_abbr_if_missing ( dn , company ) :
2014-02-11 14:58:11 +00:00
from erpnext . setup . doctype . company . company import get_name_with_abbr
2014-02-05 12:45:12 +00:00
return get_name_with_abbr ( dn , company )
2014-04-08 08:23:35 +00:00
2014-08-04 07:34:50 +00:00
def get_account_for ( account_for_doctype , account_for , company ) :
2013-11-26 09:33:51 +00:00
if account_for_doctype in [ " Customer " , " Supplier " ] :
account_for_field = " master_type "
elif account_for_doctype == " Warehouse " :
account_for_field = " account_type "
2014-04-08 08:23:35 +00:00
return frappe . db . get_value ( " Account " , { account_for_field : account_for_doctype ,
2014-08-04 07:34:50 +00:00
" master_name " : account_for , " company " : company } )
2014-04-08 08:23:35 +00:00
2014-01-22 10:06:44 +00:00
def get_currency_precision ( currency = None ) :
if not currency :
2014-04-08 08:23:35 +00:00
currency = frappe . db . get_value ( " Company " ,
2014-02-26 07:05:33 +00:00
frappe . db . get_default ( " company " ) , " default_currency " )
currency_format = frappe . db . get_value ( " Currency " , currency , " number_format " )
2014-04-08 08:23:35 +00:00
2014-02-14 10:17:51 +00:00
from frappe . utils import get_number_format_info
2014-01-24 16:14:36 +00:00
return get_number_format_info ( currency_format ) [ 2 ]
2014-08-07 09:40:05 +00:00
def get_stock_rbnb_difference ( posting_date , company ) :
stock_items = frappe . db . sql_list ( """ select distinct item_code
2014-08-07 09:43:52 +00:00
from ` tabStock Ledger Entry ` where company = % s """ , company)
2014-08-07 09:40:05 +00:00
pr_valuation_amount = frappe . db . sql ( """
select sum ( ifnull ( pr_item . valuation_rate , 0 ) * ifnull ( pr_item . qty , 0 ) * ifnull ( pr_item . conversion_factor , 0 ) )
from ` tabPurchase Receipt Item ` pr_item , ` tabPurchase Receipt ` pr
where pr . name = pr_item . parent and pr . docstatus = 1 and pr . company = % s
and pr . posting_date < = % s and pr_item . item_code in ( % s ) """ %
( ' %s ' , ' %s ' , ' , ' . join ( [ ' %s ' ] * len ( stock_items ) ) ) , tuple ( [ company , posting_date ] + stock_items ) ) [ 0 ] [ 0 ]
pi_valuation_amount = frappe . db . sql ( """
select sum ( ifnull ( pi_item . valuation_rate , 0 ) * ifnull ( pi_item . qty , 0 ) * ifnull ( pi_item . conversion_factor , 0 ) )
from ` tabPurchase Invoice Item ` pi_item , ` tabPurchase Invoice ` pi
where pi . name = pi_item . parent and pi . docstatus = 1 and pi . company = % s
and pi . posting_date < = % s and pi_item . item_code in ( % s ) """ %
( ' %s ' , ' %s ' , ' , ' . join ( [ ' %s ' ] * len ( stock_items ) ) ) , tuple ( [ company , posting_date ] + stock_items ) ) [ 0 ] [ 0 ]
# Balance should be
stock_rbnb = flt ( pr_valuation_amount , 2 ) - flt ( pi_valuation_amount , 2 )
# Balance as per system
2014-08-07 09:43:52 +00:00
stock_rbnb_account = " Stock Received But Not Billed - " + frappe . db . get_value ( " Company " , company , " abbr " )
sys_bal = get_balance_on ( stock_rbnb_account , posting_date )
2014-08-07 09:40:05 +00:00
# Amount should be credited
return flt ( stock_rbnb ) + flt ( sys_bal )
2014-09-12 09:48:53 +00:00
def get_outstanding_invoices ( amount_query , account ) :
all_outstanding_vouchers = [ ]
outstanding_voucher_list = frappe . db . sql ( """
select
voucher_no , voucher_type , posting_date ,
ifnull ( sum ( { amount_query } ) , 0 ) as invoice_amount
from
` tabGL Entry `
where
account = % s and { amount_query } > 0
group by voucher_type , voucher_no
""" .format(amount_query = amount_query), account, as_dict = True)
for d in outstanding_voucher_list :
payment_amount = frappe . db . sql ( """
select ifnull ( sum ( ifnull ( { amount_query } , 0 ) ) , 0 )
from
` tabGL Entry `
where
account = % s and { amount_query } < 0
and against_voucher_type = % s and ifnull ( against_voucher , ' ' ) = % s
""" .format(** {
" amount_query " : amount_query
} ) , ( account , d . voucher_type , d . voucher_no ) )
payment_amount = - 1 * payment_amount [ 0 ] [ 0 ] if payment_amount else 0
if d . invoice_amount > payment_amount :
all_outstanding_vouchers . append ( {
' voucher_no ' : d . voucher_no ,
' voucher_type ' : d . voucher_type ,
' posting_date ' : d . posting_date ,
' invoice_amount ' : flt ( d . invoice_amount ) ,
' outstanding_amount ' : d . invoice_amount - payment_amount
} )
return all_outstanding_vouchers