From 62a7b3cd4a3bb7d7b5f8e64c647f73da8b92b5c7 Mon Sep 17 00:00:00 2001 From: Brahma K Date: Thu, 21 Jul 2011 17:51:13 +0530 Subject: [PATCH] loan file modification --- accounts/doctype/gl_control/gl_control.py | 81 ++++++++++++----------- accounts/doctype/loan/loan.js | 17 +++-- accounts/doctype/loan/loan.py | 49 +++++++------- accounts/doctype/loan/loan.txt | 39 ++++++++--- 4 files changed, 105 insertions(+), 81 deletions(-) diff --git a/accounts/doctype/gl_control/gl_control.py b/accounts/doctype/gl_control/gl_control.py index 5ec8ecd22c..a346b65a57 100644 --- a/accounts/doctype/gl_control/gl_control.py +++ b/accounts/doctype/gl_control/gl_control.py @@ -12,7 +12,7 @@ sql = webnotes.conn.sql get_value = webnotes.conn.get_value in_transaction = webnotes.conn.in_transaction convert_to_lists = webnotes.conn.convert_to_lists - + # ----------------------------------------------------------------------------------------- from utilities.transaction_base import TransactionBase @@ -30,11 +30,11 @@ class DocType: #for r in ret: # inc = get_value('Account','Income - '+r[1], 'balance') # exp = get_value('Account','Expenses - '+r[1], 'balance') - # pl[r[0]] = flt(flt(inc) - flt(exp)) + # pl[r[0]] = flt(flt(inc) - flt(exp)) return {'cl':[r[0] for r in ret]}#, 'pl':pl} - - def get_company_currency(self,arg=''): - dcc = TransactionBase().get_company_currency(arg) + + def get_company_currency(self,arg=''): + dcc = TransactionBase().get_company_currency(arg) return dcc # Get current balance @@ -91,7 +91,7 @@ class DocType: fy = get_defaults()['fiscal_year'] parent, parent_acc_name, company, type = arg.split(',') - + # get children account details if type=='Account': @@ -103,7 +103,7 @@ class DocType: # remove Decimals for c in cl: c['balance'] = flt(c['balance']) - + # get children cost center details elif type=='Cost Center': if parent=='Root Node': @@ -111,7 +111,7 @@ class DocType: else: cl = sql("select name,group_or_ledger,cost_center_name from `tabCost Center` where ifnull(parent_cost_center, '')=%s and docstatus != 2 and company_name=%s order by name asc",(parent,company),as_dict=1) return {'parent':parent, 'parent_acc_name':parent_acc_name, 'cl':cl} - + # Add a new account # ----------------- def add_ac(self,arg): @@ -119,14 +119,14 @@ class DocType: ac = Document('Account') for d in arg.keys(): ac.fields[d] = arg[d] - ac.old_parent = '' + ac.old_parent = '' ac_obj = get_obj(doc=ac) ac_obj.validate() ac_obj.doc.save(1) ac_obj.on_update() return ac_obj.doc.name - + # Add a new cost center #---------------------- def add_cc(self,arg): @@ -138,33 +138,33 @@ class DocType: # map company abbr other_info = sql("select company_abbr from `tabCost Center` where name='%s'"%arg['parent_cost_center']) cc.company_abbr = other_info and other_info[0][0] or arg['company_abbr'] - + cc_obj = get_obj(doc=cc) cc_obj.validate() cc_obj.doc.save(1) cc_obj.on_update() return cc_obj.doc.name - - + + # Get field values from the voucher #------------------------------------------ def get_val(self, src, d, parent=None): - if not src: + if not src: return None if src.startswith('parent:'): return parent.fields[src.split(':')[1]] elif src.startswith('value:'): return eval(src.split(':')[1]) elif src: - return d.fields.get(src) - + return d.fields.get(src) + def check_if_in_list(self, le): for e in self.entries: if e.account == le.account and (cstr(e.against_voucher)==cstr(le.against_voucher)) and (cstr(e.against_voucher_type)==cstr(le.against_voucher_type)) and (cstr(e.cost_center)==cstr(le.cost_center)): return [e] return 0 - + # Make a dictionary(le) for every gl entry and append to a list(self.entries) #---------------------------------------------------------------------------- def make_single_entry(self,parent,d,le_map,cancel, merge_entries): @@ -176,12 +176,12 @@ class DocType: is_expense_acct = sql("select name from tabAccount where is_pl_account='Yes' and debit_or_credit='Debit' and name=%s",self.get_val(le_map['account'], d, parent)) if is_expense_acct and self.get_val(le_map['cost_center'], d, parent): get_obj('Budget Control').check_budget([self.get_val(le_map[k], d, parent) for k in flist if k in ['account','cost_center','debit','credit','posting_date','fiscal_year','company']],cancel) - + # Create new GL entry object and map values le = Document('GL Entry') for k in flist: le.fields[k] = self.get_val(le_map[k], d, parent) - + # if there is already an entry in this account then just add it to that entry same_head = self.check_if_in_list(le) if same_head and merge_entries: @@ -190,8 +190,8 @@ class DocType: same_head.credit = flt(same_head.credit) + flt(le.credit) else: self.entries.append(le) - - # Save GL Entries + + # Save GL Entries # ---------------- def save_entries(self, cancel, adv_adj, update_outstanding): for le in self.entries: @@ -199,7 +199,7 @@ class DocType: if cancel or flt(le.debit) < 0 or flt(le.credit) < 0: tmp=le.debit le.debit, le.credit = abs(flt(le.credit)), abs(flt(tmp)) - + le_obj = get_obj(doc=le) # validate except on_cancel @@ -213,11 +213,11 @@ class DocType: # update total debit / credit self.td += flt(le.debit) self.tc += flt(le.credit) - + # Make Multiple Entries # --------------------- def make_gl_entries(self, doc, doclist, cancel=0, adv_adj = 0, use_mapper='', merge_entries = 1, update_outstanding='Yes'): - # get entries + # get entries le_map_list = sql("select * from `tabGL Mapper Detail` where parent = %s", use_mapper or doc.doctype, as_dict=1) self.td, self.tc = 0.0, 0.0 for le_map in le_map_list: @@ -228,10 +228,10 @@ class DocType: self.make_single_entry(doc,d,le_map,cancel, merge_entries) else: self.make_single_entry(None,doc,le_map,cancel, merge_entries) - + # save entries self.save_entries(cancel, adv_adj, update_outstanding) - + # check total debit / credit # Due to old wrong entries (total debit != total credit) some voucher could be cancelled if abs(self.td - self.tc) > 0.001 and not cancel: @@ -289,7 +289,7 @@ class DocType: add.allocate_amount = 0 if table_name == 'Advance Allocation Detail': add.tds_amount = flt(d[4]) - + # Clear rows which is not adjusted #------------------------------------- def clear_advances(self, obj,table_name,table_field_name): @@ -297,7 +297,7 @@ class DocType: if not flt(d.allocated_amount): sql("update `tab%s` set parent = '' where name = '%s' and parent = '%s'" % (table_name, d.name, d.parent)) d.parent = '' - + # Update aginst document in journal voucher #------------------------------------------ def update_against_document_in_jv(self, obj, table_field_name, against_document_no, against_document_doctype, account_head, dr_or_cr,doctype): @@ -310,7 +310,7 @@ class DocType: # update ref in JV Detail sql("update `tabJournal Voucher Detail` set %s = '%s' where name = '%s'" % (doctype=='Payable Voucher' and 'against_voucher' or 'against_invoice', cstr(against_document_no), d.jv_detail_no)) - + # re-submit JV jv_obj = get_obj('Journal Voucher', d.journal_voucher, with_children =1) get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel = 0, adv_adj =1) @@ -319,22 +319,22 @@ class DocType: # cancel JV jv_obj = get_obj('Journal Voucher', d.journal_voucher, with_children=1) get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel =1, adv_adj = 1) - + # add extra entries self.add_extra_entry(jv_obj, d.journal_voucher, d.jv_detail_no, flt(d.allocated_amount), account_head, doctype, dr_or_cr, against_document_no) - + # re-submit JV jv_obj = get_obj('Journal Voucher', d.journal_voucher, with_children =1) get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel = 0, adv_adj = 1) else: msgprint("Allocation amount cannot be greater than advance amount") raise Exception - + # Add extra row in jv detail for unadjusted amount #-------------------------------------------------- def add_extra_entry(self,jv_obj,jv,jv_detail_no, allocate, account_head, doctype, dr_or_cr, against_document_no): # get old entry details - + jvd = sql("select %s, cost_center, balance, against_account from `tabJournal Voucher Detail` where name = '%s'" % (dr_or_cr,jv_detail_no)) advance = jvd and flt(jvd[0][0]) or 0 balance = flt(advance) - flt(allocate) @@ -351,7 +351,7 @@ class DocType: add.against_account = cstr(jvd[0][3]) add.is_advance = 'Yes' add.save(1) - + # check if advance entries are still valid # ---------------------------------------- def validate_jv_entry(self, d, account_head, dr_or_cr): @@ -406,22 +406,23 @@ In Account := %s User := %s has Repaired Outstanding Amount For %s : %s and foll """ vl = sql(""" select voucher_type, voucher_no, account, sum(debit) as sum_debit, sum(credit) as sum_credit - from `tabGL Entry` + from `tabGL Entry` where is_cancelled='Yes' and creation > %s group by voucher_type, voucher_no, account """, after_date, as_dict=1) - + ac_list = [] for v in vl: if v['sum_debit'] != 0 or v['sum_credit'] != 0: ac_list.append(v['account']) - - fy_list = sql("""select name from `tabFiscal Year` - where (%s between year_start_date and date_sub(date_add(year_start_date,interval 1 year), interval 1 day)) - or year_start_date > %s + + fy_list = sql("""select name from `tabFiscal Year` + where (%s between year_start_date and date_sub(date_add(year_start_date,interval 1 year), interval 1 day)) + or year_start_date > %s order by year_start_date ASC""", (after_date, after_date)) for fy in fy_list: fy_obj = get_obj('Fiscal Year', fy[0]) for a in set(ac_list): fy_obj.repost(a) + diff --git a/accounts/doctype/loan/loan.js b/accounts/doctype/loan/loan.js index a26df3f73f..1851a84866 100644 --- a/accounts/doctype/loan/loan.js +++ b/accounts/doctype/loan/loan.js @@ -8,19 +8,24 @@ $.extend(cur_frm.cscript, { } cur_frm.refresh(); }, +/* submit:function(doc){ + data=doc.get_values(); + + data['']= + $c_obj(make_doclist(dt,dn),'loan_post',data,function(){}); + },*/ refresh: function(doc) { cur_frm.cscript.hide_show_buttons(doc); }, hide_show_buttons: function(doc) { if(doc.docstatus==0) { - hide_field('Installment Reciept');// show_field('Generate'); + hide_field('Installment Reciept'); show_field('Generate'); } else if (doc.docstatus==1) { -// show_field('Installment Reciept'); -hide_field('Generate'); + show_field('Installment Reciept');hide_field('Generate'); } }, clear_installments: function(doc) { - $.each(getchildren('Loan Installment', doc.name, 'installments', 'Loan'), + $.each(getchildren('Loan Installment', doc.name, 'installments', 'Loan'), function(i, d) { LocalDB.delete_doc('Loan Installment', d.name); } @@ -40,9 +45,9 @@ hide_field('Generate'); d.show(); d.fields_dict.update.input.onclick = function() { var data = d.get_values(); - + if(data) { - $c_obj(make_doclist(dt,dn),'loan_post',data,function(){cur_frm.refresh(); d.hide();}); + $c_obj(make_doclist(dt,dn),'loan_installment_post',data,function(){cur_frm.refresh(); d.hide();}); } } } diff --git a/accounts/doctype/loan/loan.py b/accounts/doctype/loan/loan.py index adddbc57c7..9f0bcb53a0 100644 --- a/accounts/doctype/loan/loan.py +++ b/accounts/doctype/loan/loan.py @@ -3,49 +3,46 @@ from webnotes.model.doc import make_autoname, Document, addchild from webnotes import msgprint from webnotes.utils import get_defaults import json +from accounts.utils import post_jv sql = webnotes.conn.sql class DocType: def __init__(self, doc, doclist): self.doc, self.doclist = doc, doclist - + def autoname(self): """ Create Loan Id using naming_series pattern """ self.doc.name = make_autoname(self.doc.naming_series+ '.#####') - def loan_post(self, args): + def loan_post(self): + data['voucher_type']='Loan Issue' + data['naming_series']='JV' + data['fiscal_year'] = get_defaults()['fiscal_year'] # To be modified to take care + data['company'] = get_defaults()['company'] + data['debit_account'] = self.doc['receivable_account'] + data['credit_account'] = self.doc['account'] + data['amount'] = self.doc.loan_amount + jv_name=post_jv(data) + + def loan_installment_post(self, args): """ Posts the loan receipt into Journal Voucher """ - data = json.loads(args) - - jv = Document('Journal Voucher') - jv.voucher_type = 'Loan Receipt' - jv.naming_series = 'JV' - jv.voucher_date = data.get('cheque_date') - jv.posting_date = data.get('cheque_date') - jv.cheque_no = data.get('cheque_number') - jv.cheque_date = data.get('cheque_date') - jv.fiscal_year = get_defaults()['fiscal_year'] # To be modified to take care - jv.company = get_defaults()['company'] - - jv.save(1) - next_inst = sql("select amount,name from `tabLoan Installment` where parent=%s and ifnull(cheque_number,'')='' order by due_date limit 1",self.doc.name) - - jc = addchild(jv,'entries','Journal Voucher Detail',0) - jc.account = data.get('bank_account') - jc.debit = next_inst[0][0] - jc.save() - jc = addchild(jv,'entries','Journal Voucher Detail',0) - jc.account = self.doc.account - jc.credit = next_inst[0][0] - jc.save() + data = json.loads(args) + data['voucher_type']='Loan Receipt' + data['naming_series']='JV' + data['amount']=next_inst[0][0] + data['debit_account']=data.get('bank_account') + data['credit_account']=self.doc.account + data['fiscal_year']=get_defaults()['fiscal_year'] + data['company']=get_defaults()['company'] + jv_name=post_jv(data) - sql("update `tabLoan Installment` set cheque_number=%s, cheque_date=%s, jv_number=%s where name=%s",(data.get('cheque_number'),data.get('cheque_date'),jv.name,next_inst[0][1])) + sql("update `tabLoan Installment` set cheque_number=%s, cheque_date=%s, jv_number=%s where name=%s",(data.get('cheque_number'),data.get('cheque_date'),jv_name,next_inst[0][1])) self.doclist = [Document(d.doctype, d.name) for d in self.doclist] diff --git a/accounts/doctype/loan/loan.txt b/accounts/doctype/loan/loan.txt index 3be82fbedc..001e1d3845 100644 --- a/accounts/doctype/loan/loan.txt +++ b/accounts/doctype/loan/loan.txt @@ -5,21 +5,21 @@ { 'creation': '2011-07-15 10:35:26', 'docstatus': 0, - 'modified': '2011-07-15 15:51:10', + 'modified': '2011-07-18 12:12:19', 'modified_by': 'Administrator', 'owner': 'Administrator' }, # These values are common for all DocType { - '_last_update': '1310706327', + '_last_update': '1310963215', 'colour': 'White:FFF', 'doctype': 'DocType', 'module': 'Accounts', 'name': '__common__', 'section_style': 'Simple', 'show_in_menu': 0, - 'version': 12 + 'version': 15 }, # These values are common for all DocField @@ -89,12 +89,33 @@ 'reqd': 1 }, + # DocField + { + 'doctype': 'DocField', + 'fieldname': 'receivable_account', + 'fieldtype': 'Link', + 'idx': 3, + 'label': 'Receivable Account', + 'options': 'Account' + }, + + # DocField + { + 'doctype': 'DocField', + 'fieldname': 'invoice', + 'fieldtype': 'Link', + 'idx': 4, + 'label': 'Invoice', + 'options': 'Receivable Voucher', + 'reqd': 1 + }, + # DocField { 'doctype': 'DocField', 'fieldname': 'loan_amount', 'fieldtype': 'Currency', - 'idx': 3, + 'idx': 5, 'label': 'Loan Amount', 'reqd': 1 }, @@ -104,7 +125,7 @@ 'doctype': 'DocField', 'fieldname': 'start_date', 'fieldtype': 'Date', - 'idx': 4, + 'idx': 6, 'label': 'Start Date', 'reqd': 1 }, @@ -114,7 +135,7 @@ 'doctype': 'DocField', 'fieldname': 'no_of_installments', 'fieldtype': 'Int', - 'idx': 5, + 'idx': 7, 'label': 'No of Installments', 'reqd': 1 }, @@ -124,7 +145,7 @@ 'colour': 'White:FFF', 'doctype': 'DocField', 'fieldtype': 'Button', - 'idx': 6, + 'idx': 8, 'label': 'Generate', 'trigger': 'Client' }, @@ -134,7 +155,7 @@ 'doctype': 'DocField', 'fieldname': 'installments', 'fieldtype': 'Table', - 'idx': 7, + 'idx': 9, 'label': 'Installments', 'options': 'Loan Installment' }, @@ -145,7 +166,7 @@ 'colour': 'White:FFF', 'doctype': 'DocField', 'fieldtype': 'Button', - 'idx': 8, + 'idx': 10, 'label': 'Installment Reciept' } ] \ No newline at end of file