purchase invoice with write off feature

This commit is contained in:
Nabin Hait 2012-04-23 12:47:12 +05:30
parent 15230eb955
commit 51834a45a7
6 changed files with 235 additions and 43 deletions

View File

@ -0,0 +1,131 @@
# GL Mapper, Purchase Invoice with write off
[
# These values are common in all dictionaries
{
'creation': '2012-04-23 11:43:56',
'docstatus': 0,
'modified': '2012-04-23 11:43:56',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
# These values are common for all GL Mapper
{
'doc_type': u'Purchase Invoice with write off',
'doctype': 'GL Mapper',
'name': '__common__'
},
# These values are common for all GL Mapper Detail
{
'doctype': u'GL Mapper Detail',
'name': '__common__',
'parent': u'Purchase Invoice with write off',
'parentfield': u'fields',
'parenttype': u'GL Mapper'
},
# GL Mapper, Purchase Invoice with write off
{
'doctype': 'GL Mapper',
'name': u'Purchase Invoice with write off'
},
# GL Mapper Detail
{
'account': u'expense_head',
'against': u'parent:credit_to',
'aging_date': u'parent:aging_date',
'company': u'parent:company',
'cost_center': u'cost_center',
'credit': u'value:0',
'debit': u'amount',
'doctype': u'GL Mapper Detail',
'fiscal_year': u'parent:fiscal_year',
'is_opening': u'parent:is_opening',
'posting_date': u'parent:posting_date',
'remarks': u'parent:remarks',
'table_field': u'entries',
'transaction_date': u'parent:voucher_date',
'voucher_no': u'parent:name',
'voucher_type': u'parent:doctype'
},
# GL Mapper Detail
{
'account': u'account_head',
'against': u'parent:credit_to',
'aging_date': u'parent:aging_date',
'company': u'parent:company',
'cost_center': u'cost_center',
'credit': u"value:d.fields.get('category') != 'For Valuation' and d.fields.get('add_deduct_tax') == 'Deduct' and d.fields.get('tax_amount') or 0",
'debit': u"value:d.fields.get('category') != 'For Valuation' and d.fields.get('add_deduct_tax') == 'Add' and d.fields.get('tax_amount') or 0",
'doctype': u'GL Mapper Detail',
'fiscal_year': u'parent:fiscal_year',
'is_opening': u'parent:is_opening',
'posting_date': u'parent:posting_date',
'remarks': u'parent:remarks',
'table_field': u'purchase_tax_details',
'transaction_date': u'parent:voucher_date',
'voucher_no': u'parent:name',
'voucher_type': u'parent:doctype'
},
# GL Mapper Detail
{
'account': u'tax_code',
'against': u'credit_to',
'aging_date': u'aging_date',
'company': u'company',
'credit': u'ded_amount',
'debit': u'value:0',
'doctype': u'GL Mapper Detail',
'fiscal_year': u'fiscal_year',
'is_opening': u'is_opening',
'posting_date': u'posting_date',
'remarks': u'remarks',
'transaction_date': u'voucher_date',
'voucher_no': u'name',
'voucher_type': u'doctype'
},
# GL Mapper Detail
{
'account': u'credit_to',
'against': u'against_expense_account',
'against_voucher': u'name',
'against_voucher_type': u"value:'Purchase Invoice'",
'aging_date': u'aging_date',
'company': u'company',
'credit': u'total_amount_to_pay',
'debit': u'value:0',
'doctype': u'GL Mapper Detail',
'fiscal_year': u'fiscal_year',
'is_opening': u'is_opening',
'posting_date': u'posting_date',
'remarks': u'remarks',
'transaction_date': u'voucher_date',
'voucher_no': u'name',
'voucher_type': u'doctype'
},
# GL Mapper Detail
{
'account': u'write_off_account',
'against': u'credit_to',
'aging_date': u'aging_date',
'company': u'company',
'cost_center': u'write_off_cost_center',
'credit': u'write_off_amount',
'debit': u'value:0',
'doctype': u'GL Mapper Detail',
'fiscal_year': u'fiscal_year',
'is_opening': u'is_opening',
'posting_date': u'posting_date',
'remarks': u'remarks',
'transaction_date': u'voucher_date',
'voucher_no': u'name',
'voucher_type': u'doctype'
}
]

View File

@ -158,6 +158,14 @@ cur_frm.cscript.is_opening = function(doc, dt, dn) {
if (doc.is_opening == 'Yes') unhide_field('aging_date'); if (doc.is_opening == 'Yes') unhide_field('aging_date');
} }
cur_frm.cscript.write_off_amount = function(doc) {
doc.total_amount_to_pay = flt(doc.grand_total) - flt(doc.ded_amount) - flt(doc.write_off_amount);
doc.outstanding_amount = flt(doc.total_amount_to_pay) - flt(doc.total_advance);
refresh_many(['outstanding_amount', 'total_amount_to_pay']);
}
// Recalculate Button // Recalculate Button
// ------------------- // -------------------
cur_frm.cscript.recalculate = function(doc, cdt, cdn) { cur_frm.cscript.recalculate = function(doc, cdt, cdn) {
@ -347,7 +355,7 @@ calc_total_advance = function(doc,cdt,cdn) {
tot_tds += flt(el[i].tds_allocated) tot_tds += flt(el[i].tds_allocated)
} }
} }
doc.total_amount_to_pay = flt(doc.grand_total) - flt(doc.ded_amount); doc.total_amount_to_pay = flt(doc.grand_total) - flt(doc.ded_amount) - flt(doc.write_off_amount);
doc.tds_amount_on_advance = flt(tot_tds); doc.tds_amount_on_advance = flt(tot_tds);
doc.total_advance = flt(total_advance); doc.total_advance = flt(total_advance);
doc.outstanding_amount = flt(doc.total_amount_to_pay) - flt(total_advance); doc.outstanding_amount = flt(doc.total_amount_to_pay) - flt(total_advance);

View File

@ -52,11 +52,7 @@ class DocType(TransactionBase):
# ---------- # ----------
def get_credit_to(self): def get_credit_to(self):
acc_head = sql("select name, credit_days from `tabAccount` where (name = %s or (master_name = %s and master_type = 'supplier')) and docstatus != 2", (cstr(self.doc.supplier) + " - " + self.get_company_abbr(),self.doc.supplier)) acc_head = sql("select name, credit_days from `tabAccount` where (name = %s or (master_name = %s and master_type = 'supplier')) and docstatus != 2", (cstr(self.doc.supplier) + " - " + self.get_company_abbr(),self.doc.supplier))
#supp_detail = sql("select supplier_name,address from `tabSupplier` where name = %s", self.doc.supplier, as_dict =1)
#ret = {
# 'supplier_name' : supp_detail and supp_detail[0]['supplier_name'] or '',
# 'supplier_address': supp_detail and supp_detail[0]['address'] or ''
#}
ret = {} ret = {}
if acc_head and acc_head[0][0]: if acc_head and acc_head[0][0]:
ret['credit_to'] = acc_head[0][0] ret['credit_to'] = acc_head[0][0]
@ -68,7 +64,7 @@ class DocType(TransactionBase):
def get_cust(self): def get_cust(self):
ret = {} ret = {}
if self.doc.credit_to: if self.doc.credit_to:
ret['supplier'] = get_value('Account',self.doc.credit_to,'master_name') ret['supplier'] = get_value('Account',self.doc.credit_to,'master_name')
return ret return ret
@ -364,7 +360,8 @@ class DocType(TransactionBase):
else: else:
get_obj('TDS Control').get_tds_amount(self) get_obj('TDS Control').get_tds_amount(self)
self.doc.total_tds_on_voucher = self.doc.ded_amount self.doc.total_tds_on_voucher = self.doc.ded_amount
self.doc.total_amount_to_pay=flt(self.doc.grand_total)-flt(self.doc.ded_amount)-flt(self.doc.other_tax_deducted) self.doc.total_amount_to_pay=flt(self.doc.grand_total) - flt(self.doc.ded_amount) - self.doc.write_off_amount
self.doc.outstanding_amount = self.doc.total_amount_to_pay - flt(self.doc.total_advance)
elif self.doc.tds_applicable == 'No': elif self.doc.tds_applicable == 'No':
self.doc.tds_category = '' self.doc.tds_category = ''
self.doc.tax_code = '' self.doc.tax_code = ''
@ -416,6 +413,10 @@ class DocType(TransactionBase):
msgprint("Purchase Receipt No. required against item %s"%d.item_code) msgprint("Purchase Receipt No. required against item %s"%d.item_code)
raise Exception raise Exception
def validate_write_off_account(self):
if self.doc.write_off_amount and not self.doc.write_off_account:
msgprint("Please enter Write Off Account", raise_exception=1)
# VALIDATE # VALIDATE
# ==================================================================================== # ====================================================================================
def validate(self): def validate(self):
@ -456,6 +457,8 @@ class DocType(TransactionBase):
#FY validation #FY validation
get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.posting_date,'Posting Date') get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.posting_date,'Posting Date')
self.validate_write_off_account()
#get Purchase Common Obj #get Purchase Common Obj
pc_obj = get_obj(dt='Purchase Common') pc_obj = get_obj(dt='Purchase Common')
@ -507,6 +510,8 @@ class DocType(TransactionBase):
if lst: if lst:
get_obj('GL Control').reconcile_against_document(lst) get_obj('GL Control').reconcile_against_document(lst)
# On Submit # On Submit
#-------------------------------------------------------------------- #--------------------------------------------------------------------
def on_submit(self): def on_submit(self):
@ -517,13 +522,19 @@ class DocType(TransactionBase):
# this sequence because outstanding may get -negative # this sequence because outstanding may get -negative
get_obj(dt='GL Control').make_gl_entries(self.doc, self.doclist) self.make_gl_entries()
self.update_against_document_in_jv() self.update_against_document_in_jv()
get_obj(dt = 'Purchase Common').update_prevdoc_detail(self, is_submit = 1) get_obj(dt = 'Purchase Common').update_prevdoc_detail(self, is_submit = 1)
def make_gl_entries(self, is_cancel = 0):
get_obj(dt='GL Control').make_gl_entries(self.doc, self.doclist, cancel = is_cancel, \
use_mapper = (self.doc.write_off_account and self.doc.write_off_amount and 'Purchase Invoice with write off' or ''))
# ********************************* CANCEL ********************************* # ********************************* CANCEL *********************************
# Check Next Document's docstatus # Check Next Document's docstatus
@ -542,7 +553,7 @@ class DocType(TransactionBase):
# Check whether tds payment voucher has been created against this voucher # Check whether tds payment voucher has been created against this voucher
self.check_tds_payment_voucher() self.check_tds_payment_voucher()
get_obj(dt='GL Control').make_gl_entries(self.doc, self.doclist, cancel=1) self.make_gl_entries(is_cancel=1)
get_obj(dt = 'Purchase Common').update_prevdoc_detail(self, is_submit = 0) get_obj(dt = 'Purchase Common').update_prevdoc_detail(self, is_submit = 0)

View File

@ -3,9 +3,9 @@
# These values are common in all dictionaries # These values are common in all dictionaries
{ {
'creation': '2012-04-11 13:17:19', 'creation': '2012-04-13 11:56:17',
'docstatus': 0, 'docstatus': 0,
'modified': '2012-04-12 18:09:05', 'modified': '2012-04-23 12:08:52',
'modified_by': u'Administrator', 'modified_by': u'Administrator',
'owner': u'Administrator' 'owner': u'Administrator'
}, },
@ -26,7 +26,7 @@
'server_code_error': u' ', 'server_code_error': u' ',
'show_in_menu': 0, 'show_in_menu': 0,
'subject': u'From %(supplier_name)s worth %(grand_total)s due on %(due_date)s | %(outstanding_amount)s outstanding', 'subject': u'From %(supplier_name)s worth %(grand_total)s due on %(due_date)s | %(outstanding_amount)s outstanding',
'version': 522 'version': 1
}, },
# These values are common for all DocField # These values are common for all DocField
@ -520,6 +520,18 @@
'print_hide': 1 'print_hide': 1
}, },
# DocField
{
'doctype': u'DocField',
'fieldname': u'net_total_import',
'fieldtype': u'Currency',
'label': u'Net Total (Import)',
'oldfieldname': u'net_total_import',
'oldfieldtype': u'Currency',
'permlevel': 1,
'print_hide': 1
},
# DocField # DocField
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
@ -935,6 +947,32 @@
'print_hide': 1 'print_hide': 1
}, },
# DocField
{
'doctype': u'DocField',
'fieldname': u'grand_total',
'fieldtype': u'Currency',
'label': u'Grand Total',
'oldfieldname': u'grand_total',
'oldfieldtype': u'Currency',
'permlevel': 1,
'print_hide': 1
},
# DocField
{
'colour': u'White:FFF',
'description': u'In Words will be visible once you save the Purchase Invoice.',
'doctype': u'DocField',
'fieldname': u'in_words',
'fieldtype': u'Data',
'label': u'In Words',
'oldfieldname': u'in_words',
'oldfieldtype': u'Data',
'permlevel': 1,
'print_hide': 1
},
# DocField # DocField
{ {
'doctype': u'DocField', 'doctype': u'DocField',
@ -965,11 +1003,12 @@
# DocField # DocField
{ {
'doctype': u'DocField', 'doctype': u'DocField',
'fieldname': u'total_advance', 'fieldname': u'total_amount_to_pay',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'label': u'Total Advance (Incl. TDS)', 'hidden': 0,
'label': u'Total Amount To Pay',
'no_copy': 1, 'no_copy': 1,
'oldfieldname': u'total_advance', 'oldfieldname': u'total_amount_to_pay',
'oldfieldtype': u'Currency', 'oldfieldtype': u'Currency',
'permlevel': 1, 'permlevel': 1,
'print_hide': 1 'print_hide': 1
@ -978,12 +1017,11 @@
# DocField # DocField
{ {
'doctype': u'DocField', 'doctype': u'DocField',
'fieldname': u'total_amount_to_pay', 'fieldname': u'total_advance',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'hidden': 0, 'label': u'Total Advance (Incl. TDS)',
'label': u'Total Amount To Pay',
'no_copy': 1, 'no_copy': 1,
'oldfieldname': u'total_amount_to_pay', 'oldfieldname': u'total_advance',
'oldfieldtype': u'Currency', 'oldfieldtype': u'Currency',
'permlevel': 1, 'permlevel': 1,
'print_hide': 1 'print_hide': 1
@ -1018,38 +1056,39 @@
# DocField # DocField
{ {
'doctype': u'DocField', 'doctype': u'DocField',
'fieldname': u'grand_total', 'fieldname': u'write_off_amount',
'fieldtype': u'Currency', 'fieldtype': u'Currency',
'label': u'Grand Total', 'label': u'Write Off Amount',
'oldfieldname': u'grand_total', 'no_copy': 1,
'oldfieldtype': u'Currency', 'permlevel': 0,
'permlevel': 1,
'print_hide': 1 'print_hide': 1
}, },
# DocField # DocField
{ {
'colour': u'White:FFF', 'colour': u'White:FFF',
'description': u'In Words will be visible once you save the Purchase Invoice.', 'depends_on': u'eval:flt(doc.write_off_amount)!=0',
'doctype': u'DocField', 'doctype': u'DocField',
'fieldname': u'in_words', 'fieldname': u'write_off_account',
'fieldtype': u'Data', 'fieldtype': u'Link',
'label': u'In Words', 'label': u'Write Off Account',
'oldfieldname': u'in_words', 'no_copy': 1,
'oldfieldtype': u'Data', 'options': u'Account',
'permlevel': 1, 'permlevel': 0,
'print_hide': 1 'print_hide': 1
}, },
# DocField # DocField
{ {
'colour': u'White:FFF',
'depends_on': u'eval:flt(doc.write_off_amount)!=0',
'doctype': u'DocField', 'doctype': u'DocField',
'fieldname': u'net_total_import', 'fieldname': u'write_off_cost_center',
'fieldtype': u'Currency', 'fieldtype': u'Link',
'label': u'Net Total (Import)', 'label': u'Write Off Cost Center',
'oldfieldname': u'net_total_import', 'no_copy': 1,
'oldfieldtype': u'Currency', 'options': u'Account',
'permlevel': 1, 'permlevel': 0,
'print_hide': 1 'print_hide': 1
}, },

View File

@ -82,6 +82,9 @@ def execute():
# Reload GL Mapper # Reload GL Mapper
for d in webnotes.conn.sql("select name from `tabGL Mapper`"): for d in webnotes.conn.sql("select name from `tabGL Mapper`"):
reload_doc('accounts', 'GL Mapper', d[0]) reload_doc('accounts', 'GL Mapper', d[0])
reload_doc('accounts', 'GL Mapper', 'Purchase Invoice with write off')
#gl entry, stock ledger entry, #gl entry, stock ledger entry,

View File

@ -3,9 +3,9 @@
# These values are common in all dictionaries # These values are common in all dictionaries
{ {
'creation': '2012-03-27 14:36:46', 'creation': '2012-04-13 11:56:40',
'docstatus': 0, 'docstatus': 0,
'modified': '2012-03-27 14:36:46', 'modified': '2012-04-23 12:27:38',
'modified_by': u'Administrator', 'modified_by': u'Administrator',
'owner': u'Administrator' 'owner': u'Administrator'
}, },
@ -21,7 +21,7 @@
'section_style': u'Simple', 'section_style': u'Simple',
'server_code_error': u' ', 'server_code_error': u' ',
'show_in_menu': 0, 'show_in_menu': 0,
'version': 3 'version': 1
}, },
# These values are common for all DocField # These values are common for all DocField
@ -36,6 +36,7 @@
# These values are common for all DocPerm # These values are common for all DocPerm
{ {
'create': 0,
'doctype': u'DocPerm', 'doctype': u'DocPerm',
'name': '__common__', 'name': '__common__',
'parent': u'GL Mapper', 'parent': u'GL Mapper',
@ -55,7 +56,6 @@
{ {
'amend': 0, 'amend': 0,
'cancel': 0, 'cancel': 0,
'create': 0,
'doctype': u'DocPerm', 'doctype': u'DocPerm',
'role': u'Accounts User', 'role': u'Accounts User',
'submit': 0, 'submit': 0,