From 3f711e2cb0a9cb3c0ca6a7fff967c9973af9b98c Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 3 Feb 2012 18:03:32 +0530 Subject: [PATCH 1/6] Fix in support ticket response issue --- erpnext/support/doctype/support_ticket/support_ticket.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/support/doctype/support_ticket/support_ticket.py b/erpnext/support/doctype/support_ticket/support_ticket.py index 8c5fc979af..94f978874d 100644 --- a/erpnext/support/doctype/support_ticket/support_ticket.py +++ b/erpnext/support/doctype/support_ticket/support_ticket.py @@ -24,7 +24,7 @@ class DocType(TransactionBase): response = self.doc.new_response + '\n\n[Please do not change the subject while responding.]' # add last response to new response - response += unicode(self.last_response(), 'utf-8') + response += self.last_response() signature = webnotes.conn.get_value('Email Settings',None,'support_signature') if signature: From b05f1a68f5ea0d67f0f486133825887b476ca42e Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Sat, 4 Feb 2012 16:22:21 +0530 Subject: [PATCH 2/6] support ticket send issue --- erpnext/support/doctype/support_ticket/support_ticket.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/support/doctype/support_ticket/support_ticket.py b/erpnext/support/doctype/support_ticket/support_ticket.py index 94f978874d..383e0b2d3f 100644 --- a/erpnext/support/doctype/support_ticket/support_ticket.py +++ b/erpnext/support/doctype/support_ticket/support_ticket.py @@ -36,7 +36,7 @@ class DocType(TransactionBase): recipients = [self.doc.raised_by], \ sender=webnotes.conn.get_value('Email Settings',None,'support_email'), \ subject=subject, \ - msg=response.encode('utf-8')) + msg=response) self.doc.new_response = None webnotes.conn.set(self.doc,'status','Waiting for Customer') From fd5005567b459be86a3e31c20698e0e5ea30c3fb Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 6 Feb 2012 06:34:04 +0100 Subject: [PATCH 3/6] Fix in setup role permissions --- .../doctype/setup_wizard_control/setup_wizard_control.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/erpnext/setup/doctype/setup_wizard_control/setup_wizard_control.py b/erpnext/setup/doctype/setup_wizard_control/setup_wizard_control.py index 10904c3f6f..f6b04eb487 100644 --- a/erpnext/setup/doctype/setup_wizard_control/setup_wizard_control.py +++ b/erpnext/setup/doctype/setup_wizard_control/setup_wizard_control.py @@ -46,11 +46,7 @@ class DocType: #======================================================================================================= def get_page_lst(self,nm): - - r1 = cstr(webnotes.user.get_roles()).replace('[','').replace(']','') - - ret = sql("select parent from `tabPage Role` where role in (%s) and parent = '%s'"%(r1,nm)) - + ret = sql("select parent from `tabPage Role` where role in ('%s') and parent = '%s'" % ("','".join(webnotes.user.get_roles()),nm)) return ret and True or False #======================================================================================================= From 7e13f9b4b5c132936e3737cc02636a77da1ca040 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 6 Feb 2012 11:41:25 +0530 Subject: [PATCH 4/6] Fix in email digest due to unicode change --- erpnext/setup/doctype/email_digest/email_digest.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py index 73c3a1ee7a..93273ba7aa 100644 --- a/erpnext/setup/doctype/email_digest/email_digest.py +++ b/erpnext/setup/doctype/email_digest/email_digest.py @@ -520,7 +520,8 @@ class DocType: currency = company.default_currency def table(args): - if type(args['body']) == type(''): + table_body = "" + if isinstance(args['body'], basestring): table_body = """\ Date: Mon, 6 Feb 2012 18:06:34 +0530 Subject: [PATCH 5/6] Fix in valuation_control.py: eval requires a string. does not accept None. --- erpnext/stock/doctype/valuation_control/valuation_control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/valuation_control/valuation_control.py b/erpnext/stock/doctype/valuation_control/valuation_control.py index f37b7e7c7f..52d9640250 100644 --- a/erpnext/stock/doctype/valuation_control/valuation_control.py +++ b/erpnext/stock/doctype/valuation_control/valuation_control.py @@ -107,7 +107,7 @@ class DocType: prev_sle = bin_obj.get_prev_sle(posting_date, posting_time) if not prev_sle: return 0.0 - fcfs_stack = eval(prev_sle.get('fcfs_stack', '[]')) + fcfs_stack = eval(str(prev_sle.get('fcfs_stack', '[]'))) in_rate = fcfs_stack and self.get_fifo_rate(fcfs_stack) or 0 elif val_method == 'Moving Average': prev_sle = bin_obj.get_prev_sle(posting_date, posting_time) From d008964fd65c500dc6850d0344b453deae7b1ca4 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 7 Feb 2012 10:48:11 +0530 Subject: [PATCH 6/6] Fetch defaults in purchase common and sales common related doctypes and fix minor utf-8 issues --- .../Purchase Order-Payable Voucher.txt | 126 ++-- .../Purchase Receipt-Payable Voucher.txt | 158 ++-- .../journal_voucher/journal_voucher.js | 169 +++-- .../payable_voucher/payable_voucher.js | 389 +++++----- .../payable_voucher/payable_voucher.py | 16 +- .../receivable_voucher/receivable_voucher.js | 3 + .../receivable_voucher/receivable_voucher.py | 21 +- erpnext/buying/doctype/indent/indent.js | 144 ++-- erpnext/buying/doctype/indent/indent.py | 16 +- .../purchase_common/purchase_common.js | 706 ++++++++++-------- .../purchase_common/purchase_common.py | 8 +- .../doctype/purchase_order/purchase_order.js | 275 +++---- .../doctype/purchase_order/purchase_order.py | 615 +++++++-------- .../attendance_control_panel.py | 5 +- erpnext/selling/doctype/enquiry/enquiry.js | 378 +++++----- .../selling/doctype/quotation/quotation.js | 309 ++++---- .../selling/doctype/quotation/quotation.py | 584 ++++++++------- .../doctype/sales_common/sales_common.js | 496 ++++++------ .../doctype/sales_common/sales_common.py | 5 +- .../doctype/sales_order/sales_order.js | 403 +++++----- .../doctype/sales_order/sales_order.py | 14 +- .../doctype/email_digest/email_digest.py | 2 +- .../setup/doctype/price_list/price_list.py | 7 +- .../upload_accounts_transactions.py | 5 +- .../doctype/delivery_note/delivery_note.js | 426 +++++------ .../doctype/delivery_note/delivery_note.py | 14 +- .../purchase_receipt/purchase_receipt.js | 344 ++++----- .../purchase_receipt/purchase_receipt.py | 677 +++++++++-------- .../stock_reconciliation.py | 5 +- .../doctype/support_ticket/__init__.py | 5 +- .../bulk_rename_tool/bulk_rename_tool.py | 3 +- index.html | 2 +- version.num | 2 +- 33 files changed, 3288 insertions(+), 3044 deletions(-) diff --git a/erpnext/accounts/DocType Mapper/Purchase Order-Payable Voucher/Purchase Order-Payable Voucher.txt b/erpnext/accounts/DocType Mapper/Purchase Order-Payable Voucher/Purchase Order-Payable Voucher.txt index e58f738329..4bb3141d4d 100644 --- a/erpnext/accounts/DocType Mapper/Purchase Order-Payable Voucher/Purchase Order-Payable Voucher.txt +++ b/erpnext/accounts/DocType Mapper/Purchase Order-Payable Voucher/Purchase Order-Payable Voucher.txt @@ -5,145 +5,145 @@ { 'creation': '2010-08-08 17:09:35', 'docstatus': 0, - 'modified': '2011-10-12 12:10:15', - 'modified_by': 'Administrator', - 'owner': 'Administrator' + 'modified': '2012-02-06 15:25:06', + 'modified_by': u'Administrator', + 'owner': u'Administrator' }, # These values are common for all Table Mapper Detail { - 'doctype': 'Table Mapper Detail', + 'doctype': u'Table Mapper Detail', 'name': '__common__', - 'parent': 'Purchase Order-Payable Voucher', - 'parentfield': 'table_mapper_details', - 'parenttype': 'DocType Mapper' + 'parent': u'Purchase Order-Payable Voucher', + 'parentfield': u'table_mapper_details', + 'parenttype': u'DocType Mapper' }, # These values are common for all Field Mapper Detail { - 'doctype': 'Field Mapper Detail', + 'doctype': u'Field Mapper Detail', 'name': '__common__', - 'parent': 'Purchase Order-Payable Voucher', - 'parentfield': 'field_mapper_details', - 'parenttype': 'DocType Mapper' + 'parent': u'Purchase Order-Payable Voucher', + 'parentfield': u'field_mapper_details', + 'parenttype': u'DocType Mapper' }, # These values are common for all DocType Mapper { 'doctype': u'DocType Mapper', - 'from_doctype': 'Purchase Order', - 'module': 'Accounts', + 'from_doctype': u'Purchase Order', + 'module': u'Accounts', 'name': '__common__', 'ref_doc_submitted': 1, - 'to_doctype': 'Payable Voucher' + 'to_doctype': u'Payable Voucher' }, # DocType Mapper, Purchase Order-Payable Voucher { 'doctype': u'DocType Mapper', - 'name': 'Purchase Order-Payable Voucher' + 'name': u'Purchase Order-Payable Voucher' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'eval: flt(obj.qty) - flt(obj.billed_qty)', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'eval: flt(obj.qty) - flt(obj.billed_qty)', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'qty' + 'to_field': u'qty' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'purchase_rate', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'purchase_rate', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'rate' + 'to_field': u'rate' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.purchase_rate)', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.purchase_rate)', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'amount' + 'to_field': u'amount' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.import_rate)', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.import_rate)', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'import_amount' + 'to_field': u'import_amount' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'parent', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'parent', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'purchase_order' + 'to_field': u'purchase_order' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'name', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'name', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'po_detail' + 'to_field': u'po_detail' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'naming_series', - 'map': 'No', + 'doctype': u'Field Mapper Detail', + 'from_field': u'naming_series', + 'map': u'No', 'match_id': 0, - 'to_field': 'naming_series' + 'to_field': u'naming_series' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'total_tax', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'total_tax', + 'map': u'Yes', 'match_id': 0, - 'to_field': 'total_tax' + 'to_field': u'total_tax' }, # Table Mapper Detail { - 'doctype': 'Table Mapper Detail', - 'from_table': 'Purchase Order', + 'doctype': u'Table Mapper Detail', + 'from_table': u'Purchase Order', 'match_id': 0, - 'to_table': 'Payable Voucher', - 'validation_logic': 'docstatus =1' + 'to_table': u'Payable Voucher', + 'validation_logic': u'docstatus =1' }, # Table Mapper Detail { - 'doctype': 'Table Mapper Detail', - 'from_field': 'po_details', - 'from_table': 'PO Detail', + 'doctype': u'Table Mapper Detail', + 'from_field': u'po_details', + 'from_table': u'PO Detail', 'match_id': 1, - 'to_field': 'entries', - 'to_table': 'PV Detail', - 'validation_logic': 'ifnull(billed_qty,0) < qty and docstatus = 1' + 'to_field': u'entries', + 'to_table': u'PV Detail', + 'validation_logic': u'ifnull(billed_qty,0) < qty and docstatus = 1' }, # Table Mapper Detail { - 'doctype': 'Table Mapper Detail', - 'from_field': 'purchase_tax_details', - 'from_table': 'Purchase Tax Detail', + 'doctype': u'Table Mapper Detail', + 'from_field': u'purchase_tax_details', + 'from_table': u'Purchase Tax Detail', 'match_id': 2, - 'to_field': 'purchase_tax_details', - 'to_table': 'Purchase Tax Detail', - 'validation_logic': 'docstatus =1' + 'to_field': u'purchase_tax_details', + 'to_table': u'Purchase Tax Detail', + 'validation_logic': u'docstatus =1' } ] \ No newline at end of file diff --git a/erpnext/accounts/DocType Mapper/Purchase Receipt-Payable Voucher/Purchase Receipt-Payable Voucher.txt b/erpnext/accounts/DocType Mapper/Purchase Receipt-Payable Voucher/Purchase Receipt-Payable Voucher.txt index 1744c4dc27..ffc748bd89 100644 --- a/erpnext/accounts/DocType Mapper/Purchase Receipt-Payable Voucher/Purchase Receipt-Payable Voucher.txt +++ b/erpnext/accounts/DocType Mapper/Purchase Receipt-Payable Voucher/Purchase Receipt-Payable Voucher.txt @@ -5,181 +5,181 @@ { 'creation': '2010-08-08 17:09:35', 'docstatus': 0, - 'modified': '2011-10-12 10:49:26', - 'modified_by': 'Administrator', - 'owner': 'Administrator' + 'modified': '2012-02-06 15:26:25', + 'modified_by': u'Administrator', + 'owner': u'Administrator' }, # These values are common for all Table Mapper Detail { - 'doctype': 'Table Mapper Detail', + 'doctype': u'Table Mapper Detail', 'name': '__common__', - 'parent': 'Purchase Receipt-Payable Voucher', - 'parentfield': 'table_mapper_details', - 'parenttype': 'DocType Mapper' + 'parent': u'Purchase Receipt-Payable Voucher', + 'parentfield': u'table_mapper_details', + 'parenttype': u'DocType Mapper' }, # These values are common for all Field Mapper Detail { - 'doctype': 'Field Mapper Detail', + 'doctype': u'Field Mapper Detail', 'name': '__common__', - 'parent': 'Purchase Receipt-Payable Voucher', - 'parentfield': 'field_mapper_details', - 'parenttype': 'DocType Mapper' + 'parent': u'Purchase Receipt-Payable Voucher', + 'parentfield': u'field_mapper_details', + 'parenttype': u'DocType Mapper' }, # These values are common for all DocType Mapper { 'doctype': u'DocType Mapper', - 'from_doctype': 'Purchase Receipt', - 'module': 'Accounts', + 'from_doctype': u'Purchase Receipt', + 'module': u'Accounts', 'name': '__common__', 'ref_doc_submitted': 1, - 'to_doctype': 'Payable Voucher' + 'to_doctype': u'Payable Voucher' }, # DocType Mapper, Purchase Receipt-Payable Voucher { 'doctype': u'DocType Mapper', - 'name': 'Purchase Receipt-Payable Voucher' + 'name': u'Purchase Receipt-Payable Voucher' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'eval: flt(obj.qty) - flt(obj.billed_qty)', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'eval: flt(obj.qty) - flt(obj.billed_qty)', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'qty' + 'to_field': u'qty' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'purchase_rate', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'purchase_rate', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'rate' + 'to_field': u'rate' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.purchase_rate)', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.purchase_rate)', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'amount' + 'to_field': u'amount' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.import_rate)', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.import_rate)', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'import_amount' + 'to_field': u'import_amount' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'parent', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'parent', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'purchase_receipt' + 'to_field': u'purchase_receipt' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'prevdoc_docname', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'prevdoc_docname', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'purchase_order' + 'to_field': u'purchase_order' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'name', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'name', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'pr_detail' + 'to_field': u'pr_detail' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'prevdoc_detail_docname', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'prevdoc_detail_docname', + 'map': u'Yes', 'match_id': 1, - 'to_field': 'po_detail' + 'to_field': u'po_detail' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'naming_series', - 'map': 'No', + 'doctype': u'Field Mapper Detail', + 'from_field': u'naming_series', + 'map': u'No', 'match_id': 0, - 'to_field': 'naming_series' + 'to_field': u'naming_series' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'net_total', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'net_total', + 'map': u'Yes', 'match_id': 0, - 'to_field': 'net_total' + 'to_field': u'net_total' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'grand_total', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'grand_total', + 'map': u'Yes', 'match_id': 0, - 'to_field': 'grand_total' + 'to_field': u'grand_total' }, # Field Mapper Detail { - 'doctype': 'Field Mapper Detail', - 'from_field': 'total_tax', - 'map': 'Yes', + 'doctype': u'Field Mapper Detail', + 'from_field': u'total_tax', + 'map': u'Yes', 'match_id': 0, - 'to_field': 'total_tax' + 'to_field': u'total_tax' }, # Table Mapper Detail { - 'doctype': 'Table Mapper Detail', - 'from_field': 'purchase_receipt_details', - 'from_table': 'Purchase Receipt Detail', + 'doctype': u'Table Mapper Detail', + 'from_field': u'purchase_receipt_details', + 'from_table': u'Purchase Receipt Detail', 'match_id': 1, - 'to_field': 'entries', - 'to_table': 'PV Detail', - 'validation_logic': 'ifnull(billed_qty,0) < qty' + 'to_field': u'entries', + 'to_table': u'PV Detail', + 'validation_logic': u'ifnull(billed_qty,0) < qty' }, # Table Mapper Detail { - 'doctype': 'Table Mapper Detail', - 'from_table': 'Purchase Receipt', + 'doctype': u'Table Mapper Detail', + 'from_table': u'Purchase Receipt', 'match_id': 0, - 'to_table': 'Payable Voucher', - 'validation_logic': 'docstatus=1' + 'to_table': u'Payable Voucher', + 'validation_logic': u'docstatus=1' }, # Table Mapper Detail { - 'doctype': 'Table Mapper Detail', - 'from_field': 'purchase_tax_details', - 'from_table': 'Purchase Tax Detail', + 'doctype': u'Table Mapper Detail', + 'from_field': u'purchase_tax_details', + 'from_table': u'Purchase Tax Detail', 'match_id': 2, - 'to_field': 'purchase_tax_details', - 'to_table': 'Purchase Tax Detail', - 'validation_logic': 'docstatus=1' + 'to_field': u'purchase_tax_details', + 'to_table': u'Purchase Tax Detail', + 'validation_logic': u'docstatus=1' } ] \ No newline at end of file diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js index 99fb10a716..b63f448430 100644 --- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js +++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js @@ -1,156 +1,177 @@ cur_frm.cscript.onload = function(doc, cdt, cdn) { - var cp = locals['Control Panel']['Control Panel']; - - if (!doc.voucher_date) doc.voucher_date = dateutil.obj_to_str(new Date()); + var cp = locals['Control Panel']['Control Panel']; + + if (!doc.voucher_date) doc.voucher_date = dateutil.obj_to_str(new Date()); + + if(cp.country == 'India') { + unhide_field(['tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','supplier_account']); + } + else { + hide_field(['tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','supplier_account']); + } + + cur_frm.cscript.load_defaults(doc, cdt, cdn); - if(cp.country == 'India') { - unhide_field(['tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','supplier_account']); - } - else { - hide_field(['tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','supplier_account']); - } } + +cur_frm.cscript.load_defaults = function(doc, cdt, cdn) { + if(!cur_frm.doc.__islocal || !cur_frm.doc.company) { return; } + + doc = locals[doc.doctype][doc.name]; + var fields_to_refresh = LocalDB.set_default_values(doc); + if(fields_to_refresh) { refresh_many(fields_to_refresh); } + + fields_to_refresh = null; + var children = getchildren('Journal Voucher Detail', doc.name, 'entries'); + if(!children) { return; } + for(var i=0; i 0 AND `tabPayable Voucher`.docstatus = 1 AND `tabPayable Voucher`.%(key)s LIKE '%s' ORDER BY `tabPayable Voucher`.name DESC LIMIT 200"; + var d = locals[this.doctype][this.docname]; + return "SELECT `tabPayable Voucher`.name, `tabPayable Voucher`.credit_to, `tabPayable Voucher`.outstanding_amount,`tabPayable Voucher`.bill_no, `tabPayable Voucher`.bill_date FROM `tabPayable Voucher` WHERE `tabPayable Voucher`.credit_to='"+d.account+"' AND `tabPayable Voucher`.outstanding_amount > 0 AND `tabPayable Voucher`.docstatus = 1 AND `tabPayable Voucher`.%(key)s LIKE '%s' ORDER BY `tabPayable Voucher`.name DESC LIMIT 200"; } cur_frm.fields_dict['entries'].grid.get_field('against_invoice').get_query = function(doc) { - var d = locals[this.doctype][this.docname]; - return "SELECT `tabReceivable Voucher`.name, `tabReceivable Voucher`.debit_to, `tabReceivable Voucher`.outstanding_amount FROM `tabReceivable Voucher` WHERE `tabReceivable Voucher`.debit_to='"+d.account+"' AND `tabReceivable Voucher`.outstanding_amount > 0 AND `tabReceivable Voucher`.docstatus = 1 AND `tabReceivable Voucher`.%(key)s LIKE '%s' ORDER BY `tabReceivable Voucher`.name DESC LIMIT 200"; + var d = locals[this.doctype][this.docname]; + return "SELECT `tabReceivable Voucher`.name, `tabReceivable Voucher`.debit_to, `tabReceivable Voucher`.outstanding_amount FROM `tabReceivable Voucher` WHERE `tabReceivable Voucher`.debit_to='"+d.account+"' AND `tabReceivable Voucher`.outstanding_amount > 0 AND `tabReceivable Voucher`.docstatus = 1 AND `tabReceivable Voucher`.%(key)s LIKE '%s' ORDER BY `tabReceivable Voucher`.name DESC LIMIT 200"; } // TDS Account Head cur_frm.fields_dict['tax_code'].get_query = function(doc) { - return "SELECT `tabTDS Category Account`.account_head FROM `tabTDS Category Account` WHERE `tabTDS Category Account`.parent = '"+doc.tds_category+"' AND `tabTDS Category Account`.company='"+doc.company+"' AND `tabTDS Category Account`.account_head LIKE '%s' ORDER BY `tabTDS Category Account`.account_head DESC LIMIT 50"; + return "SELECT `tabTDS Category Account`.account_head FROM `tabTDS Category Account` WHERE `tabTDS Category Account`.parent = '"+doc.tds_category+"' AND `tabTDS Category Account`.company='"+doc.company+"' AND `tabTDS Category Account`.account_head LIKE '%s' ORDER BY `tabTDS Category Account`.account_head DESC LIMIT 50"; } //Set debit and credit to zero on adding new row //---------------------------------------------- cur_frm.fields_dict['entries'].grid.onrowadd = function(doc, cdt, cdn){ - var d = locals[cdt][cdn]; - if(d.idx == 1){ - d.debit = 0; - d.credit = 0; - } + var d = locals[cdt][cdn]; + if(d.idx == 1){ + d.debit = 0; + d.credit = 0; + } } // Get Outstanding of Payable & Receivable Voucher // ----------------------------------------------- cur_frm.cscript.against_voucher = function(doc,cdt,cdn) { - var d = locals[cdt][cdn]; - if (d.against_voucher && !flt(d.debit)) { - args = {'doctype': 'Payable Voucher', 'docname': d.against_voucher } - get_server_fields('get_outstanding',docstring(args),'entries',doc,cdt,cdn,1,function(r,rt) { cur_frm.cscript.update_totals(doc); }); - } + var d = locals[cdt][cdn]; + if (d.against_voucher && !flt(d.debit)) { + args = {'doctype': 'Payable Voucher', 'docname': d.against_voucher } + get_server_fields('get_outstanding',docstring(args),'entries',doc,cdt,cdn,1,function(r,rt) { cur_frm.cscript.update_totals(doc); }); + } } cur_frm.cscript.against_invoice = function(doc,cdt,cdn) { - var d = locals[cdt][cdn]; - if (d.against_invoice && !flt(d.credit)) { - args = {'doctype': 'Receivable Voucher', 'docname': d.against_invoice } - get_server_fields('get_outstanding',docstring(args),'entries',doc,cdt,cdn,1,function(r,rt) { cur_frm.cscript.update_totals(doc); }); - } + var d = locals[cdt][cdn]; + if (d.against_invoice && !flt(d.credit)) { + args = {'doctype': 'Receivable Voucher', 'docname': d.against_invoice } + get_server_fields('get_outstanding',docstring(args),'entries',doc,cdt,cdn,1,function(r,rt) { cur_frm.cscript.update_totals(doc); }); + } } // Update Totals // --------------- cur_frm.cscript.update_totals = function(doc) { - var td=0.0; var tc =0.0; - var el = getchildren('Journal Voucher Detail', doc.name, 'entries'); - for(var i in el) { - td += flt(el[i].debit); - tc += flt(el[i].credit); - } - var doc = locals[doc.doctype][doc.name]; - tc += flt(doc.ded_amount) - doc.total_debit = td; - doc.total_credit = tc; - doc.difference = flt(td - tc); - refresh_many(['total_debit','total_credit','difference']); + var td=0.0; var tc =0.0; + var el = getchildren('Journal Voucher Detail', doc.name, 'entries'); + for(var i in el) { + td += flt(el[i].debit); + tc += flt(el[i].credit); + } + var doc = locals[doc.doctype][doc.name]; + tc += flt(doc.ded_amount) + doc.total_debit = td; + doc.total_credit = tc; + doc.difference = flt(td - tc); + refresh_many(['total_debit','total_credit','difference']); } cur_frm.cscript.debit = function(doc,dt,dn) { cur_frm.cscript.update_totals(doc); } cur_frm.cscript.credit = function(doc,dt,dn) { cur_frm.cscript.update_totals(doc); } cur_frm.cscript.ded_amount = function(doc,dt,dn) { cur_frm.cscript.update_totals(doc); } cur_frm.cscript.rate = function(doc,dt,dn) { - doc.ded_amount = doc.total_debit*doc.rate/100; - refresh_field('ded_amount'); - cur_frm.cscript.update_totals(doc); + doc.ded_amount = doc.total_debit*doc.rate/100; + refresh_field('ded_amount'); + cur_frm.cscript.update_totals(doc); } cur_frm.cscript['Get Balance'] = function(doc,dt,dn) { - cur_frm.cscript.update_totals(doc); - $c_obj(make_doclist(dt,dn), 'get_balance', '', function(r, rt){ - cur_frm.refresh(); - }); + cur_frm.cscript.update_totals(doc); + $c_obj(make_doclist(dt,dn), 'get_balance', '', function(r, rt){ + cur_frm.refresh(); + }); } // Get balance // ----------- cur_frm.cscript.account = function(doc,dt,dn) { - var d = locals[dt][dn]; - $c_obj('GL Control','get_bal',d.account+'~~~'+doc.fiscal_year, function(r,rt) { d.balance = r.message; refresh_field('balance',d.name,'entries'); }); + var d = locals[dt][dn]; + $c_obj('GL Control','get_bal',d.account+'~~~'+doc.fiscal_year, function(r,rt) { d.balance = r.message; refresh_field('balance',d.name,'entries'); }); } cur_frm.cscript.validate = function(doc,cdt,cdn) { - cur_frm.cscript.update_totals(doc); + cur_frm.cscript.update_totals(doc); } // TDS // -------- cur_frm.cscript['Get TDS'] = function(doc, dt, dn) { - $c_obj(make_doclist(dt,dn), 'get_tds', '', function(r, rt){ - cur_frm.refresh(); - cur_frm.cscript.update_totals(doc); - }); + $c_obj(make_doclist(dt,dn), 'get_tds', '', function(r, rt){ + cur_frm.refresh(); + cur_frm.cscript.update_totals(doc); + }); } // ***************** Get Print Heading based on Receivable Voucher ***************** cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) { - return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50'; + return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50'; } cur_frm.cscript.select_print_heading = function(doc,cdt,cdn){ - if(doc.select_print_heading){ - // print heading - cur_frm.pformat.print_heading = doc.select_print_heading; - } - else - cur_frm.pformat.print_heading = "Journal Voucher"; + if(doc.select_print_heading){ + // print heading + cur_frm.pformat.print_heading = doc.select_print_heading; + } + else + cur_frm.pformat.print_heading = "Journal Voucher"; } /****************** Get Accounting Entry *****************/ cur_frm.cscript['View Ledger Entry'] = function(doc,cdt,cdn){ - var callback = function(report){ - report.set_filter('GL Entry', 'Voucher No',doc.name); - report.dt.run(); - } - loadreport('GL Entry','General Ledger', callback); + var callback = function(report){ + report.set_filter('GL Entry', 'Voucher No',doc.name); + report.dt.run(); + } + loadreport('GL Entry','General Ledger', callback); } diff --git a/erpnext/accounts/doctype/payable_voucher/payable_voucher.js b/erpnext/accounts/doctype/payable_voucher/payable_voucher.js index b3cbd6337e..44dea8a598 100644 --- a/erpnext/accounts/doctype/payable_voucher/payable_voucher.js +++ b/erpnext/accounts/doctype/payable_voucher/payable_voucher.js @@ -7,99 +7,102 @@ $import(Purchase Common) // On Load // -------- cur_frm.cscript.onload = function(doc,dt,dn) { - var cp = locals['Control Panel']['Control Panel']; - - if(!doc.voucher_date) set_multiple(dt,dn,{voucher_date:get_today()}); - if(!doc.posting_date) set_multiple(dt,dn,{posting_date:get_today()}); + var cp = locals['Control Panel']['Control Panel']; + + if(!doc.voucher_date) set_multiple(dt,dn,{voucher_date:get_today()}); + if(!doc.posting_date) set_multiple(dt,dn,{posting_date:get_today()}); - if(cp.country == 'India') { - unhide_field(['TDS','tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','total_tds_on_voucher','tds_amount_on_advance']); - } - else { - hide_field(['TDS','tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','total_tds_on_voucher','tds_amount_on_advance']); - } - - if(doc.__islocal){ - hide_field(['supplier_address', 'contact_person', 'supplier_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email']); - } + if(cp.country == 'India') { + unhide_field(['TDS','tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','total_tds_on_voucher','tds_amount_on_advance']); + } + else { + hide_field(['TDS','tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','total_tds_on_voucher','tds_amount_on_advance']); + } + + if(doc.__islocal){ + hide_field(['supplier_address', 'contact_person', 'supplier_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email']); + } + + // defined in purchase_common.js + cur_frm.cscript.update_item_details(doc, cdt, cdn); } //Onload post render //------------------------ cur_frm.cscript.onload_post_render = function(doc, dt, dn) { - if(doc.__islocal && doc.supplier) cur_frm.cscript.supplier(doc,dt,dn); + if(doc.__islocal && doc.supplier) cur_frm.cscript.supplier(doc,dt,dn); } // Refresh // -------- cur_frm.cscript.refresh = function(doc, dt, dn) { - - cur_frm.clear_custom_buttons(); + + cur_frm.clear_custom_buttons(); - // Show / Hide button - if(doc.docstatus==1 && doc.outstanding_amount > 0) - cur_frm.add_custom_button('Make Payment Entry', cur_frm.cscript['Make Bank Voucher']); - - if(doc.docstatus==1) { - unhide_field(['Repair Outstanding Amt']); - cur_frm.add_custom_button('View Ledger', cur_frm.cscript['View Ledger Entry']); - } else hide_field(['Repair Outstanding Amt']); - - cur_frm.cscript.is_opening(doc, dt, dn); + // Show / Hide button + if(doc.docstatus==1 && doc.outstanding_amount > 0) + cur_frm.add_custom_button('Make Payment Entry', cur_frm.cscript['Make Bank Voucher']); + + if(doc.docstatus==1) { + unhide_field(['Repair Outstanding Amt']); + cur_frm.add_custom_button('View Ledger', cur_frm.cscript['View Ledger Entry']); + } else hide_field(['Repair Outstanding Amt']); + + cur_frm.cscript.is_opening(doc, dt, dn); } //Supplier cur_frm.cscript.supplier = function(doc,dt,dn) { - var callback = function(r,rt) { - var doc = locals[cur_frm.doctype][cur_frm.docname]; - get_server_fields('get_credit_to','','',doc, dt, dn, 0, callback2); - } - - var callback2 = function(r,rt){ - var doc = locals[cur_frm.doctype][cur_frm.docname]; - var el = getchildren('PV Detail',doc.name,'entries'); - for(var i in el){ - if(el[i].item_code && (!el[i].expense_head || !el[i].cost_center)){ - args = "{'item_code':'" + el[i].item_code + "','expense_head':'" + el[i].expense_head + "','cost_center':'" + el[i].cost_center + "'}"; - get_server_fields('get_default_values', args, 'entries', doc, el[i].doctype, el[i].name, 1); - } - } - cur_frm.cscript.calc_amount(doc, 1); - } + var callback = function(r,rt) { + var doc = locals[cur_frm.doctype][cur_frm.docname]; + get_server_fields('get_credit_to','','',doc, dt, dn, 0, callback2); + } + + var callback2 = function(r,rt){ + var doc = locals[cur_frm.doctype][cur_frm.docname]; + var el = getchildren('PV Detail',doc.name,'entries'); + for(var i in el){ + if(el[i].item_code && (!el[i].expense_head || !el[i].cost_center)){ + args = "{'item_code':'" + el[i].item_code + "','expense_head':'" + el[i].expense_head + "','cost_center':'" + el[i].cost_center + "'}"; + get_server_fields('get_default_values', args, 'entries', doc, el[i].doctype, el[i].name, 1); + } + } + cur_frm.cscript.calc_amount(doc, 1); + } - if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1,callback); - if(doc.supplier) unhide_field(['supplier_address','contact_person','supplier_name','address_display','contact_display','contact_mobile','contact_email']); + if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1,callback); + if(doc.supplier) unhide_field(['supplier_address','contact_person','supplier_name','address_display','contact_display','contact_mobile','contact_email']); } cur_frm.cscript.supplier_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { - if(doc.supplier) get_server_fields('get_supplier_address', JSON.stringify({supplier: doc.supplier, address: doc.supplier_address, contact: doc.contact_person}),'', doc, dt, dn, 1); + if(doc.supplier) get_server_fields('get_supplier_address', JSON.stringify({supplier: doc.supplier, address: doc.supplier_address, contact: doc.contact_person}),'', doc, dt, dn, 1); } cur_frm.fields_dict.supplier_address.on_new = function(dn) { - locals['Address'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier; - locals['Address'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; + locals['Address'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier; + locals['Address'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; } cur_frm.fields_dict.contact_person.on_new = function(dn) { - locals['Contact'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier; - locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; + locals['Contact'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier; + locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; } cur_frm.cscript.credit_to = function(doc,dt,dn) { - var callback = function(r,rt) { - var doc = locals[cur_frm.doctype][cur_frm.docname]; - if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1); - if(doc.supplier) unhide_field(['supplier_address','contact_person','supplier_name','address_display','contact_display','contact_mobile','contact_email']); - cur_frm.refresh(); - } + var callback = function(r,rt) { + var doc = locals[cur_frm.doctype][cur_frm.docname]; + if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1); + if(doc.supplier) unhide_field(['supplier_address','contact_person','supplier_name','address_display','contact_display','contact_mobile','contact_email']); + cur_frm.refresh(); + } - get_server_fields('get_cust','','',doc,dt,dn,1,callback); + get_server_fields('get_cust','','',doc,dt,dn,1,callback); } @@ -107,43 +110,43 @@ cur_frm.cscript.credit_to = function(doc,dt,dn) { //Set expense_head and cost center on adding new row //---------------------------------------------- cur_frm.fields_dict['entries'].grid.onrowadd = function(doc, cdt, cdn){ - - cl = getchildren('PV Detail', doc.name, cur_frm.cscript.fname, doc.doctype); - acc = ''; - cc = ''; + + cl = getchildren('PV Detail', doc.name, cur_frm.cscript.fname, doc.doctype); + acc = ''; + cc = ''; - for(var i = 0; i NOW()) AND tabItem.%(key)s LIKE "%s" LIMIT 50' + return 'SELECT tabItem.name, tabItem.description FROM tabItem WHERE tabItem.is_purchase_item="Yes" AND (IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` ="0000-00-00" OR `tabItem`.`end_of_life` > NOW()) AND tabItem.%(key)s LIKE "%s" LIMIT 50' } // Credit To // ---------- cur_frm.fields_dict['credit_to'].get_query = function(doc) { - return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Credit" AND tabAccount.is_pl_account="No" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"' + return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Credit" AND tabAccount.is_pl_account="No" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"' } // Purchase Order // --------------- cur_frm.fields_dict['purchase_order_main'].get_query = function(doc) { - if (doc.supplier){ - return 'SELECT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 AND `tabPurchase Order`.supplier = "'+ doc.supplier +'" AND `tabPurchase Order`.`status` != "Stopped" AND ifnull(`tabPurchase Order`.`per_billed`,0) < 100 AND `tabPurchase Order`.`company` = "' + doc.company + '" AND `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50' - } else { - return 'SELECT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 AND `tabPurchase Order`.`status` != "Stopped" AND ifnull(`tabPurchase Order`.`per_billed`, 0) < 100 AND `tabPurchase Order`.`company` = "' + doc.company + '" AND `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50' - } + if (doc.supplier){ + return 'SELECT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 AND `tabPurchase Order`.supplier = "'+ doc.supplier +'" AND `tabPurchase Order`.`status` != "Stopped" AND ifnull(`tabPurchase Order`.`per_billed`,0) < 100 AND `tabPurchase Order`.`company` = "' + doc.company + '" AND `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50' + } else { + return 'SELECT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 AND `tabPurchase Order`.`status` != "Stopped" AND ifnull(`tabPurchase Order`.`per_billed`, 0) < 100 AND `tabPurchase Order`.`company` = "' + doc.company + '" AND `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50' + } } // Purchase Receipt // ----------------- cur_frm.fields_dict['purchase_receipt_main'].get_query = function(doc) { - if (doc.supplier){ - return 'SELECT `tabPurchase Receipt`.`name` FROM `tabPurchase Receipt` WHERE `tabPurchase Receipt`.`docstatus` = 1 AND `tabPurchase Receipt`.supplier = "'+ doc.supplier +'" AND `tabPurchase Receipt`.`status` != "Stopped" AND ifnull(`tabPurchase Receipt`.`per_billed`, 0) < 100 AND `tabPurchase Receipt`.`company` = "' + doc.company + '" AND `tabPurchase Receipt`.%(key)s LIKE "%s" ORDER BY `tabPurchase Receipt`.`name` DESC LIMIT 50' - } else { - return 'SELECT `tabPurchase Receipt`.`name` FROM `tabPurchase Receipt` WHERE `tabPurchase Receipt`.`docstatus` = 1 AND `tabPurchase Receipt`.`status` != "Stopped" AND ifnull(`tabPurchase Receipt`.`per_billed`, 0) < 100 AND `tabPurchase Receipt`.`company` = "' + doc.company + '" AND `tabPurchase Receipt`.%(key)s LIKE "%s" ORDER BY `tabPurchase Receipt`.`name` DESC LIMIT 50' - } + if (doc.supplier){ + return 'SELECT `tabPurchase Receipt`.`name` FROM `tabPurchase Receipt` WHERE `tabPurchase Receipt`.`docstatus` = 1 AND `tabPurchase Receipt`.supplier = "'+ doc.supplier +'" AND `tabPurchase Receipt`.`status` != "Stopped" AND ifnull(`tabPurchase Receipt`.`per_billed`, 0) < 100 AND `tabPurchase Receipt`.`company` = "' + doc.company + '" AND `tabPurchase Receipt`.%(key)s LIKE "%s" ORDER BY `tabPurchase Receipt`.`name` DESC LIMIT 50' + } else { + return 'SELECT `tabPurchase Receipt`.`name` FROM `tabPurchase Receipt` WHERE `tabPurchase Receipt`.`docstatus` = 1 AND `tabPurchase Receipt`.`status` != "Stopped" AND ifnull(`tabPurchase Receipt`.`per_billed`, 0) < 100 AND `tabPurchase Receipt`.`company` = "' + doc.company + '" AND `tabPurchase Receipt`.%(key)s LIKE "%s" ORDER BY `tabPurchase Receipt`.`name` DESC LIMIT 50' + } } // Get Print Heading cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) { - return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50'; + return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50'; } @@ -263,45 +266,45 @@ cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) // Expense Head // ------------- cur_frm.fields_dict['entries'].grid.get_field("expense_head").get_query = function(doc) { - return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Debit" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"'; + return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Debit" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"'; } cur_frm.cscript.expense_head = function(doc, cdt, cdn){ - var d = locals[cdt][cdn]; - if(d.idx == 1 && d.expense_head){ - var cl = getchildren('PV Detail', doc.name, 'entries', doc.doctype); - for(var i = 0; i < cl.length; i++){ - if(!cl[i].expense_head) cl[i].expense_head = d.expense_head; - } - } - refresh_field('entries'); + var d = locals[cdt][cdn]; + if(d.idx == 1 && d.expense_head){ + var cl = getchildren('PV Detail', doc.name, 'entries', doc.doctype); + for(var i = 0; i < cl.length; i++){ + if(!cl[i].expense_head) cl[i].expense_head = d.expense_head; + } + } + refresh_field('entries'); } // Cost Center //------------- cur_frm.fields_dict['entries'].grid.get_field("cost_center").get_query = function(doc) { - return 'SELECT `tabCost Center`.`name` FROM `tabCost Center` WHERE `tabCost Center`.`company_name` = "' +doc.company+'" AND `tabCost Center`.%(key)s LIKE "%s" AND `tabCost Center`.`group_or_ledger` = "Ledger" AND `tabCost Center`.docstatus != 2 ORDER BY `tabCost Center`.`name` ASC LIMIT 50'; + return 'SELECT `tabCost Center`.`name` FROM `tabCost Center` WHERE `tabCost Center`.`company_name` = "' +doc.company+'" AND `tabCost Center`.%(key)s LIKE "%s" AND `tabCost Center`.`group_or_ledger` = "Ledger" AND `tabCost Center`.docstatus != 2 ORDER BY `tabCost Center`.`name` ASC LIMIT 50'; } cur_frm.cscript.cost_center = function(doc, cdt, cdn){ - var d = locals[cdt][cdn]; - if(d.idx == 1 && d.cost_center){ - var cl = getchildren('PV Detail', doc.name, 'entries', doc.doctype); - for(var i = 0; i < cl.length; i++){ - if(!cl[i].cost_center) cl[i].cost_center = d.cost_center; - } - } - refresh_field('entries'); + var d = locals[cdt][cdn]; + if(d.idx == 1 && d.cost_center){ + var cl = getchildren('PV Detail', doc.name, 'entries', doc.doctype); + for(var i = 0; i < cl.length; i++){ + if(!cl[i].cost_center) cl[i].cost_center = d.cost_center; + } + } + refresh_field('entries'); } // TDS Account Head cur_frm.fields_dict['tax_code'].get_query = function(doc) { - return "SELECT `tabTDS Category Account`.account_head FROM `tabTDS Category Account` WHERE `tabTDS Category Account`.parent = '"+doc.tds_category+"' AND `tabTDS Category Account`.company='"+doc.company+"' AND `tabTDS Category Account`.account_head LIKE '%s' ORDER BY `tabTDS Category Account`.account_head DESC LIMIT 50"; + return "SELECT `tabTDS Category Account`.account_head FROM `tabTDS Category Account` WHERE `tabTDS Category Account`.parent = '"+doc.tds_category+"' AND `tabTDS Category Account`.company='"+doc.company+"' AND `tabTDS Category Account`.account_head LIKE '%s' ORDER BY `tabTDS Category Account`.account_head DESC LIMIT 50"; } cur_frm.cscript.tax_code = function(doc, dt, dn) { - get_server_fields('get_tds_rate','','',doc, dt, dn, 0); + get_server_fields('get_tds_rate','','',doc, dt, dn, 0); } /* ***************************** UTILITY FUNCTIONS ************************ */ @@ -309,69 +312,69 @@ cur_frm.cscript.tax_code = function(doc, dt, dn) { // Calculate Advance // ------------------ var calc_total_advance = function(doc,cdt,cdn) { - var doc = locals[doc.doctype][doc.name]; - var el = getchildren('Advance Allocation Detail',doc.name,'advance_allocation_details') - var tot_tds=0; - var total_advance = 0; - for(var i in el) { - if (! el[i].allocated_amount == 0) { - total_advance += flt(el[i].allocated_amount); - tot_tds += flt(el[i].tds_allocated) - } - } - doc.total_amount_to_pay = flt(doc.grand_total) - flt(doc.ded_amount); - doc.tds_amount_on_advance = flt(tot_tds); - doc.total_advance = flt(total_advance); - doc.outstanding_amount = flt(doc.total_amount_to_pay) - flt(total_advance); - refresh_many(['total_advance','outstanding_amount','tds_amount_on_advance', 'total_amount_to_pay']); + var doc = locals[doc.doctype][doc.name]; + var el = getchildren('Advance Allocation Detail',doc.name,'advance_allocation_details') + var tot_tds=0; + var total_advance = 0; + for(var i in el) { + if (! el[i].allocated_amount == 0) { + total_advance += flt(el[i].allocated_amount); + tot_tds += flt(el[i].tds_allocated) + } + } + doc.total_amount_to_pay = flt(doc.grand_total) - flt(doc.ded_amount); + doc.tds_amount_on_advance = flt(tot_tds); + doc.total_advance = flt(total_advance); + doc.outstanding_amount = flt(doc.total_amount_to_pay) - flt(total_advance); + refresh_many(['total_advance','outstanding_amount','tds_amount_on_advance', 'total_amount_to_pay']); } // Make JV // -------- cur_frm.cscript.make_jv = function(doc, dt, dn, bank_account) { - var jv = LocalDB.create('Journal Voucher'); - jv = locals['Journal Voucher'][jv]; - jv.voucher_type = 'Bank Voucher'; - jv.remark = repl('Payment against voucher %(vn)s for %(rem)s', {vn:doc.name, rem:doc.remarks}); - jv.total_debit = doc.outstanding_amount; - jv.total_credit = doc.outstanding_amount; - jv.fiscal_year = doc.fiscal_year; - jv.company = doc.company; - - // debit to creditor - var d1 = LocalDB.add_child(jv, 'Journal Voucher Detail', 'entries'); - d1.account = doc.credit_to; - d1.debit = doc.outstanding_amount; - d1.against_voucher = doc.name; - - // credit to bank - var d1 = LocalDB.add_child(jv, 'Journal Voucher Detail', 'entries'); - d1.account = bank_account; - d1.credit = doc.outstanding_amount; - - loaddoc('Journal Voucher', jv.name); + var jv = LocalDB.create('Journal Voucher'); + jv = locals['Journal Voucher'][jv]; + jv.voucher_type = 'Bank Voucher'; + jv.remark = repl('Payment against voucher %(vn)s for %(rem)s', {vn:doc.name, rem:doc.remarks}); + jv.total_debit = doc.outstanding_amount; + jv.total_credit = doc.outstanding_amount; + jv.fiscal_year = doc.fiscal_year; + jv.company = doc.company; + + // debit to creditor + var d1 = LocalDB.add_child(jv, 'Journal Voucher Detail', 'entries'); + d1.account = doc.credit_to; + d1.debit = doc.outstanding_amount; + d1.against_voucher = doc.name; + + // credit to bank + var d1 = LocalDB.add_child(jv, 'Journal Voucher Detail', 'entries'); + d1.account = bank_account; + d1.credit = doc.outstanding_amount; + + loaddoc('Journal Voucher', jv.name); } // ***************** Get project name ***************** cur_frm.fields_dict['entries'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) { - return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50'; + return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50'; } cur_frm.cscript.select_print_heading = function(doc,cdt,cdn){ - if(doc.select_print_heading){ - // print heading - cur_frm.pformat.print_heading = doc.select_print_heading; - } - else - cur_frm.pformat.print_heading = "Purchase Invoice"; + if(doc.select_print_heading){ + // print heading + cur_frm.pformat.print_heading = doc.select_print_heading; + } + else + cur_frm.pformat.print_heading = "Purchase Invoice"; } /****************** Get Accounting Entry *****************/ cur_frm.cscript['View Ledger Entry'] = function(){ - var callback = function(report){ - report.set_filter('GL Entry', 'Voucher No',cur_frm.doc.name); - report.dt.run(); - } - loadreport('GL Entry','General Ledger', callback); + var callback = function(report){ + report.set_filter('GL Entry', 'Voucher No',cur_frm.doc.name); + report.dt.run(); + } + loadreport('GL Entry','General Ledger', callback); } diff --git a/erpnext/accounts/doctype/payable_voucher/payable_voucher.py b/erpnext/accounts/doctype/payable_voucher/payable_voucher.py index a7e128bcea..e220756a81 100644 --- a/erpnext/accounts/doctype/payable_voucher/payable_voucher.py +++ b/erpnext/accounts/doctype/payable_voucher/payable_voucher.py @@ -92,7 +92,19 @@ class DocType(TransactionBase): # Get Item Details # ----------------- - def get_item_details(self,arg): + def get_item_details(self, arg=None): + if arg: + return self.get_pv_details(arg) + else: + for doc in self.doclist: + if doc.fields.get('item_code'): + ret = self.get_pv_details(doc.item_code) + for r in ret: + if not doc.fields.get(r): + doc.fields[r] = ret[r] + + + def get_pv_details(self, arg): item_det = sql("select item_name, brand, description, item_group,purchase_account,cost_center from tabItem where name=%s",arg,as_dict=1) tax = sql("select tax_type, tax_rate from `tabItem Tax` where parent = %s" , arg) t = {} @@ -110,6 +122,8 @@ class DocType(TransactionBase): 'item_tax_rate' : str(t) } return ret + + # Advance Allocation # ------------------- diff --git a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.js b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.js index e56b16c06b..dcd522ba63 100644 --- a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.js +++ b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.js @@ -25,6 +25,9 @@ cur_frm.cscript.onload = function(doc,dt,dn) { if(doc.is_pos ==1) cur_frm.cscript.is_pos(doc, dt, dn); hide_field(['customer_address', 'contact_person', 'customer_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']); + + // defined in sales_common.js + cur_frm.cscript.update_item_details(doc, cdt, cdn); } } diff --git a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py index 87d037358a..22294c583c 100644 --- a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py +++ b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py @@ -147,8 +147,22 @@ class DocType(TransactionBase): # Item Details # ------------- - def get_item_details(self, item_code): - ret = get_obj('Sales Common').get_item_details(item_code, self) + def get_item_details(self, item_code=None): + if item_code: + ret = get_obj('Sales Common').get_item_details(item_code, self) + return self.get_pos_details(item_code, ret) + else: + obj = get_obj('Sales Common') + for doc in self.doclist: + if doc.fields.get('item_code'): + ret = obj.get_item_details(doc.item_code, self) + ret = self.get_pos_details(item_code, ret) + for r in ret: + if not doc.fields.get(r): + doc.fields[r] = ret[r] + + + def get_pos_details(self, item_code, ret): if item_code and cint(self.doc.is_pos) == 1: dtl = webnotes.conn.sql("select income_account, warehouse, cost_center from `tabPOS Setting` where user = '%s' and company = '%s'" % (session['user'], self.doc.company), as_dict=1) if not dtl: @@ -160,7 +174,8 @@ class DocType(TransactionBase): actual_qty = webnotes.conn.sql("select actual_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (item_code, ret['warehouse'])) ret['actual_qty']= actual_qty and flt(actual_qty[0][0]) or 0 return ret - + + # Fetch ref rate from item master as per selected price list def get_adj_percent(self, arg=''): get_obj('Sales Common').get_adj_percent(self) diff --git a/erpnext/buying/doctype/indent/indent.js b/erpnext/buying/doctype/indent/indent.js index d9008ba30c..28c5a5aec0 100644 --- a/erpnext/buying/doctype/indent/indent.js +++ b/erpnext/buying/doctype/indent/indent.js @@ -3,76 +3,78 @@ cur_frm.cscript.fname = "indent_details"; $import(Purchase Common) $import(SMS Control) -cur_frm.cscript.indent_doctype_label = get_doctype_label('Indent'); - +cur_frm.cscript.indent_doctype_label = get_doctype_label('Indent'); + //========================== On Load ================================================= cur_frm.cscript.onload = function(doc, cdt, cdn) { - if (!doc.transaction_date) doc.transaction_date = dateutil.obj_to_str(new Date()) - if (!doc.status) doc.status = 'Draft'; - + if (!doc.transaction_date) doc.transaction_date = dateutil.obj_to_str(new Date()) + if (!doc.status) doc.status = 'Draft'; + + // defined in purchase_common.js + //cur_frm.cscript.update_item_details(doc, cdt, cdn); } cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) { - // second call - if(doc.__islocal){ - cur_frm.cscript.get_item_defaults(doc); - } + // second call + if(doc.__islocal){ + cur_frm.cscript.get_item_defaults(doc); + } } cur_frm.cscript.get_item_defaults = function(doc) { - var ch = getchildren( 'Indent Detail', doc.name, 'indent_details'); - if (flt(ch.length) > 0){ - $c_obj(make_doclist(doc.doctype, doc.name), 'get_item_defaults', '', function(r, rt) {refresh_field('indent_details'); }); - } + var ch = getchildren( 'Indent Detail', doc.name, 'indent_details'); + if (flt(ch.length) > 0){ + $c_obj(make_doclist(doc.doctype, doc.name), 'get_item_defaults', '', function(r, rt) {refresh_field('indent_details'); }); + } } //======================= Refresh ===================================== cur_frm.cscript.refresh = function(doc, cdt, cdn) { - // Unhide Fields in Next Steps - // --------------------------------- - - cur_frm.clear_custom_buttons(); + // Unhide Fields in Next Steps + // --------------------------------- + + cur_frm.clear_custom_buttons(); - if(doc.docstatus == 1 && doc.status != 'Stopped'){ - var ch = getchildren('Indent Detail',doc.name,'indent_details'); - var is_closed = 1; - for(var i in ch){ - if(flt(ch[i].qty) > flt(ch[i].ordered_qty)) is_closed = 0; - } - if(!is_closed) { - cur_frm.add_custom_button('Make Purchase Order', cur_frm.cscript['Make Purchase Order']) - cur_frm.add_custom_button('Stop ' + cur_frm.cscript.indent_doctype_label, cur_frm.cscript['Stop Purchase Requisition']) - } - cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); - } + if(doc.docstatus == 1 && doc.status != 'Stopped'){ + var ch = getchildren('Indent Detail',doc.name,'indent_details'); + var is_closed = 1; + for(var i in ch){ + if(flt(ch[i].qty) > flt(ch[i].ordered_qty)) is_closed = 0; + } + if(!is_closed) { + cur_frm.add_custom_button('Make Purchase Order', cur_frm.cscript['Make Purchase Order']) + cur_frm.add_custom_button('Stop ' + cur_frm.cscript.indent_doctype_label, cur_frm.cscript['Stop Purchase Requisition']) + } + cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); + } - if(doc.docstatus == 1 && doc.status == 'Stopped') - cur_frm.add_custom_button('Unstop ' + cur_frm.cscript.indent_doctype_label, cur_frm.cscript['Unstop Purchase Requisition']) - - if(doc.docstatus == 1) - unhide_field(['Repair Purchase Requisition']); - else - hide_field(['Repair Purchase Requisition']); + if(doc.docstatus == 1 && doc.status == 'Stopped') + cur_frm.add_custom_button('Unstop ' + cur_frm.cscript.indent_doctype_label, cur_frm.cscript['Unstop Purchase Requisition']) + + if(doc.docstatus == 1) + unhide_field(['Repair Purchase Requisition']); + else + hide_field(['Repair Purchase Requisition']); } //======================= validation =================================== cur_frm.cscript.validate = function(doc,cdt,cdn){ - is_item_table(doc,cdt,cdn); + is_item_table(doc,cdt,cdn); } //======================= transaction date ============================= cur_frm.cscript.transaction_date = function(doc,cdt,cdn){ - if(doc.__islocal){ - cur_frm.cscript.get_default_schedule_date(doc); - } + if(doc.__islocal){ + cur_frm.cscript.get_default_schedule_date(doc); + } } //=================== Quantity =================================================================== cur_frm.cscript.qty = function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - if (flt(d.qty) < flt(d.min_order_qty)) - alert("Warning: " + cur_frm.cscript.indent_doctype_label + " Qty is less than Minimum Order Qty"); + var d = locals[cdt][cdn]; + if (flt(d.qty) < flt(d.min_order_qty)) + alert("Warning: " + cur_frm.cscript.indent_doctype_label + " Qty is less than Minimum Order Qty"); } // On Button Click Functions @@ -80,43 +82,43 @@ cur_frm.cscript.qty = function(doc, cdt, cdn) { // Make Purchase Order cur_frm.cscript['Make Purchase Order'] = function() { - var doc = cur_frm.doc; - n = createLocal('Purchase Order'); - $c('dt_map', args={ - 'docs':compress_doclist([locals['Purchase Order'][n]]), - 'from_doctype':doc.doctype, - 'to_doctype':'Purchase Order', - 'from_docname':doc.name, - 'from_to_list':"[['Indent','Purchase Order'],['Indent Detail','PO Detail']]" - }, function(r,rt) { - loaddoc('Purchase Order', n); - } - ); + var doc = cur_frm.doc; + n = createLocal('Purchase Order'); + $c('dt_map', args={ + 'docs':compress_doclist([locals['Purchase Order'][n]]), + 'from_doctype':doc.doctype, + 'to_doctype':'Purchase Order', + 'from_docname':doc.name, + 'from_to_list':"[['Indent','Purchase Order'],['Indent Detail','PO Detail']]" + }, function(r,rt) { + loaddoc('Purchase Order', n); + } + ); } // Stop INDENT // ================================================================================================== cur_frm.cscript['Stop Purchase Requisition'] = function() { - var doc = cur_frm.doc; - var check = confirm("Do you really want to STOP this " + cur_frm.cscript.indent_doctype_label + "?"); + var doc = cur_frm.doc; + var check = confirm("Do you really want to STOP this " + cur_frm.cscript.indent_doctype_label + "?"); - if (check) { - $c('runserverobj', args={'method':'update_status', 'arg': 'Stopped', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) { - cur_frm.refresh(); - }); - } + if (check) { + $c('runserverobj', args={'method':'update_status', 'arg': 'Stopped', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) { + cur_frm.refresh(); + }); + } } // Un Stop INDENT //==================================================================================================== cur_frm.cscript['Unstop Purchase Requisition'] = function(){ - var doc = cur_frm.doc - var check = confirm("Do you really want to UNSTOP this " + cur_frm.cscript.indent_doctype_label + "?"); - - if (check) { - $c('runserverobj', args={'method':'update_status', 'arg': 'Submitted','docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) { - cur_frm.refresh(); - - }); - } + var doc = cur_frm.doc + var check = confirm("Do you really want to UNSTOP this " + cur_frm.cscript.indent_doctype_label + "?"); + + if (check) { + $c('runserverobj', args={'method':'update_status', 'arg': 'Submitted','docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) { + cur_frm.refresh(); + + }); + } } diff --git a/erpnext/buying/doctype/indent/indent.py b/erpnext/buying/doctype/indent/indent.py index 882098f238..148d50dbee 100644 --- a/erpnext/buying/doctype/indent/indent.py +++ b/erpnext/buying/doctype/indent/indent.py @@ -90,7 +90,21 @@ class DocType: # get item details # --------------------------------- def get_item_details(self, arg =''): - return get_obj(dt='Purchase Common').get_item_details(self,arg) + if arg: + return get_obj(dt='Purchase Common').get_item_details(self,arg) + else: + obj = get_obj('Purchase Common') + for doc in self.doclist: + if doc.fields.get('item_code'): + temp = { + 'item_code': doc.fields.get('item_code'), + 'warehouse': doc.fields.get('warehouse') + } + ret = obj.get_item_details(self, json.dumps(temp)) + for r in ret: + if not doc.fields.get(r): + doc.fields[r] = ret[r] + # Get UOM Details # --------------------------------- diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.js b/erpnext/buying/doctype/purchase_common/purchase_common.js index 53304b0f69..541a225e36 100644 --- a/erpnext/buying/doctype/purchase_common/purchase_common.js +++ b/erpnext/buying/doctype/purchase_common/purchase_common.js @@ -7,389 +7,433 @@ var fname = cur_frm.cscript.fname; cur_frm.cscript.get_default_schedule_date = function(doc) { - var ch = getchildren( tname, doc.name, fname); - if (flt(ch.length) > 0){ - $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_schedule_date', '', function(r, rt) { refresh_field(fname); }); - } + var ch = getchildren( tname, doc.name, fname); + if (flt(ch.length) > 0){ + $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_schedule_date', '', function(r, rt) { refresh_field(fname); }); + } +} + + +// Gets called after existing item details are update to fill in +// remaining default values +cur_frm.cscript.load_defaults = function(doc, dt, dn) { + if(!cur_frm.doc.__islocal) { return; } + + doc = locals[doc.doctype][doc.name]; + var fields_to_refresh = LocalDB.set_default_values(doc); + if(fields_to_refresh) { refresh_many(fields_to_refresh); } + + fields_to_refresh = null; + var children = getchildren(cur_frm.cscript.tname, doc.name, cur_frm.cscript.fname); + if(!children) { return; } + for(var i=0; i NOW()) AND tabItem.%(key)s LIKE "%s" LIMIT 50' + return 'SELECT tabItem.name, tabItem.description FROM tabItem WHERE tabItem.is_purchase_item="Yes" AND (IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` ="0000-00-00" OR `tabItem`.`end_of_life` > NOW()) AND tabItem.%(key)s LIKE "%s" LIMIT 50' } //==================== Get Item Code Details ===================================================== cur_frm.cscript.item_code = function(doc,cdt,cdn) { - var d = locals[cdt][cdn]; - if (d.item_code) { - temp = "{'item_code':'"+(d.item_code?d.item_code:'')+"', 'warehouse':'"+(d.warehouse?d.warehouse:'')+"'}" - get_server_fields('get_item_details', temp, fname, doc, cdt, cdn, 1); - } + var d = locals[cdt][cdn]; + if (d.item_code) { + temp = { + item_code: d.item_code || '', + warehouse: d.warehouse || '' + } + get_server_fields('get_item_details', JSON.stringify(temp), fname, doc, cdt, cdn, 1); + } } //==================== Update Stock Qty ========================================================== cur_frm.cscript.update_stock_qty = function(doc,cdt,cdn){ - d = locals[cdt][cdn] - // Step 1:=> Check if qty , uom, conversion_factor - if (d.qty && d.uom && d.conversion_factor){ - // Step 2:=> Set stock_qty = qty * conversion_factor - d.stock_qty = flt(flt(d.qty) * flt(d.conversion_factor)); - // Step 3:=> Refer stock_qty field a that particular row. - refresh_field('stock_qty' , d.name,fname); - } + d = locals[cdt][cdn] + // Step 1:=> Check if qty , uom, conversion_factor + if (d.qty && d.uom && d.conversion_factor){ + // Step 2:=> Set stock_qty = qty * conversion_factor + d.stock_qty = flt(flt(d.qty) * flt(d.conversion_factor)); + // Step 3:=> Refer stock_qty field a that particular row. + refresh_field('stock_qty' , d.name,fname); + } } //==================== UOM ====================================================================== cur_frm.cscript.uom = function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - if (d.item_code && d.uom) { - call_back = function(doc, cdt, cdn){ - cur_frm.cscript.calc_amount(doc, 2); - } - str_arg = {'item_code':d.item_code, 'uom':d.uom, 'stock_qty':flt(d.stock_qty), 'qty': flt(d.qty), 'conversion_rate':doc.conversion_rate} - // Updates Conversion Factor, Qty and Purchase Rate - get_server_fields('get_uom_details',JSON.stringify(str_arg), fname, doc,cdt,cdn,1, call_back); - // don't make mistake of calling update_stock_qty() the get_uom_details returns stock_qty as per conversion factor properly - } + var d = locals[cdt][cdn]; + if (d.item_code && d.uom) { + call_back = function(doc, cdt, cdn){ + cur_frm.cscript.calc_amount(doc, 2); + } + str_arg = {'item_code':d.item_code, 'uom':d.uom, 'stock_qty':flt(d.stock_qty), 'qty': flt(d.qty), 'conversion_rate':doc.conversion_rate} + // Updates Conversion Factor, Qty and Purchase Rate + get_server_fields('get_uom_details',JSON.stringify(str_arg), fname, doc,cdt,cdn,1, call_back); + // don't make mistake of calling update_stock_qty() the get_uom_details returns stock_qty as per conversion factor properly + } } //==================== Conversion factor ========================================================= cur_frm.cscript.conversion_factor = function(doc, cdt, cdn) { - cur_frm.cscript.uom(doc, cdt, cdn); + cur_frm.cscript.uom(doc, cdt, cdn); } //==================== stock qty ====================================================================== cur_frm.cscript.stock_qty = function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - if(d.uom && d.qty){ - d.conversion_factor = flt(d.stock_qty)/flt(d.qty); - refresh_field('conversion_factor', d.name, fname); - } + var d = locals[cdt][cdn]; + if(d.uom && d.qty){ + d.conversion_factor = flt(d.stock_qty)/flt(d.qty); + refresh_field('conversion_factor', d.name, fname); + } } //==================== Warehouse ================================================================ cur_frm.cscript.warehouse = function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - if (d.item_code && d.warehouse) { - str_arg = "{'item_code':'" + (d.item_code?d.item_code:'') + "', 'warehouse':'" + (d.warehouse?d.warehouse:'') + "'}" - get_server_fields('get_bin_details', str_arg, fname, doc, cdt, cdn, 1); - } + var d = locals[cdt][cdn]; + if (d.item_code && d.warehouse) { + str_arg = "{'item_code':'" + (d.item_code?d.item_code:'') + "', 'warehouse':'" + (d.warehouse?d.warehouse:'') + "'}" + get_server_fields('get_bin_details', str_arg, fname, doc, cdt, cdn, 1); + } } //=================== Quantity =================================================================== cur_frm.cscript.qty = function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - // Step 1: => Update Stock Qty - cur_frm.cscript.update_stock_qty(doc,cdt,cdn); - // Step 2: => Calculate Amount - cur_frm.cscript.calc_amount(doc, 2); + var d = locals[cdt][cdn]; + // Step 1: => Update Stock Qty + cur_frm.cscript.update_stock_qty(doc,cdt,cdn); + // Step 2: => Calculate Amount + cur_frm.cscript.calc_amount(doc, 2); } //=================== Purchase Rate ============================================================== cur_frm.cscript.purchase_rate = function(doc, cdt, cdn) { - cur_frm.cscript.calc_amount(doc, 2); + cur_frm.cscript.calc_amount(doc, 2); } //==================== Import Rate ================================================================ cur_frm.cscript.import_rate = function(doc, cdt, cdn) { - cur_frm.cscript.calc_amount(doc, 1); + cur_frm.cscript.calc_amount(doc, 1); } //==================== Discount Rate ================================================================ cur_frm.cscript.discount_rate = function(doc, cdt, cdn) { - cur_frm.cscript.calc_amount(doc, 4); + cur_frm.cscript.calc_amount(doc, 4); } //==================== Purchase Ref Rate ================================================================ cur_frm.cscript.purchase_ref_rate = function(doc, cdt, cdn) { - cur_frm.cscript.calc_amount(doc, 4); + cur_frm.cscript.calc_amount(doc, 4); } //==================== Import Ref Rate ================================================================ cur_frm.cscript.import_ref_rate = function(doc, cdt, cdn) { - cur_frm.cscript.calc_amount(doc, 5); + cur_frm.cscript.calc_amount(doc, 5); } //==================== check if item table is blank ============================================== var is_item_table = function(doc,cdt,cdn) { - // Step 1 :=>Get all childrens/ rows from Detail Table - var cl = getchildren(tname, doc.name, fname); - // Step 2 :=> If there are no rows then set validated = false, I hope this will stop further execution of code. - if (cl.length == 0) { - alert("There is no item in table"); validated = false; - } + // Step 1 :=>Get all childrens/ rows from Detail Table + var cl = getchildren(tname, doc.name, fname); + // Step 2 :=> If there are no rows then set validated = false, I hope this will stop further execution of code. + if (cl.length == 0) { + alert("There is no item in table"); validated = false; + } } //==================== Validate ==================================================================== cur_frm.cscript.validate = function(doc, cdt, cdn) { - // Step 1:=> check if item table is blank - is_item_table(doc,cdt,cdn); - // Step 2:=> Calculate Amount - cur_frm.cscript.calc_amount(doc, 1); + // Step 1:=> check if item table is blank + is_item_table(doc,cdt,cdn); + // Step 2:=> Calculate Amount + cur_frm.cscript.calc_amount(doc, 1); - // calculate advances if pv - if(doc.doctype == 'Payable Voucher') calc_total_advance(doc, cdt, cdn); + // calculate advances if pv + if(doc.doctype == 'Payable Voucher') calc_total_advance(doc, cdt, cdn); } // **************** RE-CALCULATE VALUES *************************** cur_frm.cscript['Re-Calculate Values'] = function(doc, cdt, cdn) { - cur_frm.cscript['Calculate Tax'](doc,cdt,cdn); + cur_frm.cscript['Calculate Tax'](doc,cdt,cdn); } cur_frm.cscript['Calculate Tax'] = function(doc, cdt, cdn) { - var other_fname = cur_frm.cscript.other_fname; + var other_fname = cur_frm.cscript.other_fname; - var cl = getchildren('Purchase Tax Detail', doc.name, other_fname, doc.doctype); - for(var i = 0; i 0) { - var cl = getchildren('Purchase Tax Detail', doc.name, other_fname,doc.doctype); - for(var i = 0; i 0) { + var cl = getchildren('Purchase Tax Detail', doc.name, other_fname,doc.doctype); + for(var i = 0; i2) alert("You cannot enter more than 2 nos. for division"); - var id1 = cint(row[0].replace(/^\s+|\s+$/g,"")); - var id2 = cint(row[1].replace(/^\s+|\s+$/g,"")); - tax_amount = flt(tax[id1-1].total_amount) / flt(tax[id2-1].total_amount); - } - return tax_amount - } - else if(tax[t].charge_type == 'On Previous Row Total') { - var row = cint(tax[t].row_id); - if(tax[row-1].add_deduct_tax == 'Add'){ - return tax_amount = flt(rate) * (flt(tax[row-1].total_tax_amount)+flt(tax[row-1].total_amount)) / 100; - } - else if(tax[row-1].add_deduct_tax == 'Deduct'){ - return tax_amount = flt(rate) * (flt(tax[row-1].total_tax_amount)-flt(tax[row-1].total_amount)) / 100; - } - } + var tax_amount = 0; + if(tax[t].charge_type == 'Actual') { + var value = flt(tax[t].rate) / flt(doc.net_total); // this give the ratio in which all items are divided + return tax_amount = flt(value) * flt(cl.amount); + } + else if(tax[t].charge_type == 'On Net Total') { + return tax_amount = (flt(rate) * flt(cl.amount) / 100); + } + else if(tax[t].charge_type == 'On Previous Row Amount'){ + var row_no = (tax[t].row_id).toString(); + var row = (row_no).split("+"); // splits the values and stores in an array + for(var r = 0;r2) alert("You cannot enter more than 2 nos. for division"); + var id1 = cint(row[0].replace(/^\s+|\s+$/g,"")); + var id2 = cint(row[1].replace(/^\s+|\s+$/g,"")); + tax_amount = flt(tax[id1-1].total_amount) / flt(tax[id2-1].total_amount); + } + return tax_amount + } + else if(tax[t].charge_type == 'On Previous Row Total') { + var row = cint(tax[t].row_id); + if(tax[row-1].add_deduct_tax == 'Add'){ + return tax_amount = flt(rate) * (flt(tax[row-1].total_tax_amount)+flt(tax[row-1].total_amount)) / 100; + } + else if(tax[row-1].add_deduct_tax == 'Deduct'){ + return tax_amount = flt(rate) * (flt(tax[row-1].total_tax_amount)-flt(tax[row-1].total_amount)) / 100; + } + } } diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.py b/erpnext/buying/doctype/purchase_common/purchase_common.py index 5bade929b3..4a49373425 100644 --- a/erpnext/buying/doctype/purchase_common/purchase_common.py +++ b/erpnext/buying/doctype/purchase_common/purchase_common.py @@ -96,9 +96,9 @@ class DocType(TransactionBase): if r: obj.doc.terms = r[0][0] # Get Item Details - def get_item_details( self, obj, arg =''): - - arg = eval(arg) + def get_item_details(self, obj, arg =''): + import json + arg = json.loads(arg) item = sql("select item_name,item_group, brand, description, min_order_qty, stock_uom, default_warehouse,lead_time_days, last_purchase_rate from `tabItem` where name = %s and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life > now())", (arg['item_code']), as_dict = 1) tax = sql("select tax_type, tax_rate from `tabItem Tax` where parent = %s" , arg['item_code']) t = {} @@ -119,7 +119,7 @@ class DocType(TransactionBase): 'stock_uom' : item and item[0]['stock_uom'] or '', 'conversion_factor' : '1', 'warehouse' : wh, - 'item_tax_rate' : str(t), + 'item_tax_rate' : json.dumps(t), 'batch_no' : '', 'discount_rate' : 0 } diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index 05fe049f9f..8435c0260e 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -8,86 +8,89 @@ $import(SMS Control) //========================== On Load ================================================= cur_frm.cscript.onload = function(doc, cdt, cdn) { - if(!doc.fiscal_year && doc.__islocal){ //set_default_values(doc); - doc.fiscal_year = sys_defaults.fiscal_year; - } - if(!doc.conversion_rate) doc.conversion_rate = 1; - if(!doc.currency) doc.currency = sys_defaults.currency; - if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'}); - if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()}); - - if(doc.__islocal){ - hide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']); - } + if(!doc.fiscal_year && doc.__islocal){ //set_default_values(doc); + doc.fiscal_year = sys_defaults.fiscal_year; + } + if(!doc.conversion_rate) doc.conversion_rate = 1; + if(!doc.currency) doc.currency = sys_defaults.currency; + if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'}); + if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()}); + + if(doc.__islocal){ + hide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']); + } + + // defined in purchase_common.js + //cur_frm.cscript.update_item_details(doc, cdt, cdn); } cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) { - if(doc.__islocal){ - cur_frm.cscript.get_default_schedule_date(doc); - } + if(doc.__islocal){ + cur_frm.cscript.get_default_schedule_date(doc); + } } // ================================== Refresh ========================================== cur_frm.cscript.refresh = function(doc, cdt, cdn) { - // Show buttons - // --------------------------------- - cur_frm.clear_custom_buttons(); - if(doc.docstatus == 1 && doc.status != 'Stopped'){ - var ch = getchildren('PO Detail',doc.name,'po_details'); - var allow_billing = 0; var allow_receipt = 0; - cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); + // Show buttons + // --------------------------------- + cur_frm.clear_custom_buttons(); + if(doc.docstatus == 1 && doc.status != 'Stopped'){ + var ch = getchildren('PO Detail',doc.name,'po_details'); + var allow_billing = 0; var allow_receipt = 0; + cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); - for(var i in ch){ - if(ch[i].qty > ch[i].received_qty) allow_receipt = 1; - if(ch[i].qty > ch[i].billed_qty) allow_billing = 1; - } - if(allow_receipt) - cur_frm.add_custom_button('Make Purchase Receipt', cur_frm.cscript['Make Purchase Receipt']); - + for(var i in ch){ + if(ch[i].qty > ch[i].received_qty) allow_receipt = 1; + if(ch[i].qty > ch[i].billed_qty) allow_billing = 1; + } + if(allow_receipt) + cur_frm.add_custom_button('Make Purchase Receipt', cur_frm.cscript['Make Purchase Receipt']); + if(allow_billing) - cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Purchase Invoice']); + cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Purchase Invoice']); - if(allow_billing || allow_receipt) - cur_frm.add_custom_button('Stop', cur_frm.cscript['Stop Purchase Order']); - } - - if(doc.docstatus == 1 && doc.status == 'Stopped') - cur_frm.add_custom_button('Unstop Purchase Order', cur_frm.cscript['Unstop Purchase Order']); + if(allow_billing || allow_receipt) + cur_frm.add_custom_button('Stop', cur_frm.cscript['Stop Purchase Order']); + } + + if(doc.docstatus == 1 && doc.status == 'Stopped') + cur_frm.add_custom_button('Unstop Purchase Order', cur_frm.cscript['Unstop Purchase Order']); - if(doc.docstatus == 1) unhide_field(['Repair Purchase Order']); - else hide_field(['Repair Purchase Order']); + if(doc.docstatus == 1) unhide_field(['Repair Purchase Order']); + else hide_field(['Repair Purchase Order']); } //Supplier cur_frm.cscript.supplier = function(doc,dt,dn) { - if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1); - if(doc.supplier) unhide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']); + if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1); + if(doc.supplier) unhide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']); } -cur_frm.cscript.supplier_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { - if(doc.supplier) get_server_fields('get_supplier_address', JSON.stringify({supplier: doc.supplier, address: doc.supplier_address, contact: doc.contact_person}),'', doc, dt, dn, 1); +cur_frm.cscript.supplier_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { + if(doc.supplier) get_server_fields('get_supplier_address', JSON.stringify({supplier: doc.supplier, address: doc.supplier_address, contact: doc.contact_person}),'', doc, dt, dn, 1); } cur_frm.fields_dict['supplier_address'].get_query = function(doc, cdt, cdn) { - return 'SELECT name,address_line1,city FROM tabAddress WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; + return 'SELECT name,address_line1,city FROM tabAddress WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) { - return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; + return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } cur_frm.fields_dict.supplier_address.on_new = function(dn) { - locals['Address'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier; - locals['Address'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; + locals['Address'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier; + locals['Address'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; } cur_frm.fields_dict.contact_person.on_new = function(dn) { - locals['Contact'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier; - locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; + locals['Contact'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier; + locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; } @@ -96,154 +99,154 @@ cur_frm.fields_dict.contact_person.on_new = function(dn) { //================ create new contact ============================================================================ cur_frm.cscript.new_contact = function(){ - tn = createLocal('Contact'); - locals['Contact'][tn].is_supplier = 1; - if(doc.supplier) locals['Contact'][tn].supplier = doc.supplier; - loaddoc('Contact', tn); + tn = createLocal('Contact'); + locals['Contact'][tn].is_supplier = 1; + if(doc.supplier) locals['Contact'][tn].supplier = doc.supplier; + loaddoc('Contact', tn); } //======================= transaction date ============================= cur_frm.cscript.transaction_date = function(doc,cdt,cdn){ - if(doc.__islocal){ - cur_frm.cscript.get_default_schedule_date(doc); - } + if(doc.__islocal){ + cur_frm.cscript.get_default_schedule_date(doc); + } } // ---------------------- Get project name -------------------------- cur_frm.fields_dict['po_details'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) { - return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50'; + return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50'; } //==================== Indent No Get Query ======================================================= //===== Only those Indents status != 'Completed' and docstatus = 1 i.e. submitted================= cur_frm.fields_dict['indent_no'].get_query = function(doc) { - return 'SELECT DISTINCT `tabIndent`.`name` FROM `tabIndent` WHERE `tabIndent`.company = "' + doc.company + '" and `tabIndent`.`docstatus` = 1 and `tabIndent`.`status` != "Stopped" and ifnull(`tabIndent`.`per_ordered`,0) < 100 and `tabIndent`.%(key)s LIKE "%s" ORDER BY `tabIndent`.`name` DESC LIMIT 50'; + return 'SELECT DISTINCT `tabIndent`.`name` FROM `tabIndent` WHERE `tabIndent`.company = "' + doc.company + '" and `tabIndent`.`docstatus` = 1 and `tabIndent`.`status` != "Stopped" and ifnull(`tabIndent`.`per_ordered`,0) < 100 and `tabIndent`.%(key)s LIKE "%s" ORDER BY `tabIndent`.`name` DESC LIMIT 50'; } /* //*********** get approved supplier quotation ******************** cur_frm.fields_dict['supplier_qtn'].get_query = function(doc) { - var cond=''; - if(doc.supplier) cond = 'ifnull(`tabSupplier Quotation`.supplier, "") = "'+doc.supplier+'" and'; - - return repl('SELECT DISTINCT `tabSupplier Quotation`.`name` FROM `tabSupplier Quotation` WHERE `tabSupplier Quotation`.company = "%(company)s" and`tabSupplier Quotation`.`docstatus` = 1 and `tabSupplier Quotation`.`approval_status` = "Approved" and %(cond)s `tabSupplier Quotation`.%(key)s LIKE "%s" ORDER BY `tabSupplier Quotation`.`name` DESC LIMIT 50', {company:doc.company,cond:cond}); + var cond=''; + if(doc.supplier) cond = 'ifnull(`tabSupplier Quotation`.supplier, "") = "'+doc.supplier+'" and'; + + return repl('SELECT DISTINCT `tabSupplier Quotation`.`name` FROM `tabSupplier Quotation` WHERE `tabSupplier Quotation`.company = "%(company)s" and`tabSupplier Quotation`.`docstatus` = 1 and `tabSupplier Quotation`.`approval_status` = "Approved" and %(cond)s `tabSupplier Quotation`.%(key)s LIKE "%s" ORDER BY `tabSupplier Quotation`.`name` DESC LIMIT 50', {company:doc.company,cond:cond}); } */ //========================= Get Last Purhase Rate ===================================== cur_frm.cscript['Get Last Purchase Rate'] = function(doc, cdt, cdn){ - $c_obj(make_doclist(doc.doctype, doc.name), 'get_last_purchase_rate', '', - function(r, rt) { - refresh_field(cur_frm.cscript.fname); - var doc = locals[cdt][cdn]; - cur_frm.cscript.calc_amount( doc, 2); - } - ); + $c_obj(make_doclist(doc.doctype, doc.name), 'get_last_purchase_rate', '', + function(r, rt) { + refresh_field(cur_frm.cscript.fname); + var doc = locals[cdt][cdn]; + cur_frm.cscript.calc_amount( doc, 2); + } + ); } //========================= Make Purchase Receipt ======================================================= cur_frm.cscript['Make Purchase Receipt'] = function() { - n = createLocal('Purchase Receipt'); - $c('dt_map', args={ - 'docs':compress_doclist([locals['Purchase Receipt'][n]]), - 'from_doctype': cur_frm.doc.doctype, - 'to_doctype':'Purchase Receipt', - 'from_docname':cur_frm.doc.name, - 'from_to_list':"[['Purchase Order','Purchase Receipt'],['PO Detail','Purchase Receipt Detail'],['Purchase Tax Detail','Purchase Tax Detail']]" - }, function(r,rt) { - loaddoc('Purchase Receipt', n); - } - ); + n = createLocal('Purchase Receipt'); + $c('dt_map', args={ + 'docs':compress_doclist([locals['Purchase Receipt'][n]]), + 'from_doctype': cur_frm.doc.doctype, + 'to_doctype':'Purchase Receipt', + 'from_docname':cur_frm.doc.name, + 'from_to_list':"[['Purchase Order','Purchase Receipt'],['PO Detail','Purchase Receipt Detail'],['Purchase Tax Detail','Purchase Tax Detail']]" + }, function(r,rt) { + loaddoc('Purchase Receipt', n); + } + ); } //========================== Make Purchase Invoice ===================================================== cur_frm.cscript['Make Purchase Invoice'] = function() { - n = createLocal('Payable Voucher'); - $c('dt_map', args={ - 'docs':compress_doclist([locals['Payable Voucher'][n]]), - 'from_doctype':cur_frm.doc.doctype, - 'to_doctype':'Payable Voucher', - 'from_docname': cur_frm.doc.name, - 'from_to_list':"[['Purchase Order','Payable Voucher'],['PO Detail','PV Detail'],['Purchase Tax Detail','Purchase Tax Detail']]" - }, function(r,rt) { - loaddoc('Payable Voucher', n); - } - ); + n = createLocal('Payable Voucher'); + $c('dt_map', args={ + 'docs':compress_doclist([locals['Payable Voucher'][n]]), + 'from_doctype':cur_frm.doc.doctype, + 'to_doctype':'Payable Voucher', + 'from_docname': cur_frm.doc.name, + 'from_to_list':"[['Purchase Order','Payable Voucher'],['PO Detail','PV Detail'],['Purchase Tax Detail','Purchase Tax Detail']]" + }, function(r,rt) { + loaddoc('Payable Voucher', n); + } + ); } // Stop PURCHASE ORDER // ================================================================================================== cur_frm.cscript['Stop Purchase Order'] = function() { - var doc = cur_frm.doc; - var check = confirm("Do you really want to STOP " + doc.name); + var doc = cur_frm.doc; + var check = confirm("Do you really want to STOP " + doc.name); - if (check) { - $c('runserverobj', args={'method':'update_status', 'arg': 'Stopped', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) { - cur_frm.refresh(); - }); - } + if (check) { + $c('runserverobj', args={'method':'update_status', 'arg': 'Stopped', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) { + cur_frm.refresh(); + }); + } } // Unstop PURCHASE ORDER // ================================================================================================== cur_frm.cscript['Unstop Purchase Order'] = function() { - var doc = cur_frm.doc; - var check = confirm("Do you really want to UNSTOP " + doc.name); + var doc = cur_frm.doc; + var check = confirm("Do you really want to UNSTOP " + doc.name); - if (check) { - $c('runserverobj', args={'method':'update_status', 'arg': 'Submitted', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) { - cur_frm.refresh(); - }); - } + if (check) { + $c('runserverobj', args={'method':'update_status', 'arg': 'Submitted', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) { + cur_frm.refresh(); + }); + } } -// ***************** Get Print Heading ***************** +// ***************** Get Print Heading ***************** cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) { - return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50'; + return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50'; } //****************** For print sales order no and date************************* cur_frm.pformat.indent_no = function(doc, cdt, cdn){ - //function to make row of table - - var make_row = function(title,val1, val2, bold){ - var bstart = ''; var bend = ''; + //function to make row of table + + var make_row = function(title,val1, val2, bold){ + var bstart = ''; var bend = ''; - return ''+(bold?bstart:'')+title+(bold?bend:'')+'' - +''+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'' - +'' - } + return ''+(bold?bstart:'')+title+(bold?bend:'')+'' + +''+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'' + +'' + } - out =''; - - var cl = getchildren('PO Detail',doc.name,'po_details'); + out =''; + + var cl = getchildren('PO Detail',doc.name,'po_details'); - // outer table - var out='
'; - - // main table - out +=''; + // outer table + var out='
'; + + // main table + out +=''; - // add rows - if(cl.length){ - prevdoc_list = new Array(); - for(var i=0;i set status as "Draft" - set(self.doc, 'status', 'Draft') - - # Step 2:=> get Purchase Common Obj - pc_obj = get_obj(dt='Purchase Common') - - # Step 3:=> validate mandatory - pc_obj.validate_mandatory(self) - - # Step 4:=> validate for items - pc_obj.validate_for_items(self) - - # Step 5:=> validate conversion rate - pc_obj.validate_conversion_rate(self) - - # Get po date - pc_obj.get_prevdoc_date(self) - - # validate_doc - self.validate_doc(pc_obj) - - # Check for stopped status - self.check_for_stopped_status(pc_obj) - - - # get total in words - dcc = TransactionBase().get_company_currency(self.doc.company) - self.doc.in_words = pc_obj.get_total_in_words(dcc, self.doc.grand_total) - self.doc.in_words_import = pc_obj.get_total_in_words(self.doc.currency, self.doc.grand_total_import) - - # update bin - # ---------- - def update_bin(self, is_submit, is_stopped = 0): - pc_obj = get_obj('Purchase Common') - for d in getlist(self.doclist, 'po_details'): - #1. Check if is_stock_item == 'Yes' - if sql("select is_stock_item from tabItem where name=%s", d.item_code)[0][0]=='Yes': - - ind_qty, po_qty = 0, flt(d.qty) * flt(d.conversion_factor) - if is_stopped: - po_qty = flt(d.qty) > flt(d.received_qty) and flt( flt(flt(d.qty) - flt(d.received_qty)) * flt(d.conversion_factor))or 0 - - # No updates in Indent on Stop / Unstop - if cstr(d.prevdoc_doctype) == 'Indent' and not is_stopped: - # get qty and pending_qty of prevdoc - curr_ref_qty = pc_obj.get_qty( d.doctype, 'prevdoc_detail_docname', d.prevdoc_detail_docname, 'Indent Detail', 'Indent - Purchase Order', self.doc.name) - max_qty, qty, curr_qty = flt(curr_ref_qty.split('~~~')[1]), flt(curr_ref_qty.split('~~~')[0]), 0 - - if flt(qty) + flt(po_qty) > flt(max_qty): - curr_qty = flt(max_qty) - flt(qty) - # special case as there is no restriction for Indent - Purchase Order - curr_qty = (curr_qty > 0) and curr_qty or 0 - else: - curr_qty = flt(po_qty) - - ind_qty = -flt(curr_qty) - - #==> Update Bin's Indent Qty by +- ind_qty and Ordered Qty by +- qty - get_obj('Warehouse', d.warehouse).update_bin(0, 0, (is_submit and 1 or -1) * flt(po_qty), (is_submit and 1 or -1) * flt(ind_qty), 0, d.item_code, self.doc.transaction_date) - - def check_modified_date(self): - mod_db = sql("select modified from `tabPurchase Order` where name = '%s'" % self.doc.name) - date_diff = sql("select TIMEDIFF('%s', '%s')" % ( mod_db[0][0],cstr(self.doc.modified))) - - if date_diff and date_diff[0][0]: - msgprint(cstr(self.doc.doctype) +" => "+ cstr(self.doc.name) +" has been modified. Please Refresh. ") - raise Exception - - # On Close - #------------------------------------------------------------------------------------------------- - def update_status(self, status): - self.check_modified_date() - # step 1:=> Set Status - set(self.doc,'status',cstr(status)) - - # step 2:=> Update Bin - self.update_bin(is_submit = (status == 'Submitted') and 1 or 0, is_stopped = 1) - - # step 3:=> Acknowledge user - msgprint(self.doc.doctype + ": " + self.doc.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status))) + # Get Item Details + def get_item_details(self, arg =''): + if arg: + return get_obj(dt='Purchase Common').get_item_details(self,arg) + else: + obj = get_obj('Purchase Common') + for doc in self.doclist: + if doc.fields.get('item_code'): + temp = { + 'item_code': doc.fields.get('item_code'), + 'warehouse': doc.fields.get('warehouse') + } + ret = obj.get_item_details(self, json.dumps(temp)) + for r in ret: + if not doc.fields.get(r): + doc.fields[r] = ret[r] - # On Submit - def on_submit(self): - pc_obj = get_obj(dt ='Purchase Common') - - # Step 1 :=> Update Previous Doc i.e. update pending_qty and Status accordingly - pc_obj.update_prevdoc_detail(self, is_submit = 1) - # Step 2 :=> Update Bin - self.update_bin(is_submit = 1, is_stopped = 0) - - # Step 3 :=> Check For Approval Authority - get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total) - - # Step 4 :=> Update Current PO No. in Supplier as last_purchase_order. - update_supplier = sql("update `tabSupplier` set last_purchase_order = '%s' where name = '%s'" % (self.doc.name, self.doc.supplier)) + # Get UOM Details + def get_uom_details(self, arg = ''): + return get_obj(dt='Purchase Common').get_uom_details(arg) - # Step 5 :=> Update last purchase rate - pc_obj.update_last_purchase_rate(self, is_submit = 1) + # get available qty at warehouse + def get_bin_details(self, arg = ''): + return get_obj(dt='Purchase Common').get_bin_details(arg) - # Step 6 :=> Set Status - set(self.doc,'status','Submitted') - - self.doc.indent_no = ''; - - - # On Cancel - # ------------------------------------------------------------------------------------------------------- - def on_cancel(self): - pc_obj = get_obj(dt = 'Purchase Common') - - # 1.Check if PO status is stopped - pc_obj.check_for_stopped_status(cstr(self.doc.doctype), cstr(self.doc.name)) - - self.check_for_stopped_status(pc_obj) - - # 2.Check if Purchase Receipt has been submitted against current Purchase Order - pc_obj.check_docstatus(check = 'Next', doctype = 'Purchase Receipt', docname = self.doc.name, detail_doctype = 'Purchase Receipt Detail') + # Pull Indent + def get_indent_details(self): + #self.validate_prev_docname() + if self.doc.indent_no: + get_obj('DocType Mapper','Indent-Purchase Order').dt_map('Indent','Purchase Order',self.doc.indent_no, self.doc, self.doclist, "[['Indent','Purchase Order'],['Indent Detail', 'PO Detail']]") + for d in getlist(self.doclist, 'po_details'): + if d.item_code: + item = sql("select last_purchase_rate from tabItem where name = '%s'" %(d.item_code), as_dict=1) + d.purchase_rate = item and flt(item[0]['last_purchase_rate']) or 0 + d.import_rate = flt(item and flt(item[0]['last_purchase_rate']) or 0) / flt(self.doc.fields.has_key('conversion_rate') and flt(self.doc.conversion_rate) or 1) + if self.doc.supplier_qtn: + get_obj('DocType Mapper','Supplier Quotation-Purchase Order').dt_map('Supplier Quotation','Purchase Order',self.doc.supplier_qtn, self.doc, self.doclist, "[['Supplier Quotation','Purchase Order'],['Supplier Quotation Detail', 'PO Detail']]") + + # GET TERMS & CONDITIONS + # ===================================================================================== + def get_tc_details(self): + return get_obj('Purchase Common').get_tc_details(self) - # 3.Check if Payable Voucher has been submitted against current Purchase Order - #pc_obj.check_docstatus(check = 'Next', doctype = 'Payable Voucher', docname = self.doc.name, detail_doctype = 'PV Detail') - - submitted = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_order = '%s' and t1.docstatus = 1" % self.doc.name) - if submitted: - msgprint("Purchase Invoice : " + cstr(submitted[0][0]) + " has already been submitted !") - raise Exception + # validate if indent has been pulled twice + def validate_prev_docname(self): + for d in getlist(self.doclist, 'po_details'): + if d.prevdoc_docname and self.doc.indent_no == d.prevdoc_docname: + msgprint(cstr(self.doc.indent_no) + " indent details have already been pulled. ") + raise Exception - # 4.Set Status as Cancelled - set(self.doc,'status','Cancelled') + # get last purchase rate + def get_last_purchase_rate(self): + get_obj('Purchase Common').get_last_purchase_rate(self) + + # validation + #------------------------------------------------------------------------------------------------------------- + def validate_doc(self,pc_obj): + # Please Check Supplier Quotation - Purchase ORder Transaction , it has to be discussed + if self.doc.supp_quo_no: + pc_obj.validate_doc(obj = self, prevdoc_doctype = 'Supplier Quotation', prevdoc_docname = cstr(self.doc.supp_quo_no)) + else: + # Validate values with reference document + pc_obj.validate_reference_value(obj = self) - # 5.Update Indents Pending Qty and accordingly it's Status - pc_obj.update_prevdoc_detail(self,is_submit = 0) - - # 6.Update Bin - self.update_bin( is_submit = 0, is_stopped = 0) - - # Step 7 :=> Update last purchase rate - pc_obj.update_last_purchase_rate(self, is_submit = 0) - + # Check for Stopped status + def check_for_stopped_status(self, pc_obj): + check_list =[] + for d in getlist(self.doclist, 'po_details'): + if d.fields.has_key('prevdoc_docname') and d.prevdoc_docname and d.prevdoc_docname not in check_list: + check_list.append(d.prevdoc_docname) + pc_obj.check_for_stopped_status( d.prevdoc_doctype, d.prevdoc_docname) + + + # Validate + def validate(self): + self.validate_fiscal_year() + # Step 1:=> set status as "Draft" + set(self.doc, 'status', 'Draft') + + # Step 2:=> get Purchase Common Obj + pc_obj = get_obj(dt='Purchase Common') + + # Step 3:=> validate mandatory + pc_obj.validate_mandatory(self) + + # Step 4:=> validate for items + pc_obj.validate_for_items(self) + + # Step 5:=> validate conversion rate + pc_obj.validate_conversion_rate(self) + + # Get po date + pc_obj.get_prevdoc_date(self) + + # validate_doc + self.validate_doc(pc_obj) + + # Check for stopped status + self.check_for_stopped_status(pc_obj) + + + # get total in words + dcc = TransactionBase().get_company_currency(self.doc.company) + self.doc.in_words = pc_obj.get_total_in_words(dcc, self.doc.grand_total) + self.doc.in_words_import = pc_obj.get_total_in_words(self.doc.currency, self.doc.grand_total_import) + + # update bin + # ---------- + def update_bin(self, is_submit, is_stopped = 0): + pc_obj = get_obj('Purchase Common') + for d in getlist(self.doclist, 'po_details'): + #1. Check if is_stock_item == 'Yes' + if sql("select is_stock_item from tabItem where name=%s", d.item_code)[0][0]=='Yes': + + ind_qty, po_qty = 0, flt(d.qty) * flt(d.conversion_factor) + if is_stopped: + po_qty = flt(d.qty) > flt(d.received_qty) and flt( flt(flt(d.qty) - flt(d.received_qty)) * flt(d.conversion_factor))or 0 + + # No updates in Indent on Stop / Unstop + if cstr(d.prevdoc_doctype) == 'Indent' and not is_stopped: + # get qty and pending_qty of prevdoc + curr_ref_qty = pc_obj.get_qty( d.doctype, 'prevdoc_detail_docname', d.prevdoc_detail_docname, 'Indent Detail', 'Indent - Purchase Order', self.doc.name) + max_qty, qty, curr_qty = flt(curr_ref_qty.split('~~~')[1]), flt(curr_ref_qty.split('~~~')[0]), 0 + + if flt(qty) + flt(po_qty) > flt(max_qty): + curr_qty = flt(max_qty) - flt(qty) + # special case as there is no restriction for Indent - Purchase Order + curr_qty = (curr_qty > 0) and curr_qty or 0 + else: + curr_qty = flt(po_qty) + + ind_qty = -flt(curr_qty) + + #==> Update Bin's Indent Qty by +- ind_qty and Ordered Qty by +- qty + get_obj('Warehouse', d.warehouse).update_bin(0, 0, (is_submit and 1 or -1) * flt(po_qty), (is_submit and 1 or -1) * flt(ind_qty), 0, d.item_code, self.doc.transaction_date) + + def check_modified_date(self): + mod_db = sql("select modified from `tabPurchase Order` where name = '%s'" % self.doc.name) + date_diff = sql("select TIMEDIFF('%s', '%s')" % ( mod_db[0][0],cstr(self.doc.modified))) + + if date_diff and date_diff[0][0]: + msgprint(cstr(self.doc.doctype) +" => "+ cstr(self.doc.name) +" has been modified. Please Refresh. ") + raise Exception + + # On Close + #------------------------------------------------------------------------------------------------- + def update_status(self, status): + self.check_modified_date() + # step 1:=> Set Status + set(self.doc,'status',cstr(status)) + + # step 2:=> Update Bin + self.update_bin(is_submit = (status == 'Submitted') and 1 or 0, is_stopped = 1) + + # step 3:=> Acknowledge user + msgprint(self.doc.doctype + ": " + self.doc.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status))) + + + # On Submit + def on_submit(self): + pc_obj = get_obj(dt ='Purchase Common') + + # Step 1 :=> Update Previous Doc i.e. update pending_qty and Status accordingly + pc_obj.update_prevdoc_detail(self, is_submit = 1) + + # Step 2 :=> Update Bin + self.update_bin(is_submit = 1, is_stopped = 0) + + # Step 3 :=> Check For Approval Authority + get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total) + + # Step 4 :=> Update Current PO No. in Supplier as last_purchase_order. + update_supplier = sql("update `tabSupplier` set last_purchase_order = '%s' where name = '%s'" % (self.doc.name, self.doc.supplier)) + + # Step 5 :=> Update last purchase rate + pc_obj.update_last_purchase_rate(self, is_submit = 1) + + # Step 6 :=> Set Status + set(self.doc,'status','Submitted') + + self.doc.indent_no = ''; + + + # On Cancel + # ------------------------------------------------------------------------------------------------------- + def on_cancel(self): + pc_obj = get_obj(dt = 'Purchase Common') + + # 1.Check if PO status is stopped + pc_obj.check_for_stopped_status(cstr(self.doc.doctype), cstr(self.doc.name)) + + self.check_for_stopped_status(pc_obj) + + # 2.Check if Purchase Receipt has been submitted against current Purchase Order + pc_obj.check_docstatus(check = 'Next', doctype = 'Purchase Receipt', docname = self.doc.name, detail_doctype = 'Purchase Receipt Detail') + + # 3.Check if Payable Voucher has been submitted against current Purchase Order + #pc_obj.check_docstatus(check = 'Next', doctype = 'Payable Voucher', docname = self.doc.name, detail_doctype = 'PV Detail') + + submitted = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_order = '%s' and t1.docstatus = 1" % self.doc.name) + if submitted: + msgprint("Purchase Invoice : " + cstr(submitted[0][0]) + " has already been submitted !") + raise Exception + + # 4.Set Status as Cancelled + set(self.doc,'status','Cancelled') + + # 5.Update Indents Pending Qty and accordingly it's Status + pc_obj.update_prevdoc_detail(self,is_submit = 0) + + # 6.Update Bin + self.update_bin( is_submit = 0, is_stopped = 0) + + # Step 7 :=> Update last purchase rate + pc_obj.update_last_purchase_rate(self, is_submit = 0) + #----------- code for Sub-contracted Items ------------------- - #--------check for sub-contracted items and accordingly update PO raw material detail table-------- - def update_rw_material_detail(self): - for d in getlist(self.doclist,'po_details'): - item_det = sql("select is_sub_contracted_item, is_purchase_item from `tabItem` where name = '%s'"%(d.item_code)) - - if item_det[0][0] == 'Yes': - if item_det[0][1] == 'Yes': - if not self.doc.is_subcontracted: - msgprint("Please enter whether purchase order to be made for subcontracting or for purchasing in 'Is Subcontracted' field .") - raise Exception - if self.doc.is_subcontracted == 'Yes': - self.add_bom(d) - else: - self.doc.clear_table(self.doclist,'po_raw_material_details',1) - self.doc.save() - elif item_det[0][1] == 'No': - self.add_bom(d) - - self.delete_irrelevant_raw_material() - #---------------calculate amt in PO Raw Material Detail------------- - self.calculate_amount(d) - - def add_bom(self, d): - #----- fetching default bom from Bill of Materials instead of Item Master -- - bom_det = sql("select t1.item, t2.item_code, t2.qty_consumed_per_unit, t2.moving_avg_rate, t2.value_as_per_mar, t2.stock_uom, t2.name, t2.parent from `tabBill Of Materials` t1, `tabBOM Material` t2 where t2.parent = t1.name and t1.item = '%s' and ifnull(t1.is_default,0) = 1 and t1.docstatus = 1" % d.item_code) - - if not bom_det: - msgprint("No default BOM exists for item: %s" % d.item_code) - raise Exception - else: - #-------------- add child function-------------------- - chgd_rqd_qty = [] - for i in bom_det: - if i and not sql("select name from `tabPO Raw Material Detail` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)): + #--------check for sub-contracted items and accordingly update PO raw material detail table-------- + def update_rw_material_detail(self): + for d in getlist(self.doclist,'po_details'): + item_det = sql("select is_sub_contracted_item, is_purchase_item from `tabItem` where name = '%s'"%(d.item_code)) + + if item_det[0][0] == 'Yes': + if item_det[0][1] == 'Yes': + if not self.doc.is_subcontracted: + msgprint("Please enter whether purchase order to be made for subcontracting or for purchasing in 'Is Subcontracted' field .") + raise Exception + if self.doc.is_subcontracted == 'Yes': + self.add_bom(d) + else: + self.doc.clear_table(self.doclist,'po_raw_material_details',1) + self.doc.save() + elif item_det[0][1] == 'No': + self.add_bom(d) + + self.delete_irrelevant_raw_material() + #---------------calculate amt in PO Raw Material Detail------------- + self.calculate_amount(d) + + def add_bom(self, d): + #----- fetching default bom from Bill of Materials instead of Item Master -- + bom_det = sql("select t1.item, t2.item_code, t2.qty_consumed_per_unit, t2.moving_avg_rate, t2.value_as_per_mar, t2.stock_uom, t2.name, t2.parent from `tabBill Of Materials` t1, `tabBOM Material` t2 where t2.parent = t1.name and t1.item = '%s' and ifnull(t1.is_default,0) = 1 and t1.docstatus = 1" % d.item_code) + + if not bom_det: + msgprint("No default BOM exists for item: %s" % d.item_code) + raise Exception + else: + #-------------- add child function-------------------- + chgd_rqd_qty = [] + for i in bom_det: + if i and not sql("select name from `tabPO Raw Material Detail` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)): - rm_child = addchild(self.doc, 'po_raw_material_details', 'PO Raw Material Detail', 1, self.doclist) + rm_child = addchild(self.doc, 'po_raw_material_details', 'PO Raw Material Detail', 1, self.doclist) - rm_child.reference_name = d.name - rm_child.bom_detail_no = i and i[6] or '' - rm_child.main_item_code = i and i[0] or '' - rm_child.rm_item_code = i and i[1] or '' - rm_child.stock_uom = i and i[5] or '' - rm_child.rate = i and flt(i[3]) or flt(i[4]) - rm_child.conversion_factor = d.conversion_factor - rm_child.required_qty = flt(i and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor) - rm_child.amount = flt(flt(rm_child.consumed_qty)*flt(rm_child.rate)) - rm_child.save() - chgd_rqd_qty.append(cstr(i[1])) - else: - act_qty = flt(i and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor) - for po_rmd in getlist(self.doclist, 'po_raw_material_details'): - if i and i[6] == po_rmd.bom_detail_no and (flt(act_qty) != flt(po_rmd.required_qty) or i[1] != po_rmd.rm_item_code): - chgd_rqd_qty.append(cstr(i[1])) - po_rmd.main_item_code = i[0] - po_rmd.rm_item_code = i[1] - po_rmd.stock_uom = i[5] - po_rmd.required_qty = flt(act_qty) - po_rmd.rate = i and flt(i[3]) or flt(i[4]) - po_rmd.amount = flt(flt(po_rmd.consumed_qty)*flt(po_rmd.rate)) - + rm_child.reference_name = d.name + rm_child.bom_detail_no = i and i[6] or '' + rm_child.main_item_code = i and i[0] or '' + rm_child.rm_item_code = i and i[1] or '' + rm_child.stock_uom = i and i[5] or '' + rm_child.rate = i and flt(i[3]) or flt(i[4]) + rm_child.conversion_factor = d.conversion_factor + rm_child.required_qty = flt(i and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor) + rm_child.amount = flt(flt(rm_child.consumed_qty)*flt(rm_child.rate)) + rm_child.save() + chgd_rqd_qty.append(cstr(i[1])) + else: + act_qty = flt(i and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor) + for po_rmd in getlist(self.doclist, 'po_raw_material_details'): + if i and i[6] == po_rmd.bom_detail_no and (flt(act_qty) != flt(po_rmd.required_qty) or i[1] != po_rmd.rm_item_code): + chgd_rqd_qty.append(cstr(i[1])) + po_rmd.main_item_code = i[0] + po_rmd.rm_item_code = i[1] + po_rmd.stock_uom = i[5] + po_rmd.required_qty = flt(act_qty) + po_rmd.rate = i and flt(i[3]) or flt(i[4]) + po_rmd.amount = flt(flt(po_rmd.consumed_qty)*flt(po_rmd.rate)) + - # Delete irrelevant raw material from PR Raw material details - #-------------------------------------------------------------- - def delete_irrelevant_raw_material(self): - for d in getlist(self.doclist,'po_raw_material_details'): - if not sql("select name from `tabPO Detail` where name = '%s' and parent = '%s'and item_code = '%s'" % (d.reference_name, self.doc.name, d.main_item_code)): - d.parent = 'old_par:'+self.doc.name - d.save() - - def calculate_amount(self, d): - amt = 0 - for i in getlist(self.doclist,'po_raw_material_details'): - - if(i.reference_name == d.name): - i.amount = flt(i.required_qty)* flt(i.rate) - amt += i.amount - d.rm_supp_cost = amt + # Delete irrelevant raw material from PR Raw material details + #-------------------------------------------------------------- + def delete_irrelevant_raw_material(self): + for d in getlist(self.doclist,'po_raw_material_details'): + if not sql("select name from `tabPO Detail` where name = '%s' and parent = '%s'and item_code = '%s'" % (d.reference_name, self.doc.name, d.main_item_code)): + d.parent = 'old_par:'+self.doc.name + d.save() + + def calculate_amount(self, d): + amt = 0 + for i in getlist(self.doclist,'po_raw_material_details'): + + if(i.reference_name == d.name): + i.amount = flt(i.required_qty)* flt(i.rate) + amt += i.amount + d.rm_supp_cost = amt - # On Update - # ---------------------------------------------------------------------------------------------------- - def on_update(self): - self.update_rw_material_detail() - + # On Update + # ---------------------------------------------------------------------------------------------------- + def on_update(self): + self.update_rw_material_detail() + # OTHER CHARGES TRIGGER FUNCTIONS # ==================================================================================== - - # *********** Get Tax rate if account type is TAX ******************** - def get_rate(self,arg): - return get_obj('Purchase Common').get_rate(arg,self) + + # *********** Get Tax rate if account type is TAX ******************** + def get_rate(self,arg): + return get_obj('Purchase Common').get_rate(arg,self) - # **** Pull details from other charges master (Get Other Charges) **** - def get_purchase_tax_details(self): - return get_obj('Purchase Common').get_purchase_tax_details(self) + # **** Pull details from other charges master (Get Other Charges) **** + def get_purchase_tax_details(self): + return get_obj('Purchase Common').get_purchase_tax_details(self) - # Repair Purchase Order - # =========================================== - def repair_purchase_order(self): - get_obj('Purchase Common', 'Purchase Common').repair_curr_doctype_details(self) + # Repair Purchase Order + # =========================================== + def repair_purchase_order(self): + get_obj('Purchase Common', 'Purchase Common').repair_curr_doctype_details(self) diff --git a/erpnext/hr/doctype/attendance_control_panel/attendance_control_panel.py b/erpnext/hr/doctype/attendance_control_panel/attendance_control_panel.py index febcd91497..eb2217909d 100644 --- a/erpnext/hr/doctype/attendance_control_panel/attendance_control_panel.py +++ b/erpnext/hr/doctype/attendance_control_panel/attendance_control_panel.py @@ -94,8 +94,9 @@ class DocType: from webnotes.utils import file_manager fn, content = file_manager.get_file(filename[1]) - - if not type(content) == str: + + # NOTE: Don't know why this condition exists + if not isinstance(content, basestring) and hasattr(content, 'tostring'): content = content.tostring() import webnotes.model.import_docs diff --git a/erpnext/selling/doctype/enquiry/enquiry.js b/erpnext/selling/doctype/enquiry/enquiry.js index 499e6c62ba..f7159ab04a 100644 --- a/erpnext/selling/doctype/enquiry/enquiry.js +++ b/erpnext/selling/doctype/enquiry/enquiry.js @@ -2,49 +2,49 @@ $import(SMS Control) cur_frm.cscript.refresh = function(doc, cdt, cdn){ - // + // - if(!doc.docstatus){ - hide_field(['Update Follow up']); - hide_field(['email_id1','cc_to','subject','message','Attachment Html', 'Create New File', 'enquiry_attachment_detail','Send Email']); - } - else{ - unhide_field(['Update Follow up']); - unhide_field(['email_id1','cc_to','subject','message','Attachment Html', 'Create New File', 'enquiry_attachment_detail','Send Email']); - } + if(!doc.docstatus){ + hide_field(['Update Follow up']); + hide_field(['email_id1','cc_to','subject','message','Attachment Html', 'Create New File', 'enquiry_attachment_detail','Send Email']); + } + else{ + unhide_field(['Update Follow up']); + unhide_field(['email_id1','cc_to','subject','message','Attachment Html', 'Create New File', 'enquiry_attachment_detail','Send Email']); + } - - cur_frm.clear_custom_buttons(); - if(doc.docstatus == 1) { - cur_frm.add_custom_button('Create Quotation', cur_frm.cscript['Create Quotation']); - cur_frm.add_custom_button('Enquiry Lost', cur_frm.cscript['Declare Enquiry Lost']); - cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); - } + + cur_frm.clear_custom_buttons(); + if(doc.docstatus == 1) { + cur_frm.add_custom_button('Create Quotation', cur_frm.cscript['Create Quotation']); + cur_frm.add_custom_button('Enquiry Lost', cur_frm.cscript['Declare Enquiry Lost']); + cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); + } - //cur_frm.cscript.clear_values(doc,cdt,cdn); + //cur_frm.cscript.clear_values(doc,cdt,cdn); } // ONLOAD // =============================================================== cur_frm.cscript.onload = function(doc, cdt, cdn) { - if(!doc.enquiry_from) hide_field(['customer', 'customer_address', 'contact_person', 'customer_name','lead', 'lead_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']); - if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'}); - if(!doc.date) doc.transaction_date = date.obj_to_str(new Date()); - if(!doc.company && sys_defaults.company) set_multiple(cdt,cdn,{company:sys_defaults.company}); - if(!doc.fiscal_year && sys_defaults.fiscal_year) set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year}); - - if(doc.enquiry_from) { - if(doc.enquiry_from == 'Customer') { - hide_field(['lead', 'lead_name']); - } - else if (doc.enquiry_from == 'Lead') { - hide_field(['customer', 'customer_address', 'contact_person', 'customer_name', 'contact_display', 'customer_group']); - } - } + if(!doc.enquiry_from) hide_field(['customer', 'customer_address', 'contact_person', 'customer_name','lead', 'lead_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']); + if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'}); + if(!doc.date) doc.transaction_date = date.obj_to_str(new Date()); + if(!doc.company && sys_defaults.company) set_multiple(cdt,cdn,{company:sys_defaults.company}); + if(!doc.fiscal_year && sys_defaults.fiscal_year) set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year}); + + if(doc.enquiry_from) { + if(doc.enquiry_from == 'Customer') { + hide_field(['lead', 'lead_name']); + } + else if (doc.enquiry_from == 'Lead') { + hide_field(['customer', 'customer_address', 'contact_person', 'customer_name', 'contact_display', 'customer_group']); + } + } - // setup fetch - cur_frm.cscript.set_fetch(); + // setup fetch + cur_frm.cscript.set_fetch(); } cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) { @@ -57,119 +57,119 @@ cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) { // =============================================================== cur_frm.cscript.set_fetch = function() { - // item - cur_frm.add_fetch('item_code', 'item_name', 'item_name'); - cur_frm.add_fetch('item_code', 'stock_uom', 'uom'); - cur_frm.add_fetch('item_code', 'description', 'description'); - cur_frm.add_fetch('item_code', 'item_group', 'item_group'); - cur_frm.add_fetch('item_code', 'brand', 'brand'); + // item + cur_frm.add_fetch('item_code', 'item_name', 'item_name'); + cur_frm.add_fetch('item_code', 'stock_uom', 'uom'); + cur_frm.add_fetch('item_code', 'description', 'description'); + cur_frm.add_fetch('item_code', 'item_group', 'item_group'); + cur_frm.add_fetch('item_code', 'brand', 'brand'); - // customer + // customer } // hide - unhide fields on basis of enquiry_from lead or customer cur_frm.cscript.enquiry_from = function(doc,cdt,cdn){ - cur_frm.cscript.lead_cust_show(doc,cdt,cdn); + cur_frm.cscript.lead_cust_show(doc,cdt,cdn); } // hide - unhide fields based on lead or customer cur_frm.cscript.lead_cust_show = function(doc,cdt,cdn){ - if(doc.enquiry_from == 'Lead'){ - unhide_field(['lead']); - hide_field(['lead_name','customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); - doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = ""; - } - else if(doc.enquiry_from == 'Customer'){ - unhide_field(['customer']); - hide_field(['lead','lead_name','address_display','contact_display','contact_mobile','contact_email','territory']); - doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = ""; - } + if(doc.enquiry_from == 'Lead'){ + unhide_field(['lead']); + hide_field(['lead_name','customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); + doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = ""; + } + else if(doc.enquiry_from == 'Customer'){ + unhide_field(['customer']); + hide_field(['lead','lead_name','address_display','contact_display','contact_mobile','contact_email','territory']); + doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = ""; + } } // customer cur_frm.cscript.customer = function(doc,dt,dn) { - if(doc.customer) get_server_fields('get_default_customer_address', JSON.stringify({customer: doc.customer}),'', doc, dt, dn, 1); - if(doc.customer) unhide_field(['customer_name','customer_address','contact_person','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); + if(doc.customer) get_server_fields('get_default_customer_address', JSON.stringify({customer: doc.customer}),'', doc, dt, dn, 1); + if(doc.customer) unhide_field(['customer_name','customer_address','contact_person','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); } -cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { - if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1); +cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { + if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1); } cur_frm.fields_dict.customer_address.on_new = function(dn) { - locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; - locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; + locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; + locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; } cur_frm.fields_dict.contact_person.on_new = function(dn) { - locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; - locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; + locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; + locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; } cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) { - return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; + return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) { - return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; + return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } // lead cur_frm.fields_dict['lead'].get_query = function(doc,cdt,cdn){ - return 'SELECT `tabLead`.name, `tabLead`.lead_name FROM `tabLead` WHERE `tabLead`.%(key)s LIKE "%s" ORDER BY `tabLead`.`name` ASC LIMIT 50'; + return 'SELECT `tabLead`.name, `tabLead`.lead_name FROM `tabLead` WHERE `tabLead`.%(key)s LIKE "%s" ORDER BY `tabLead`.`name` ASC LIMIT 50'; } cur_frm.cscript.lead = function(doc, cdt, cdn) { - if(doc.lead) get_server_fields('get_lead_details', doc.lead,'', doc, cdt, cdn, 1); - if(doc.lead) unhide_field(['lead_name','address_display','contact_mobile','contact_email','territory']); + if(doc.lead) get_server_fields('get_lead_details', doc.lead,'', doc, cdt, cdn, 1); + if(doc.lead) unhide_field(['lead_name','address_display','contact_mobile','contact_email','territory']); } //item getquery //======================================= cur_frm.fields_dict['enquiry_details'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) { - if (doc.enquiry_type == 'Maintenance') - return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_service_item="Yes" AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50'; - else - return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_sales_item="Yes" AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50'; + if (doc.enquiry_type == 'Maintenance') + return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_service_item="Yes" AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50'; + else + return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_sales_item="Yes" AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50'; } - + //Fetch Item Details //==================================================================================================================== cur_frm.cscript.item_code = function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - if (d.item_code) { - get_server_fields('get_item_details',d.item_code,'enquiry_details',doc,cdt,cdn,1); - } + var d = locals[cdt][cdn]; + if (d.item_code) { + get_server_fields('get_item_details',d.item_code,'enquiry_details',doc,cdt,cdn,1); + } } /* //Fetch Customer Details //====================================================================================================================== cur_frm.cscript.customer = function(doc, cdt, cdn){ - if (doc.customer) { - get_server_fields('get_cust_address',doc.customer,'',doc,cdt,cdn,1); - } + if (doc.customer) { + get_server_fields('get_cust_address',doc.customer,'',doc,cdt,cdn,1); + } } */ /* //======================================================================================================================= cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) { - return 'SELECT `tabContact`.contact_name FROM `tabContact` WHERE `tabContact`.is_customer = 1 AND `tabContact`.customer = "'+ doc.customer+'" AND `tabContact`.docstatus != 2 AND `tabContact`.contact_name LIKE "%s" ORDER BY `tabContact`.contact_name ASC LIMIT 50'; + return 'SELECT `tabContact`.contact_name FROM `tabContact` WHERE `tabContact`.is_customer = 1 AND `tabContact`.customer = "'+ doc.customer+'" AND `tabContact`.docstatus != 2 AND `tabContact`.contact_name LIKE "%s" ORDER BY `tabContact`.contact_name ASC LIMIT 50'; } */ /* //======================================================================================================================= cur_frm.cscript.contact_person = function(doc, cdt, cdn){ - if (doc.contact_person) { - arg = {}; - arg.contact_person = doc.contact_person; - arg.customer = doc.customer; - get_server_fields('get_contact_details',docstring(arg),'',doc,cdt,cdn,1); - } + if (doc.contact_person) { + arg = {}; + arg.contact_person = doc.contact_person; + arg.customer = doc.customer; + get_server_fields('get_contact_details',docstring(arg),'',doc,cdt,cdn,1); + } } */ @@ -177,159 +177,159 @@ cur_frm.cscript.contact_person = function(doc, cdt, cdn){ // hide - unhide fields based on lead or customer.. //======================================================================================================================= cur_frm.cscript.clear_values = function(doc,cdt,cdn) { - if(doc.enquiry_from == 'Lead') { - doc.customer = doc.customer_name = doc.contact_person = doc.customer_group = ""; - } - else if(doc.enquiry_from == 'Customer') { - doc.lead = doc.lead_name = ""; - } - refresh_many(['lead','lead_name','customer','customer_name','contact_person','customer_group']); + if(doc.enquiry_from == 'Lead') { + doc.customer = doc.customer_name = doc.contact_person = doc.customer_group = ""; + } + else if(doc.enquiry_from == 'Customer') { + doc.lead = doc.lead_name = ""; + } + refresh_many(['lead','lead_name','customer','customer_name','contact_person','customer_group']); } */ /* //================ hide - unhide fields on basis of enquiry from either lead or customer =============================== cur_frm.cscript.enquiry_from = function(doc,cdt,cdn){ - cur_frm.cscript.clear_values(doc,cdt,cdn); - doc.address = doc.territory = doc.contact_no = doc.email_id = ""; - refresh_many(['territory','address','contact_no','email_id']); + cur_frm.cscript.clear_values(doc,cdt,cdn); + doc.address = doc.territory = doc.contact_no = doc.email_id = ""; + refresh_many(['territory','address','contact_no','email_id']); } */ /* //================ create new contact ============================================================================ cur_frm.cscript.new_contact = function(){ - tn = createLocal('Contact'); - locals['Contact'][tn].is_customer = 1; - if(doc.customer) locals['Contact'][tn].customer = doc.customer; - loaddoc('Contact', tn); + tn = createLocal('Contact'); + locals['Contact'][tn].is_customer = 1; + if(doc.customer) locals['Contact'][tn].customer = doc.customer; + loaddoc('Contact', tn); } */ //======================================================================================================================= cur_frm.cscript['Create New File'] = function(doc){ - var fl = LocalDB.create('File'); - fl = locals['File'][fl]; - loaddoc('File', fl.name); + var fl = LocalDB.create('File'); + fl = locals['File'][fl]; + loaddoc('File', fl.name); } //update follow up //================================================================================= cur_frm.cscript['Update Follow up'] = function(doc,cdt,cdn){ - $c_obj(make_doclist(doc.doctype, doc.name),'update_follow_up','',function(r, rt){ - refresh_field('follow_up'); - doc.__unsaved = 0; - cur_frm.refresh_header(); - }); + $c_obj(make_doclist(doc.doctype, doc.name),'update_follow_up','',function(r, rt){ + refresh_field('follow_up'); + doc.__unsaved = 0; + cur_frm.refresh_header(); + }); } // Create New Quotation // ======================================================================================================================= cur_frm.cscript['Create Quotation'] = function(){ - n = createLocal("Quotation"); - $c('dt_map', args={ - 'docs':compress_doclist([locals["Quotation"][n]]), - 'from_doctype':'Enquiry', - 'to_doctype':'Quotation', - 'from_docname':cur_frm.docname, - 'from_to_list':"[['Enquiry', 'Quotation'],['Enquiry Detail','Quotation Detail']]" - } - , function(r,rt) { - loaddoc("Quotation", n); - } - ); + n = createLocal("Quotation"); + $c('dt_map', args={ + 'docs':compress_doclist([locals["Quotation"][n]]), + 'from_doctype':'Enquiry', + 'to_doctype':'Quotation', + 'from_docname':cur_frm.docname, + 'from_to_list':"[['Enquiry', 'Quotation'],['Enquiry Detail','Quotation Detail']]" + } + , function(r,rt) { + loaddoc("Quotation", n); + } + ); } -// declare enquiry lost +// declare enquiry lost //------------------------- cur_frm.cscript['Declare Enquiry Lost'] = function(){ - var e_lost_dialog; + var e_lost_dialog; - set_e_lost_dialog = function(){ - e_lost_dialog = new Dialog(400,150,'Add Enquiry Lost Reason'); - e_lost_dialog.make_body([ - ['HTML', 'Message', '
Please add enquiry lost reason
'], - ['Text', 'Enquiry Lost Reason'], - ['HTML', 'Response', '
'], - ['HTML', 'Add Reason', '
'] - ]); - - var add_reason_btn1 = $a($i(e_lost_dialog.widgets['Add Reason']), 'button', 'button'); - add_reason_btn1.innerHTML = 'Add'; - add_reason_btn1.onclick = function(){ e_lost_dialog.add(); } - - var add_reason_btn2 = $a($i(e_lost_dialog.widgets['Add Reason']), 'button', 'button'); - add_reason_btn2.innerHTML = 'Cancel'; - $y(add_reason_btn2,{marginLeft:'4px'}); - add_reason_btn2.onclick = function(){ e_lost_dialog.hide();} - - e_lost_dialog.onshow = function() { - e_lost_dialog.widgets['Enquiry Lost Reason'].value = ''; - $i('update_enquiry_dialog_response').innerHTML = ''; - } - - e_lost_dialog.add = function() { - // sending... - $i('update_enquiry_dialog_response').innerHTML = 'Processing...'; - var arg = strip(e_lost_dialog.widgets['Enquiry Lost Reason'].value); - var call_back = function(r,rt) { - if(r.message == 'true'){ - $i('update_enquiry_dialog_response').innerHTML = 'Done'; - e_lost_dialog.hide(); - } - } - if(arg) { - $c_obj(make_doclist(cur_frm.doc.doctype, cur_frm.doc.name),'declare_enquiry_lost',arg,call_back); - } - else{ - msgprint("Please add enquiry lost reason"); - } - - } - } - - if(!e_lost_dialog){ - set_e_lost_dialog(); - } - e_lost_dialog.show(); + set_e_lost_dialog = function(){ + e_lost_dialog = new Dialog(400,150,'Add Enquiry Lost Reason'); + e_lost_dialog.make_body([ + ['HTML', 'Message', '
Please add enquiry lost reason
'], + ['Text', 'Enquiry Lost Reason'], + ['HTML', 'Response', '
'], + ['HTML', 'Add Reason', '
'] + ]); + + var add_reason_btn1 = $a($i(e_lost_dialog.widgets['Add Reason']), 'button', 'button'); + add_reason_btn1.innerHTML = 'Add'; + add_reason_btn1.onclick = function(){ e_lost_dialog.add(); } + + var add_reason_btn2 = $a($i(e_lost_dialog.widgets['Add Reason']), 'button', 'button'); + add_reason_btn2.innerHTML = 'Cancel'; + $y(add_reason_btn2,{marginLeft:'4px'}); + add_reason_btn2.onclick = function(){ e_lost_dialog.hide();} + + e_lost_dialog.onshow = function() { + e_lost_dialog.widgets['Enquiry Lost Reason'].value = ''; + $i('update_enquiry_dialog_response').innerHTML = ''; + } + + e_lost_dialog.add = function() { + // sending... + $i('update_enquiry_dialog_response').innerHTML = 'Processing...'; + var arg = strip(e_lost_dialog.widgets['Enquiry Lost Reason'].value); + var call_back = function(r,rt) { + if(r.message == 'true'){ + $i('update_enquiry_dialog_response').innerHTML = 'Done'; + e_lost_dialog.hide(); + } + } + if(arg) { + $c_obj(make_doclist(cur_frm.doc.doctype, cur_frm.doc.name),'declare_enquiry_lost',arg,call_back); + } + else{ + msgprint("Please add enquiry lost reason"); + } + + } + } + + if(!e_lost_dialog){ + set_e_lost_dialog(); + } + e_lost_dialog.show(); } //get query select Territory //======================================================================================================================= cur_frm.fields_dict['territory'].get_query = function(doc,cdt,cdn) { - return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s" ORDER BY `tabTerritory`.`name` ASC LIMIT 50';} + return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s" ORDER BY `tabTerritory`.`name` ASC LIMIT 50';} /* //===================== Enquiry From validation - either customer or lead is mandatory ===================================== cur_frm.cscript.enq_frm_validate = function(doc,cdt,cdn){ - - if(doc.enquiry_from == 'Lead'){ - if(!doc.lead){ - alert("Lead is mandatory."); - validated = false; - } - } - else if(doc.enquiry_from == 'Customer'){ - if(!doc.customer){ - alert("Customer is mandatory."); - validated = false; - } - else if(!doc.contact_person){ - alert("Contact Person is mandatory."); - validated = false; - } - else if(!doc.customer_group){ - alert("Customer Group is mandatory."); - validated = false; - } - } + + if(doc.enquiry_from == 'Lead'){ + if(!doc.lead){ + alert("Lead is mandatory."); + validated = false; + } + } + else if(doc.enquiry_from == 'Customer'){ + if(!doc.customer){ + alert("Customer is mandatory."); + validated = false; + } + else if(!doc.contact_person){ + alert("Contact Person is mandatory."); + validated = false; + } + else if(!doc.customer_group){ + alert("Customer Group is mandatory."); + validated = false; + } + } } */ //===================validation function ============================================================================== cur_frm.cscript.validate = function(doc,cdt,cdn){ - //cur_frm.cscript.enq_frm_validate(doc,cdt,cdn); + //cur_frm.cscript.enq_frm_validate(doc,cdt,cdn); } diff --git a/erpnext/selling/doctype/quotation/quotation.js b/erpnext/selling/doctype/quotation/quotation.js index 9ff676f4a9..9ba743d5ae 100644 --- a/erpnext/selling/doctype/quotation/quotation.js +++ b/erpnext/selling/doctype/quotation/quotation.js @@ -12,53 +12,57 @@ $import(SMS Control) // ONLOAD // =================================================================================== cur_frm.cscript.onload = function(doc, cdt, cdn) { - if(!doc.quotation_to) hide_field(['customer','customer_address','contact_person','customer_name','lead', 'lead_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']); - if(!doc.price_list_name) set_multiple(cdt,cdn,{price_list_name:sys_defaults.price_list_name}); - if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'}); - if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()}); - if(!doc.conversion_rate) set_multiple(cdt,cdn,{conversion_rate:'1.00'}); - if(!doc.currency && sys_defaults.currency) set_multiple(cdt,cdn,{currency:sys_defaults.currency}); - if(!doc.price_list_currency) set_multiple(cdt, cdn, {price_list_currency: doc.currency, plc_conversion_rate: 1}); + if(!doc.quotation_to) hide_field(['customer','customer_address','contact_person','customer_name','lead', 'lead_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']); + if(!doc.price_list_name) set_multiple(cdt,cdn,{price_list_name:sys_defaults.price_list_name}); + if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'}); + if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()}); + if(!doc.conversion_rate) set_multiple(cdt,cdn,{conversion_rate:'1.00'}); + if(!doc.currency && sys_defaults.currency) set_multiple(cdt,cdn,{currency:sys_defaults.currency}); + if(!doc.price_list_currency) set_multiple(cdt, cdn, {price_list_currency: doc.currency, plc_conversion_rate: 1}); - if(!doc.company && sys_defaults.company) set_multiple(cdt,cdn,{company:sys_defaults.company}); - if(!doc.fiscal_year && sys_defaults.fiscal_year) set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year}); + if(!doc.company && sys_defaults.company) set_multiple(cdt,cdn,{company:sys_defaults.company}); + if(!doc.fiscal_year && sys_defaults.fiscal_year) set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year}); + + if(doc.quotation_to) { + if(doc.quotation_to == 'Customer') { + hide_field(['lead', 'lead_name']); + } + else if (doc.quotation_to == 'Lead') { + hide_field(['customer','customer_address','contact_person', 'customer_name','contact_display', 'customer_group']); + } + } + + // defined in sales_common.js + cur_frm.cscript.update_item_details(doc, cdt, cdn); - if(doc.quotation_to) { - if(doc.quotation_to == 'Customer') { - hide_field(['lead', 'lead_name']); - } - else if (doc.quotation_to == 'Lead') { - hide_field(['customer','customer_address','contact_person', 'customer_name','contact_display', 'customer_group']); - } - } } cur_frm.cscript.onload_post_render = function(doc, dt, dn) { - // load default charges - if(doc.__islocal && !getchildren('RV Tax Detail', doc.name, 'other_charges', doc.doctype).length) - cur_frm.cscript.load_taxes(doc, cdt, cdn); + // load default charges + if(doc.__islocal && !getchildren('RV Tax Detail', doc.name, 'other_charges', doc.doctype).length) + cur_frm.cscript.load_taxes(doc, cdt, cdn); } // hide - unhide fields based on lead or customer.. // ======================================================================================================================= cur_frm.cscript.lead_cust_show = function(doc,cdt,cdn){ - if(doc.quotation_to == 'Lead'){ - unhide_field(['lead']); - hide_field(['lead_name','customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); - doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = ""; - } - else if(doc.quotation_to == 'Customer'){ - unhide_field(['customer']); - hide_field(['lead','lead_name','address_display','contact_display','contact_mobile','contact_email','territory']); - doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = ""; - } + if(doc.quotation_to == 'Lead'){ + unhide_field(['lead']); + hide_field(['lead_name','customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); + doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = ""; + } + else if(doc.quotation_to == 'Customer'){ + unhide_field(['customer']); + hide_field(['lead','lead_name','address_display','contact_display','contact_mobile','contact_email','territory']); + doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = ""; + } } //================ hide - unhide fields on basis of quotation to either lead or customer =============================== cur_frm.cscript.quotation_to = function(doc,cdt,cdn){ - cur_frm.cscript.lead_cust_show(doc,cdt,cdn); + cur_frm.cscript.lead_cust_show(doc,cdt,cdn); } @@ -66,111 +70,111 @@ cur_frm.cscript.quotation_to = function(doc,cdt,cdn){ // =================================================================================== cur_frm.cscript.refresh = function(doc, cdt, cdn) { - cur_frm.clear_custom_buttons(); + cur_frm.clear_custom_buttons(); - if(doc.docstatus == 1 && doc.status!='Order Lost') { - cur_frm.add_custom_button('Make Sales Order', cur_frm.cscript['Make Sales Order']); - cur_frm.add_custom_button('Set as Lost', cur_frm.cscript['Declare Order Lost']); - cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); - } + if(doc.docstatus == 1 && doc.status!='Order Lost') { + cur_frm.add_custom_button('Make Sales Order', cur_frm.cscript['Make Sales Order']); + cur_frm.add_custom_button('Set as Lost', cur_frm.cscript['Declare Order Lost']); + cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); + } - if (!doc.docstatus) hide_field(['Update Follow up']); - else unhide_field(['Update Follow up']); + if (!doc.docstatus) hide_field(['Update Follow up']); + else unhide_field(['Update Follow up']); } //customer cur_frm.cscript.customer = function(doc,dt,dn) { - var callback = function(r,rt) { - var doc = locals[cur_frm.doctype][cur_frm.docname]; - cur_frm.refresh(); - } + var callback = function(r,rt) { + var doc = locals[cur_frm.doctype][cur_frm.docname]; + cur_frm.refresh(); + } - if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_address', '', callback); - if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); + if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_address', '', callback); + if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); } cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { - if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1); + if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1); } cur_frm.fields_dict.customer_address.on_new = function(dn) { - locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; - locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; + locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; + locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; } cur_frm.fields_dict.contact_person.on_new = function(dn) { - locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; - locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; + locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; + locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; } cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) { - return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; + return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) { - return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; + return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } //lead cur_frm.fields_dict['lead'].get_query = function(doc,cdt,cdn){ - return 'SELECT `tabLead`.name, `tabLead`.lead_name FROM `tabLead` WHERE `tabLead`.%(key)s LIKE "%s" ORDER BY `tabLead`.`name` ASC LIMIT 50'; + return 'SELECT `tabLead`.name, `tabLead`.lead_name FROM `tabLead` WHERE `tabLead`.%(key)s LIKE "%s" ORDER BY `tabLead`.`name` ASC LIMIT 50'; } cur_frm.cscript.lead = function(doc, cdt, cdn) { - if(doc.lead) get_server_fields('get_lead_details', doc.lead,'', doc, cdt, cdn, 1); - if(doc.lead) unhide_field(['lead_name','address_display','contact_mobile','contact_email','territory']); + if(doc.lead) get_server_fields('get_lead_details', doc.lead,'', doc, cdt, cdn, 1); + if(doc.lead) unhide_field(['lead_name','address_display','contact_mobile','contact_email','territory']); } // ===================================================================================== cur_frm.fields_dict['enq_no'].get_query = function(doc,cdt,cdn){ - var cond=''; - var cond1=''; - if(doc.order_type) cond = 'ifnull(`tabEnquiry`.enquiry_type, "") = "'+doc.order_type+'" AND'; - if(doc.customer) cond1 = '`tabEnquiry`.customer = "'+doc.customer+'" AND'; - else if(doc.lead) cond1 = '`tabEnquiry`.lead = "'+doc.lead+'" AND'; + var cond=''; + var cond1=''; + if(doc.order_type) cond = 'ifnull(`tabEnquiry`.enquiry_type, "") = "'+doc.order_type+'" AND'; + if(doc.customer) cond1 = '`tabEnquiry`.customer = "'+doc.customer+'" AND'; + else if(doc.lead) cond1 = '`tabEnquiry`.lead = "'+doc.lead+'" AND'; - return repl('SELECT `tabEnquiry`.`name` FROM `tabEnquiry` WHERE `tabEnquiry`.`docstatus` = 1 AND `tabEnquiry`.status = "Submitted" AND %(cond)s %(cond1)s `tabEnquiry`.`name` LIKE "%s" ORDER BY `tabEnquiry`.`name` ASC LIMIT 50', {cond:cond, cond1:cond1}); + return repl('SELECT `tabEnquiry`.`name` FROM `tabEnquiry` WHERE `tabEnquiry`.`docstatus` = 1 AND `tabEnquiry`.status = "Submitted" AND %(cond)s %(cond1)s `tabEnquiry`.`name` LIKE "%s" ORDER BY `tabEnquiry`.`name` ASC LIMIT 50', {cond:cond, cond1:cond1}); } // Make Sales Order // ===================================================================================== cur_frm.cscript['Make Sales Order'] = function() { - var doc = cur_frm.doc; + var doc = cur_frm.doc; - if (doc.docstatus == 1) { - var n = createLocal("Sales Order"); - $c('dt_map', args={ - 'docs':compress_doclist([locals["Sales Order"][n]]), - 'from_doctype':'Quotation', - 'to_doctype':'Sales Order', - 'from_docname':doc.name, - 'from_to_list':"[['Quotation', 'Sales Order'], ['Quotation Detail', 'Sales Order Detail'],['RV Tax Detail','RV Tax Detail'], ['Sales Team', 'Sales Team'], ['TC Detail', 'TC Detail']]" - }, function(r,rt) { - loaddoc("Sales Order", n); - }); - } + if (doc.docstatus == 1) { + var n = createLocal("Sales Order"); + $c('dt_map', args={ + 'docs':compress_doclist([locals["Sales Order"][n]]), + 'from_doctype':'Quotation', + 'to_doctype':'Sales Order', + 'from_docname':doc.name, + 'from_to_list':"[['Quotation', 'Sales Order'], ['Quotation Detail', 'Sales Order Detail'],['RV Tax Detail','RV Tax Detail'], ['Sales Team', 'Sales Team'], ['TC Detail', 'TC Detail']]" + }, function(r,rt) { + loaddoc("Sales Order", n); + }); + } } //pull enquiry details cur_frm.cscript['Pull Enquiry Detail'] = function(doc,cdt,cdn){ - var callback = function(r,rt){ - if(r.message){ - doc.quotation_to = r.message; + var callback = function(r,rt){ + if(r.message){ + doc.quotation_to = r.message; - if(doc.quotation_to == 'Lead') { - unhide_field(['lead','lead_name','address_display','contact_mobile','contact_email','territory']); - } - else if(doc.quotation_to == 'Customer') { - unhide_field(['customer','customer_address','contact_person','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); - } - refresh_many(['quotation_details','quotation_to','customer','customer_address','contact_person','lead','lead_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','order_type']); - } - } + if(doc.quotation_to == 'Lead') { + unhide_field(['lead','lead_name','address_display','contact_mobile','contact_email','territory']); + } + else if(doc.quotation_to == 'Customer') { + unhide_field(['customer','customer_address','contact_person','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); + } + refresh_many(['quotation_details','quotation_to','customer','customer_address','contact_person','lead','lead_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','order_type']); + } + } - $c_obj(make_doclist(doc.doctype, doc.name),'pull_enq_details','',callback); + $c_obj(make_doclist(doc.doctype, doc.name),'pull_enq_details','',callback); } @@ -178,70 +182,70 @@ cur_frm.cscript['Pull Enquiry Detail'] = function(doc,cdt,cdn){ //================================================================================= cur_frm.cscript['Update Follow up'] = function(doc){ - $c_obj(make_doclist(doc.doctype, doc.name),'update_followup_details','',function(r, rt){ - refresh_field('follow_up'); - doc.__unsaved = 0; - cur_frm.refresh_header(); - }); + $c_obj(make_doclist(doc.doctype, doc.name),'update_followup_details','',function(r, rt){ + refresh_field('follow_up'); + doc.__unsaved = 0; + cur_frm.refresh_header(); + }); } // declare order lost //------------------------- cur_frm.cscript['Declare Order Lost'] = function(){ - var qtn_lost_dialog; + var qtn_lost_dialog; - set_qtn_lost_dialog = function(doc,cdt,cdn){ - qtn_lost_dialog = new Dialog(400,400,'Add Quotation Lost Reason'); - qtn_lost_dialog.make_body([ - ['HTML', 'Message', '
Please add quotation lost reason
'], - ['Text', 'Quotation Lost Reason'], - ['HTML', 'Response', '
'], - ['HTML', 'Add Reason', '
'] - ]); + set_qtn_lost_dialog = function(doc,cdt,cdn){ + qtn_lost_dialog = new Dialog(400,400,'Add Quotation Lost Reason'); + qtn_lost_dialog.make_body([ + ['HTML', 'Message', '
Please add quotation lost reason
'], + ['Text', 'Quotation Lost Reason'], + ['HTML', 'Response', '
'], + ['HTML', 'Add Reason', '
'] + ]); - var add_reason_btn1 = $a($i(qtn_lost_dialog.widgets['Add Reason']), 'button', 'button'); - add_reason_btn1.innerHTML = 'Add'; - add_reason_btn1.onclick = function(){ qtn_lost_dialog.add(); } + var add_reason_btn1 = $a($i(qtn_lost_dialog.widgets['Add Reason']), 'button', 'button'); + add_reason_btn1.innerHTML = 'Add'; + add_reason_btn1.onclick = function(){ qtn_lost_dialog.add(); } - var add_reason_btn2 = $a($i(qtn_lost_dialog.widgets['Add Reason']), 'button', 'button'); - add_reason_btn2.innerHTML = 'Cancel'; - $y(add_reason_btn2,{marginLeft:'4px'}); - add_reason_btn2.onclick = function(){ qtn_lost_dialog.hide();} + var add_reason_btn2 = $a($i(qtn_lost_dialog.widgets['Add Reason']), 'button', 'button'); + add_reason_btn2.innerHTML = 'Cancel'; + $y(add_reason_btn2,{marginLeft:'4px'}); + add_reason_btn2.onclick = function(){ qtn_lost_dialog.hide();} - qtn_lost_dialog.onshow = function() { - qtn_lost_dialog.widgets['Quotation Lost Reason'].value = ''; - $i('update_quotation_dialog_response').innerHTML = ''; - } + qtn_lost_dialog.onshow = function() { + qtn_lost_dialog.widgets['Quotation Lost Reason'].value = ''; + $i('update_quotation_dialog_response').innerHTML = ''; + } - qtn_lost_dialog.add = function() { - // sending... - $i('update_quotation_dialog_response').innerHTML = 'Processing...'; - var arg = strip(qtn_lost_dialog.widgets['Quotation Lost Reason'].value); - var call_back = function(r,rt) { - if(r.message == 'true'){ - $i('update_quotation_dialog_response').innerHTML = 'Done'; - qtn_lost_dialog.hide(); - } - } - if(arg) $c_obj(make_doclist(cur_frm.doc.doctype, cur_frm.doc.name),'declare_order_lost',arg,call_back); - else msgprint("Please add Quotation lost reason"); - } - } + qtn_lost_dialog.add = function() { + // sending... + $i('update_quotation_dialog_response').innerHTML = 'Processing...'; + var arg = strip(qtn_lost_dialog.widgets['Quotation Lost Reason'].value); + var call_back = function(r,rt) { + if(r.message == 'true'){ + $i('update_quotation_dialog_response').innerHTML = 'Done'; + qtn_lost_dialog.hide(); + } + } + if(arg) $c_obj(make_doclist(cur_frm.doc.doctype, cur_frm.doc.name),'declare_order_lost',arg,call_back); + else msgprint("Please add Quotation lost reason"); + } + } - if(!qtn_lost_dialog){ - set_qtn_lost_dialog(doc,cdt,cdn); - } - qtn_lost_dialog.show(); + if(!qtn_lost_dialog){ + set_qtn_lost_dialog(doc,cdt,cdn); + } + qtn_lost_dialog.show(); } // GET REPORT // ======================================================================================== cur_frm.cscript['Get Report'] = function(doc,cdt,cdn) { - var callback = function(report){ - report.set_filter('Sales Order Detail', 'Quotation No.',doc.name) - report.dt.run(); + var callback = function(report){ + report.set_filter('Sales Order Detail', 'Quotation No.',doc.name) + report.dt.run(); } loadreport('Sales Order Detail','Itemwise Sales Details', callback); } @@ -250,33 +254,34 @@ cur_frm.cscript['Get Report'] = function(doc,cdt,cdn) { //===================== Quotation to validation - either customer or lead mandatory ==================== cur_frm.cscript.quot_to_validate = function(doc,cdt,cdn){ - if(doc.quotation_to == 'Lead'){ + if(doc.quotation_to == 'Lead'){ - if(!doc.lead){ - alert("Lead is mandatory."); - validated = false; - } - } - else if(doc.quotation_to == 'Customer'){ - if(!doc.customer){ - alert("Customer is mandatory."); - validated = false; - } - } + if(!doc.lead){ + alert("Lead is mandatory."); + validated = false; + } + } + else if(doc.quotation_to == 'Customer'){ + if(!doc.customer){ + alert("Customer is mandatory."); + validated = false; + } + } } //===================validation function ================================= cur_frm.cscript.validate = function(doc,cdt,cdn){ - cur_frm.cscript.quot_to_validate(doc,cdt,cdn); + cur_frm.cscript['Re-Calculate Values'](doc, cdt, cdn); + cur_frm.cscript.quot_to_validate(doc,cdt,cdn); } //================ Last Quoted Price and Last Sold Price suggestion ====================== cur_frm.fields_dict['quotation_details'].grid.get_field('item_code').get_query= function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - var cond = (doc.order_type == 'Maintenance')? " and tabItem.is_service_item = 'Yes'" : " and tabItem.is_sales_item = 'Yes'" - if(doc.customer) - return repl("SELECT i.name,i.item_code,concat('Last quoted at - ',cast(quote_rate as char)) as quote_rate,concat('Last sold at - ',cast(sales_rate as char)) as sales_rate, i.item_name, i.description FROM\ + var d = locals[cdt][cdn]; + var cond = (doc.order_type == 'Maintenance')? " and tabItem.is_service_item = 'Yes'" : " and tabItem.is_sales_item = 'Yes'" + if(doc.customer) + return repl("SELECT i.name,i.item_code,concat('Last quoted at - ',cast(quote_rate as char)) as quote_rate,concat('Last sold at - ',cast(sales_rate as char)) as sales_rate, i.item_name, i.description FROM\ (\ select item_code,name, item_name, description from tabItem where tabItem.%(key)s like '%s' %(cond)s\ )i\ @@ -300,8 +305,8 @@ cur_frm.fields_dict['quotation_details'].grid.get_field('item_code').get_query= select rd.item_code,max(voucher_date) as voucher_date from `tabRV Detail` rd, `tabReceivable Voucher` r where r.name=rd.parent and r.docstatus=1 and customer='%(cust)s' group by rd.item_code\ )m where r.item_code=m.item_code and r.voucher_date=m.voucher_date\ )s on i.item_code=s.item_code ORDER BY item_code LIMIT 50",{cust:doc.customer, cond:cond}); - else - return repl("SELECT name, item_name, description FROM tabItem WHERE `tabItem`.%(key)s LIKE '%s' %(cond)s ORDER BY tabItem.item_code DESC LIMIT 50", {cond:cond}); + else + return repl("SELECT name, item_name, description FROM tabItem WHERE `tabItem`.%(key)s LIKE '%s' %(cond)s ORDER BY tabItem.item_code DESC LIMIT 50", {cond:cond}); } $import(Notification Control) diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 01e67eb5b6..795ef7991e 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -19,324 +19,334 @@ convert_to_lists = webnotes.conn.convert_to_lists from utilities.transaction_base import TransactionBase class DocType(TransactionBase): - def __init__(self, doc, doclist=[]): - self.doc = doc - self.doclist = doclist - self.tname = 'Quotation Detail' - self.fname = 'quotation_details' - - # Autoname - # --------- - def autoname(self): - self.doc.name = make_autoname(self.doc.naming_series+'.#####') + def __init__(self, doc, doclist=[]): + self.doc = doc + self.doclist = doclist + self.tname = 'Quotation Detail' + self.fname = 'quotation_details' + + # Autoname + # --------- + def autoname(self): + self.doc.name = make_autoname(self.doc.naming_series+'.#####') # DOCTYPE TRIGGER FUNCTIONS -# ============================================================================== +# ============================================================================== - # Pull Enquiry Details - # -------------------- - def pull_enq_details(self): - self.doc.clear_table(self.doclist, 'quotation_details') - get_obj('DocType Mapper', 'Enquiry-Quotation').dt_map('Enquiry', 'Quotation', self.doc.enq_no, self.doc, self.doclist, "[['Enquiry', 'Quotation'],['Enquiry Detail', 'Quotation Detail']]") + # Pull Enquiry Details + # -------------------- + def pull_enq_details(self): + self.doc.clear_table(self.doclist, 'quotation_details') + get_obj('DocType Mapper', 'Enquiry-Quotation').dt_map('Enquiry', 'Quotation', self.doc.enq_no, self.doc, self.doclist, "[['Enquiry', 'Quotation'],['Enquiry Detail', 'Quotation Detail']]") - self.get_adj_percent() + self.get_adj_percent() - return self.doc.quotation_to + return self.doc.quotation_to - # Get contact person details based on customer selected - # ------------------------------------------------------ - def get_contact_details(self): - return get_obj('Sales Common').get_contact_details(self,0) - - # Clear Quotation Details - # ----------------------- - def clear_quotation_details(self): - self.doc.clear_table(self.doclist, 'quotation_details') - - + # Get contact person details based on customer selected + # ------------------------------------------------------ + def get_contact_details(self): + return get_obj('Sales Common').get_contact_details(self,0) + + # Clear Quotation Details + # ----------------------- + def clear_quotation_details(self): + self.doc.clear_table(self.doclist, 'quotation_details') + + # QUOTATION DETAILS TRIGGER FUNCTIONS -# ================================================================================ +# ================================================================================ - # Get Item Details - # ----------------- - def get_item_details(self, item_code): - return get_obj('Sales Common').get_item_details(item_code, self) - - # Re-calculates Basic Rate & amount based on Price List Selected - # -------------------------------------------------------------- - def get_adj_percent(self, arg=''): - get_obj('Sales Common').get_adj_percent(self) - + # Get Item Details + # ----------------- + def get_item_details(self, item_code=None): + if item_code: + return get_obj('Sales Common').get_item_details(item_code, self) + else: + obj = get_obj('Sales Common') + for doc in self.doclist: + if doc.fields.get('item_code'): + ret = obj.get_item_details(doc.item_code, self) + for r in ret: + if not doc.fields.get(r): + doc.fields[r] = ret[r] + + + # Re-calculates Basic Rate & amount based on Price List Selected + # -------------------------------------------------------------- + def get_adj_percent(self, arg=''): + get_obj('Sales Common').get_adj_percent(self) + # OTHER CHARGES TRIGGER FUNCTIONS # ==================================================================================== - - # Get Tax rate if account type is TAX - # ----------------------------------- - def get_rate(self,arg): - return get_obj('Sales Common').get_rate(arg) + + # Get Tax rate if account type is TAX + # ----------------------------------- + def get_rate(self,arg): + return get_obj('Sales Common').get_rate(arg) - # Load Default Charges - # ---------------------------------------------------------- - def load_default_taxes(self): - return get_obj('Sales Common').load_default_taxes(self) + # Load Default Charges + # ---------------------------------------------------------- + def load_default_taxes(self): + return get_obj('Sales Common').load_default_taxes(self) - # Pull details from other charges master (Get Other Charges) - # ---------------------------------------------------------- - def get_other_charges(self): - return get_obj('Sales Common').get_other_charges(self) - - # Get Lead Details along with its details - # ============================================================== - def get_lead_details1(self, name): - details = sql("select name, lead_name, address_line1, address_line2, city, country, state, pincode, territory, contact_no, mobile_no, email_id from `tabLead` where name = '%s'" %(name), as_dict = 1) - ret = { - 'lead_name' : details and details[0]['lead_name'] or '', - 'address_display' : (details and details[0]['address_line1'] - + (details[0]['address_line2'] and '\n' + details[0]['address_line2'] or '') + '\n' - + details[0]['city'] - + (details[0]['pincode'] and ', ' + details[0]['pincode'] or '') + '\n' - + (details[0]['state'] and details[0]['state']+', ' or '') - + details[0]['country'] + '\nTel: ' + details[0]['contact_no'] + '\n' or '-'), - 'territory' : details and details[0]['territory'] or '', - 'contact_mobile' : details and details[0]['mobile_no'] or '-', - 'contact_email' : details and details[0]['email_id'] or '-' - } - return ret + # Pull details from other charges master (Get Other Charges) + # ---------------------------------------------------------- + def get_other_charges(self): + return get_obj('Sales Common').get_other_charges(self) + + # Get Lead Details along with its details + # ============================================================== + def get_lead_details1(self, name): + details = sql("select name, lead_name, address_line1, address_line2, city, country, state, pincode, territory, contact_no, mobile_no, email_id from `tabLead` where name = '%s'" %(name), as_dict = 1) + ret = { + 'lead_name' : details and details[0]['lead_name'] or '', + 'address_display' : (details and details[0]['address_line1'] + + (details[0]['address_line2'] and '\n' + details[0]['address_line2'] or '') + '\n' + + details[0]['city'] + + (details[0]['pincode'] and ', ' + details[0]['pincode'] or '') + '\n' + + (details[0]['state'] and details[0]['state']+', ' or '') + + details[0]['country'] + '\nTel: ' + details[0]['contact_no'] + '\n' or '-'), + 'territory' : details and details[0]['territory'] or '', + 'contact_mobile' : details and details[0]['mobile_no'] or '-', + 'contact_email' : details and details[0]['email_id'] or '-' + } + return ret - + # GET TERMS AND CONDITIONS # ==================================================================================== - def get_tc_details(self): - return get_obj('Sales Common').get_tc_details(self) + def get_tc_details(self): + return get_obj('Sales Common').get_tc_details(self) - + # VALIDATE # ============================================================================================== - - # Amendment date is necessary if document is amended - # -------------------------------------------------- - def validate_mandatory(self): - if self.doc.amended_from and not self.doc.amendment_date: - msgprint("Please Enter Amendment Date") - raise Exception + + # Amendment date is necessary if document is amended + # -------------------------------------------------- + def validate_mandatory(self): + if self.doc.amended_from and not self.doc.amendment_date: + msgprint("Please Enter Amendment Date") + raise Exception - # Fiscal Year Validation - # ---------------------- - def validate_fiscal_year(self): - get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'Quotation Date') - - # Does not allow same item code to be entered twice - # ------------------------------------------------- - def validate_for_items(self): - chk_dupl_itm = [] - for d in getlist(self.doclist,'quotation_details'): - if [cstr(d.item_code),cstr(d.description)] in chk_dupl_itm: - msgprint("Item %s has been entered twice. Please change description atleast to continue" % d.item_code) - raise Exception - else: - chk_dupl_itm.append([cstr(d.item_code),cstr(d.description)]) + # Fiscal Year Validation + # ---------------------- + def validate_fiscal_year(self): + get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'Quotation Date') + + # Does not allow same item code to be entered twice + # ------------------------------------------------- + def validate_for_items(self): + chk_dupl_itm = [] + for d in getlist(self.doclist,'quotation_details'): + if [cstr(d.item_code),cstr(d.description)] in chk_dupl_itm: + msgprint("Item %s has been entered twice. Please change description atleast to continue" % d.item_code) + raise Exception + else: + chk_dupl_itm.append([cstr(d.item_code),cstr(d.description)]) - #do not allow sales item in maintenance quotation and service item in sales quotation - #----------------------------------------------------------------------------------------------- - def validate_order_type(self): - if self.doc.order_type == 'Maintenance': - for d in getlist(self.doclist, 'quotation_details'): - is_service_item = sql("select is_service_item from `tabItem` where name=%s", d.item_code) - is_service_item = is_service_item and is_service_item[0][0] or 'No' - - if is_service_item == 'No': - msgprint("You can not select non service item "+d.item_code+" in Maintenance Quotation") - raise Exception - else: - for d in getlist(self.doclist, 'quotation_details'): - is_sales_item = sql("select is_sales_item from `tabItem` where name=%s", d.item_code) - is_sales_item = is_sales_item and is_sales_item[0][0] or 'No' - - if is_sales_item == 'No': - msgprint("You can not select non sales item "+d.item_code+" in Sales Quotation") - raise Exception - - #--------------Validation For Last Contact Date----------------- - # ==================================================================================================================== - def set_last_contact_date(self): - #if not self.doc.contact_date_ref: - #self.doc.contact_date_ref=self.doc.contact_date - #self.doc.last_contact_date=self.doc.contact_date_ref - if self.doc.contact_date_ref and self.doc.contact_date_ref != self.doc.contact_date: - if getdate(self.doc.contact_date_ref) < getdate(self.doc.contact_date): - self.doc.last_contact_date=self.doc.contact_date_ref - else: - msgprint("Contact Date Cannot be before Last Contact Date") - raise Exception - #set(self.doc, 'contact_date_ref',self.doc.contact_date) - + #do not allow sales item in maintenance quotation and service item in sales quotation + #----------------------------------------------------------------------------------------------- + def validate_order_type(self): + if self.doc.order_type == 'Maintenance': + for d in getlist(self.doclist, 'quotation_details'): + is_service_item = sql("select is_service_item from `tabItem` where name=%s", d.item_code) + is_service_item = is_service_item and is_service_item[0][0] or 'No' + + if is_service_item == 'No': + msgprint("You can not select non service item "+d.item_code+" in Maintenance Quotation") + raise Exception + else: + for d in getlist(self.doclist, 'quotation_details'): + is_sales_item = sql("select is_sales_item from `tabItem` where name=%s", d.item_code) + is_sales_item = is_sales_item and is_sales_item[0][0] or 'No' + + if is_sales_item == 'No': + msgprint("You can not select non sales item "+d.item_code+" in Sales Quotation") + raise Exception + + #--------------Validation For Last Contact Date----------------- + # ==================================================================================================================== + def set_last_contact_date(self): + #if not self.doc.contact_date_ref: + #self.doc.contact_date_ref=self.doc.contact_date + #self.doc.last_contact_date=self.doc.contact_date_ref + if self.doc.contact_date_ref and self.doc.contact_date_ref != self.doc.contact_date: + if getdate(self.doc.contact_date_ref) < getdate(self.doc.contact_date): + self.doc.last_contact_date=self.doc.contact_date_ref + else: + msgprint("Contact Date Cannot be before Last Contact Date") + raise Exception + #set(self.doc, 'contact_date_ref',self.doc.contact_date) + - # Validate - # -------- - def validate(self): - self.validate_fiscal_year() - self.validate_mandatory() - self.set_last_contact_date() - self.validate_order_type() - self.validate_for_items() - sales_com_obj = get_obj('Sales Common') - sales_com_obj.check_active_sales_items(self) - sales_com_obj.validate_max_discount(self,'quotation_details') #verify whether rate is not greater than max_discount - sales_com_obj.check_conversion_rate(self) - - # Get total in words - dcc = TransactionBase().get_company_currency(self.doc.company) - self.doc.in_words = sales_com_obj.get_total_in_words(dcc, self.doc.rounded_total) - self.doc.in_words_export = sales_com_obj.get_total_in_words(self.doc.currency, self.doc.rounded_total_export) + # Validate + # -------- + def validate(self): + self.validate_fiscal_year() + self.validate_mandatory() + self.set_last_contact_date() + self.validate_order_type() + self.validate_for_items() + sales_com_obj = get_obj('Sales Common') + sales_com_obj.check_active_sales_items(self) + sales_com_obj.validate_max_discount(self,'quotation_details') #verify whether rate is not greater than max_discount + sales_com_obj.check_conversion_rate(self) + + # Get total in words + dcc = TransactionBase().get_company_currency(self.doc.company) + self.doc.in_words = sales_com_obj.get_total_in_words(dcc, self.doc.rounded_total) + self.doc.in_words_export = sales_com_obj.get_total_in_words(self.doc.currency, self.doc.rounded_total_export) - def on_update(self): - # Add to calendar - #if self.doc.contact_date and self.doc.last_contact_date != self.doc.contact_date: - if self.doc.contact_date and self.doc.contact_date_ref != self.doc.contact_date: - if self.doc.contact_by: - self.add_calendar_event() - set(self.doc, 'contact_date_ref',self.doc.contact_date) - - # Set Quotation Status - set(self.doc, 'status', 'Draft') + def on_update(self): + # Add to calendar + #if self.doc.contact_date and self.doc.last_contact_date != self.doc.contact_date: + if self.doc.contact_date and self.doc.contact_date_ref != self.doc.contact_date: + if self.doc.contact_by: + self.add_calendar_event() + set(self.doc, 'contact_date_ref',self.doc.contact_date) + + # Set Quotation Status + set(self.doc, 'status', 'Draft') - # subject for follow - self.doc.subject = '[%(status)s] To %(customer)s worth %(currency)s %(grand_total)s' % self.doc.fields + # subject for follow + self.doc.subject = '[%(status)s] To %(customer)s worth %(currency)s %(grand_total)s' % self.doc.fields - - # Add to Calendar - # ==================================================================================================================== - def add_calendar_event(self): - desc='' - user_lst =[] - if self.doc.customer: - if self.doc.contact_person: - desc = 'Contact '+cstr(self.doc.contact_person) - else: - desc = 'Contact customer '+cstr(self.doc.customer) - elif self.doc.lead: - if self.doc.lead_name: - desc = 'Contact '+cstr(self.doc.lead_name) - else: - desc = 'Contact lead '+cstr(self.doc.lead) - desc = desc+ '.By : ' + cstr(self.doc.contact_by) - - if self.doc.to_discuss: - desc = desc+' To Discuss : ' + cstr(self.doc.to_discuss) - - ev = Document('Event') - ev.description = desc - ev.event_date = self.doc.contact_date - ev.event_hour = '10:00' - ev.event_type = 'Private' - ev.ref_type = 'Enquiry' - ev.ref_name = self.doc.name - ev.save(1) - - user_lst.append(self.doc.owner) - - chk = sql("select t1.name from `tabProfile` t1, `tabSales Person` t2 where t2.email_id = t1.name and t2.name=%s",self.doc.contact_by) - if chk: - user_lst.append(chk[0][0]) - - for d in user_lst: - ch = addchild(ev, 'event_individuals', 'Event User', 0) - ch.person = d - ch.save(1) - - #update enquiry - #------------------ - def update_enquiry(self, flag): - prevdoc='' - for d in getlist(self.doclist, 'quotation_details'): - if d.prevdoc_docname: - prevdoc = d.prevdoc_docname - - if prevdoc: - if flag == 'submit': #on submit - sql("update `tabEnquiry` set status = 'Quotation Sent' where name = %s", prevdoc) - elif flag == 'cancel': #on cancel - sql("update `tabEnquiry` set status = 'Open' where name = %s", prevdoc) - elif flag == 'order lost': #order lost - sql("update `tabEnquiry` set status = 'Enquiry Lost' where name=%s", prevdoc) - elif flag == 'order confirm': #order confirm - sql("update `tabEnquiry` set status='Order Confirmed' where name=%s", prevdoc) - - # declare as order lost - #------------------------- - def declare_order_lost(self,arg): - chk = sql("select t1.name from `tabSales Order` t1, `tabSales Order Detail` t2 where t2.parent = t1.name and t1.docstatus=1 and t2.prevdoc_docname = %s",self.doc.name) - if chk: - msgprint("Sales Order No. "+cstr(chk[0][0])+" is submitted against this Quotation. Thus 'Order Lost' can not be declared against it.") - raise Exception - else: - set(self.doc, 'status', 'Order Lost') - set(self.doc, 'order_lost_reason', arg) - self.update_enquiry('order lost') - return 'true' - - #check if value entered in item table - #-------------------------------------- - def check_item_table(self): - if not getlist(self.doclist, 'quotation_details'): - msgprint("Please enter item details") - raise Exception - - # ON SUBMIT - # ========================================================================= - def on_submit(self): - self.check_item_table() - if not self.doc.amended_from: - set(self.doc, 'message', 'Quotation: '+self.doc.name+' has been sent') - else: - set(self.doc, 'message', 'Quotation has been amended. New Quotation no:'+self.doc.name) - - # Check for Approving Authority - get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total, self) + + # Add to Calendar + # ==================================================================================================================== + def add_calendar_event(self): + desc='' + user_lst =[] + if self.doc.customer: + if self.doc.contact_person: + desc = 'Contact '+cstr(self.doc.contact_person) + else: + desc = 'Contact customer '+cstr(self.doc.customer) + elif self.doc.lead: + if self.doc.lead_name: + desc = 'Contact '+cstr(self.doc.lead_name) + else: + desc = 'Contact lead '+cstr(self.doc.lead) + desc = desc+ '.By : ' + cstr(self.doc.contact_by) + + if self.doc.to_discuss: + desc = desc+' To Discuss : ' + cstr(self.doc.to_discuss) + + ev = Document('Event') + ev.description = desc + ev.event_date = self.doc.contact_date + ev.event_hour = '10:00' + ev.event_type = 'Private' + ev.ref_type = 'Enquiry' + ev.ref_name = self.doc.name + ev.save(1) + + user_lst.append(self.doc.owner) + + chk = sql("select t1.name from `tabProfile` t1, `tabSales Person` t2 where t2.email_id = t1.name and t2.name=%s",self.doc.contact_by) + if chk: + user_lst.append(chk[0][0]) + + for d in user_lst: + ch = addchild(ev, 'event_individuals', 'Event User', 0) + ch.person = d + ch.save(1) + + #update enquiry + #------------------ + def update_enquiry(self, flag): + prevdoc='' + for d in getlist(self.doclist, 'quotation_details'): + if d.prevdoc_docname: + prevdoc = d.prevdoc_docname + + if prevdoc: + if flag == 'submit': #on submit + sql("update `tabEnquiry` set status = 'Quotation Sent' where name = %s", prevdoc) + elif flag == 'cancel': #on cancel + sql("update `tabEnquiry` set status = 'Open' where name = %s", prevdoc) + elif flag == 'order lost': #order lost + sql("update `tabEnquiry` set status = 'Enquiry Lost' where name=%s", prevdoc) + elif flag == 'order confirm': #order confirm + sql("update `tabEnquiry` set status='Order Confirmed' where name=%s", prevdoc) + + # declare as order lost + #------------------------- + def declare_order_lost(self,arg): + chk = sql("select t1.name from `tabSales Order` t1, `tabSales Order Detail` t2 where t2.parent = t1.name and t1.docstatus=1 and t2.prevdoc_docname = %s",self.doc.name) + if chk: + msgprint("Sales Order No. "+cstr(chk[0][0])+" is submitted against this Quotation. Thus 'Order Lost' can not be declared against it.") + raise Exception + else: + set(self.doc, 'status', 'Order Lost') + set(self.doc, 'order_lost_reason', arg) + self.update_enquiry('order lost') + return 'true' + + #check if value entered in item table + #-------------------------------------- + def check_item_table(self): + if not getlist(self.doclist, 'quotation_details'): + msgprint("Please enter item details") + raise Exception + + # ON SUBMIT + # ========================================================================= + def on_submit(self): + self.check_item_table() + if not self.doc.amended_from: + set(self.doc, 'message', 'Quotation: '+self.doc.name+' has been sent') + else: + set(self.doc, 'message', 'Quotation has been amended. New Quotation no:'+self.doc.name) + + # Check for Approving Authority + get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total, self) - # Set Quotation Status - set(self.doc, 'status', 'Submitted') - - #update enquiry status - self.update_enquiry('submit') - - + # Set Quotation Status + set(self.doc, 'status', 'Submitted') + + #update enquiry status + self.update_enquiry('submit') + + # ON CANCEL # ========================================================================== - def on_cancel(self): - set(self.doc, 'message', 'Quotation: '+self.doc.name+' has been cancelled') - - #update enquiry status - self.update_enquiry('cancel') - - set(self.doc,'status','Cancelled') - - + def on_cancel(self): + set(self.doc, 'message', 'Quotation: '+self.doc.name+' has been cancelled') + + #update enquiry status + self.update_enquiry('cancel') + + set(self.doc,'status','Cancelled') + + # SEND SMS # ============================================================================= - def send_sms(self): - if not self.doc.customer_mobile_no: - msgprint("Please enter customer mobile no") - elif not self.doc.message: - msgprint("Please enter the message you want to send") - else: - msgprint(get_obj("SMS Control", "SMS Control").send_sms([self.doc.contact_mobile,], self.doc.message)) - + def send_sms(self): + if not self.doc.customer_mobile_no: + msgprint("Please enter customer mobile no") + elif not self.doc.message: + msgprint("Please enter the message you want to send") + else: + msgprint(get_obj("SMS Control", "SMS Control").send_sms([self.doc.contact_mobile,], self.doc.message)) + # Print other charges # =========================================================================== - def print_other_charges(self,docname): - print_lst = [] - for d in getlist(self.doclist,'other_charges'): - lst1 = [] - lst1.append(d.description) - lst1.append(d.total) - print_lst.append(lst1) - return print_lst - - def update_followup_details(self): - sql("delete from `tabFollow up` where parent = '%s'"%self.doc.name) - for d in getlist(self.doclist, 'follow_up'): - d.save() + def print_other_charges(self,docname): + print_lst = [] + for d in getlist(self.doclist,'other_charges'): + lst1 = [] + lst1.append(d.description) + lst1.append(d.total) + print_lst.append(lst1) + return print_lst + + def update_followup_details(self): + sql("delete from `tabFollow up` where parent = '%s'"%self.doc.name) + for d in getlist(self.doclist, 'follow_up'): + d.save() diff --git a/erpnext/selling/doctype/sales_common/sales_common.js b/erpnext/selling/doctype/sales_common/sales_common.js index 5039fcdc23..57f379cf8d 100644 --- a/erpnext/selling/doctype/sales_common/sales_common.js +++ b/erpnext/selling/doctype/sales_common/sales_common.js @@ -7,11 +7,47 @@ // ============== Load Default Taxes =================== cur_frm.cscript.load_taxes = function(doc, cdt, cdn) { - // run if this is not executed from dt_map... - if(doc.customer) return; - $c_obj([doc],'load_default_taxes','',function(r,rt){ - refresh_field('other_charges'); - }); + // run if this is not executed from dt_map... + if(doc.customer) return; + $c_obj([doc],'load_default_taxes','',function(r,rt){ + refresh_field('other_charges'); + }); +} + + +// Gets called after existing item details are update to fill in +// remaining default values +cur_frm.cscript.load_defaults = function(doc, dt, dn) { + if(!cur_frm.doc.__islocal) { return; } + + doc = locals[doc.doctype][doc.name]; + var fields_to_refresh = LocalDB.set_default_values(doc); + if(fields_to_refresh) { refresh_many(fields_to_refresh); } + + fields_to_refresh = null; + var children = getchildren(cur_frm.cscript.tname, doc.name, cur_frm.cscript.fname); + if(!children) { return; } + for(var i=0; i NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50'; - else - return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_sales_item="Yes" AND tabItem.docstatus != 2 AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50'; + if (doc.order_type == 'Maintenance') + return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_service_item="Yes" AND tabItem.docstatus != 2 AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50'; + else + return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_sales_item="Yes" AND tabItem.docstatus != 2 AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50'; } cur_frm.cscript.item_code = function(doc, cdt, cdn) { - var fname = cur_frm.cscript.fname; - var d = locals[cdt][cdn]; - if (d.item_code) { - if (!doc.company) { - msgprint("Please select company to proceed"); - d.item_code = ''; - refresh_field('item_code', d.name, fname); - } else { - var callback = function(r, rt){ - cur_frm.cscript.recalc(doc, 1); - } - get_server_fields('get_item_details',d.item_code, fname,doc,cdt,cdn,1,callback); - } - } - if(cur_frm.cscript.custom_item_code){ - cur_frm.cscript.custom_item_code(doc, cdt, cdn); - } + var fname = cur_frm.cscript.fname; + var d = locals[cdt][cdn]; + if (d.item_code) { + if (!doc.company) { + msgprint("Please select company to proceed"); + d.item_code = ''; + refresh_field('item_code', d.name, fname); + } else { + var callback = function(r, rt){ + cur_frm.cscript.recalc(doc, 1); + } + get_server_fields('get_item_details',d.item_code, fname,doc,cdt,cdn,1,callback); + } + } + if(cur_frm.cscript.custom_item_code){ + cur_frm.cscript.custom_item_code(doc, cdt, cdn); + } } // *********************** QUANTITY *************************** cur_frm.cscript.qty = function(doc, cdt, cdn) { cur_frm.cscript.recalc(doc, 1); } - + // ************************ DISCOUNT (%) *********************** cur_frm.cscript.adj_rate = function(doc, cdt, cdn) { cur_frm.cscript.recalc(doc, 1); } @@ -171,7 +207,7 @@ cur_frm.cscript.export_rate = function(doc,cdt,cdn) { var cur_rec = locals[cdt][cdn]; var fname = cur_frm.cscript.fname; var tname = cur_frm.cscript.tname; - if(flt(cur_rec.ref_rate)>0 && flt(cur_rec.export_rate)>0 && !flt(cur_rec.adj_rate)) { + if(flt(cur_rec.ref_rate)>0 && flt(cur_rec.export_rate)>0) { var adj_rate = 100 * (1 - (flt(cur_rec.export_rate) / flt(cur_rec.ref_rate))); set_multiple(tname, cur_rec.name, { 'adj_rate': adj_rate }, fname); } @@ -183,59 +219,59 @@ cur_frm.cscript.export_rate = function(doc,cdt,cdn) { // ************* GET OTHER CHARGES BASED ON COMPANY ************* cur_frm.fields_dict.charge.get_query = function(doc) { - return 'SELECT DISTINCT `tabOther Charges`.name FROM `tabOther Charges` WHERE `tabOther Charges`.company = "'+doc.company+'" AND `tabOther Charges`.company is not NULL AND `tabOther Charges`.docstatus != 2 AND `tabOther Charges`.%(key)s LIKE "%s" ORDER BY `tabOther Charges`.name LIMIT 50'; + return 'SELECT DISTINCT `tabOther Charges`.name FROM `tabOther Charges` WHERE `tabOther Charges`.company = "'+doc.company+'" AND `tabOther Charges`.company is not NULL AND `tabOther Charges`.docstatus != 2 AND `tabOther Charges`.%(key)s LIKE "%s" ORDER BY `tabOther Charges`.name LIMIT 50'; } // ********************* Get Charges **************************** cur_frm.cscript['Get Charges'] = function(doc, cdt, cdn) { - $c_obj(make_doclist(doc.doctype,doc.name),'get_other_charges','', function(r, rt) { cur_frm.cscript['Calculate Charges'](doc, cdt, cdn);}); + $c_obj(make_doclist(doc.doctype,doc.name),'get_other_charges','', function(r, rt) { cur_frm.cscript['Calculate Charges'](doc, cdt, cdn);}); } // CALCULATION OF TOTAL AMOUNTS // ======================================================================================================== cur_frm.cscript.recalc = function(doc, n) { - if(!n)n=0; - doc = locals[doc.doctype][doc.name]; - var tname = cur_frm.cscript.tname; - var fname = cur_frm.cscript.fname; - var sales_team = cur_frm.cscript.sales_team_fname; - var other_fname = cur_frm.cscript.other_fname; - - if(!flt(doc.conversion_rate)) { doc.conversion_rate = 1; refresh_field('conversion_rate'); } - if(!flt(doc.plc_conversion_rate)) { doc.plc_conversion_rate = 1; refresh_field('plc_conversion_rate'); } + if(!n)n=0; + doc = locals[doc.doctype][doc.name]; + var tname = cur_frm.cscript.tname; + var fname = cur_frm.cscript.fname; + var sales_team = cur_frm.cscript.sales_team_fname; + var other_fname = cur_frm.cscript.other_fname; + + if(!flt(doc.conversion_rate)) { doc.conversion_rate = 1; refresh_field('conversion_rate'); } + if(!flt(doc.plc_conversion_rate)) { doc.plc_conversion_rate = 1; refresh_field('plc_conversion_rate'); } - if(n > 0) cur_frm.cscript.update_fname_table(doc , tname , fname , n, other_fname); // updates all values in table (i.e. amount, export amount, net total etc.) - - if(flt(doc.net_total) > 0) { - var cl = getchildren('RV Tax Detail', doc.name, other_fname,doc.doctype); - for(var i = 0; i 0) cur_frm.cscript.update_fname_table(doc , tname , fname , n, other_fname); // updates all values in table (i.e. amount, export amount, net total etc.) + + if(flt(doc.net_total) > 0) { + var cl = getchildren('RV Tax Detail', doc.name, other_fname,doc.doctype); + for(var i = 0; i2) alert("You cannot enter more than 2 nos. for division"); - var id1 = cint(row[0].replace(/^\s+|\s+$/g,"")); - var id2 = cint(row[1].replace(/^\s+|\s+$/g,"")); - tax_amount = flt(tax[id1-1].total_amount) / flt(tax[id2-1].total_amount); - } - return tax_amount - } - else if(tax[t].charge_type == 'On Previous Row Total') { - if(flt(print_amt) == 1) { - doc.sales_tax_rate += flt(rate); - refresh_field('sales_tax_rate'); - return - } - var row = cint(tax[t].row_id); - return tax_amount = flt(rate) * (flt(tax[row-1].total_tax_amount)+flt(tax[row-1].total_amount)) / 100; - } + } + else if(tax[t].charge_type == 'On Previous Row Amount'){ + if(flt(print_amt) == 1) { + doc.total_excise_rate += flt(flt(doc.excise_rate) * 0.01 * flt(rate)); + refresh_field('total_excise_rate'); + return + } + var row_no = (tax[t].row_id).toString(); + var row = (row_no).split("+"); // splits the values and stores in an array + for(var r = 0;r2) alert("You cannot enter more than 2 nos. for division"); + var id1 = cint(row[0].replace(/^\s+|\s+$/g,"")); + var id2 = cint(row[1].replace(/^\s+|\s+$/g,"")); + tax_amount = flt(tax[id1-1].total_amount) / flt(tax[id2-1].total_amount); + } + return tax_amount + } + else if(tax[t].charge_type == 'On Previous Row Total') { + if(flt(print_amt) == 1) { + doc.sales_tax_rate += flt(rate); + refresh_field('sales_tax_rate'); + return + } + var row = cint(tax[t].row_id); + return tax_amount = flt(rate) * (flt(tax[row-1].total_tax_amount)+flt(tax[row-1].total_amount)) / 100; + } } // ********************** Functions for inclusive value calc ****************************** @@ -409,8 +450,11 @@ cur_frm.cscript.consider_incl_rate = function(doc, other_fname) { cur_frm.cscript.back_calc_basic_rate = function(doc, tname, fname, child, other_fname) { var get_item_tax_rate = function(item, tax) { if(item.item_tax_rate) { - // Should to replace eval with JSON.parse when item_tax_rate is converted to json string notation - var item_tax = eval('var a='+item.item_tax_rate+';a'); + try { + var item_tax = JSON.parse(item.item_tax_rate); + } catch(exception) { + var item_tax = eval('var a='+item.item_tax_rate+';a'); + } if(item_tax[tax.account_head]!=null) { return flt(item_tax[tax.account_head]); } @@ -524,45 +568,45 @@ cur_frm.cscript.update_fname_table = function(doc , tname , fname , n, other_fna 'base_ref_rate': flt(base_ref_rate) }, fname); } - } - else if(n == 2){ - if(flt(cl[i].ref_rate) > 0) - set_multiple(tname, cl[i].name, {'adj_rate': 100 - flt(flt(cl[i].basic_rate) * 100 / (flt(cl[i].ref_rate) * flt(doc.conversion_rate)))}, fname); - set_multiple(tname, cl[i].name, {'amount': flt(flt(cl[i].qty) * flt(cl[i].basic_rate)), 'export_rate': flt(flt(cl[i].basic_rate) / flt(doc.conversion_rate)), 'export_amount': flt((flt(cl[i].basic_rate) / flt(doc.conversion_rate)) * flt(cl[i].qty)) }, fname); - } - /*else if(n == 3){ - set_multiple(tname, cl[i].name, {'basic_rate': flt(flt(cl[i].export_rate) * flt(doc.conversion_rate))}, fname); - set_multiple(tname, cl[i].name, {'amount' : flt(flt(cl[i].basic_rate) * flt(cl[i].qty)), 'export_amount': flt(flt(cl[i].export_rate) * flt(cl[i].qty))}, fname); - if(cl[i].ref_rate > 0) + } + else if(n == 2){ + if(flt(cl[i].ref_rate) > 0) + set_multiple(tname, cl[i].name, {'adj_rate': 100 - flt(flt(cl[i].basic_rate) * 100 / (flt(cl[i].ref_rate) * flt(doc.conversion_rate)))}, fname); + set_multiple(tname, cl[i].name, {'amount': flt(flt(cl[i].qty) * flt(cl[i].basic_rate)), 'export_rate': flt(flt(cl[i].basic_rate) / flt(doc.conversion_rate)), 'export_amount': flt((flt(cl[i].basic_rate) / flt(doc.conversion_rate)) * flt(cl[i].qty)) }, fname); + } + /*else if(n == 3){ + set_multiple(tname, cl[i].name, {'basic_rate': flt(flt(cl[i].export_rate) * flt(doc.conversion_rate))}, fname); + set_multiple(tname, cl[i].name, {'amount' : flt(flt(cl[i].basic_rate) * flt(cl[i].qty)), 'export_amount': flt(flt(cl[i].export_rate) * flt(cl[i].qty))}, fname); + if(cl[i].ref_rate > 0) set_multiple(tname, cl[i].name, {'adj_rate': 100 - flt(flt(cl[i].export_rate) * 100 / flt(cl[i].ref_rate)), 'base_ref_rate': flt(flt(cl[i].ref_rate) * flt(doc.conversion_rate)) }, fname); - }*/ - net_total += flt(flt(cl[i].qty) * flt(cl[i].basic_rate)); - } - doc.net_total = net_total; - refresh_field('net_total'); + }*/ + net_total += flt(flt(cl[i].qty) * flt(cl[i].basic_rate)); + } + doc.net_total = net_total; + refresh_field('net_total'); } cur_frm.cscript.get_item_wise_tax_detail = function( doc, rate, cl, i, tax, t) { - doc = locals[doc.doctype][doc.name]; - var detail = ''; - detail = cl[i].item_code + " : " + cstr(rate) + NEWLINE; - return detail; + doc = locals[doc.doctype][doc.name]; + var detail = ''; + detail = cl[i].item_code + " : " + cstr(rate) + NEWLINE; + return detail; } // **************** RE-CALCULATE VALUES *************************** -cur_frm.cscript['Re-Calculate Values'] = function(doc, cdt, cdn) { - cur_frm.cscript['Calculate Charges'](doc,cdt,cdn); +cur_frm.cscript['Re-Calculate Values'] = function(doc, cdt, cdn) { + cur_frm.cscript['Calculate Charges'](doc,cdt,cdn); } cur_frm.cscript['Calculate Charges'] = function(doc, cdt, cdn) { - var other_fname = cur_frm.cscript.other_fname; + var other_fname = cur_frm.cscript.other_fname; var cl = getchildren('RV Tax Detail', doc.name, other_fname, doc.doctype); for(var i = 0; i 100){ - alert("Commision rate cannot be greater than 100."); - doc.total_commission = 0; - doc.commission_rate = 0; - } - else - doc.total_commission = doc.net_total * doc.commission_rate / 100; - refresh_many(['total_commission','commission_rate']); + if(doc.commission_rate > 100){ + alert("Commision rate cannot be greater than 100."); + doc.total_commission = 0; + doc.commission_rate = 0; + } + else + doc.total_commission = doc.net_total * doc.commission_rate / 100; + refresh_many(['total_commission','commission_rate']); } // *******Total Commission Trigger (calculates commission rate)********* cur_frm.cscript.total_commission = function(doc, cdt, cdn) { - if(doc.net_total){ - if(doc.net_total < doc.total_commission){ - alert("Total commission cannot be greater than net total."); - doc.total_commission = 0; - doc.commission_rate = 0; - } - else - doc.commission_rate = doc.total_commission * 100 / doc.net_total; - refresh_many(['total_commission','commission_rate']); - } + if(doc.net_total){ + if(doc.net_total < doc.total_commission){ + alert("Total commission cannot be greater than net total."); + doc.total_commission = 0; + doc.commission_rate = 0; + } + else + doc.commission_rate = doc.total_commission * 100 / doc.net_total; + refresh_many(['total_commission','commission_rate']); + } } // Sales Person Allocated % trigger // ============================================================================== cur_frm.cscript.allocated_percentage = function(doc, cdt, cdn) { - var fname = cur_frm.cscript.sales_team_fname; - var d = locals[cdt][cdn]; - if (d.allocated_percentage) { - d.allocated_amount = flt(flt(doc.net_total)*flt(d.allocated_percentage)/100); - refresh_field('allocated_amount', d.name, fname); - } + var fname = cur_frm.cscript.sales_team_fname; + var d = locals[cdt][cdn]; + if (d.allocated_percentage) { + d.allocated_amount = flt(flt(doc.net_total)*flt(d.allocated_percentage)/100); + refresh_field('allocated_amount', d.name, fname); + } } // Client Side Validation // ================================================================================= cur_frm.cscript.validate = function(doc, cdt, cdn) { - cur_frm.cscript.validate_items(doc); - var cl = getchildren('Other Charges', doc.name, 'other_charges'); - for(var i =0;i now() or end_of_life = '0000-00-00') and (is_sales_item = 'Yes' or is_service_item = 'Yes')" %(item_code), as_dict=1) + item = webnotes.conn.sql("select description, item_name, brand, item_group, stock_uom, default_warehouse, default_income_account, default_sales_cost_center, description_html from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life > now() or end_of_life = '0000-00-00') and (is_sales_item = 'Yes' or is_service_item = 'Yes')" % (item_code), as_dict=1) tax = webnotes.conn.sql("select tax_type, tax_rate from `tabItem Tax` where parent = %s" , item_code) t = {} for x in tax: t[x[0]] = flt(x[1]) @@ -130,7 +131,7 @@ class DocType(TransactionBase): 'adj_rate' : 0, 'amount' : 0, 'export_amount' : 0, - 'item_tax_rate' : str(t), + 'item_tax_rate' : json.dumps(t), 'batch_no' : '' } if(obj.doc.price_list_name and item): #this is done to fetch the changed BASIC RATE and REF RATE based on PRICE LIST diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 02290744a3..59f8b8439b 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -14,111 +14,114 @@ $import(SMS Control) // ONLOAD // ================================================================================================ cur_frm.cscript.onload = function(doc, cdt, cdn) { - if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'}); - if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()}); - if(!doc.price_list_currency) set_multiple(cdt, cdn, {price_list_currency: doc.currency, plc_conversion_rate: 1}); - // load default charges - - if(doc.__islocal){ - hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']); - } + if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'}); + if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()}); + if(!doc.price_list_currency) set_multiple(cdt, cdn, {price_list_currency: doc.currency, plc_conversion_rate: 1}); + // load default charges + + if(doc.__islocal){ + hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']); + } + + // defined in sales_common.js + cur_frm.cscript.update_item_details(doc, cdt, cdn); } cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) { - if(doc.__islocal) { - if(doc.quotation) cur_frm.cscript['Pull Quotation Details'](doc,cdt,cdn); - } else { + if(doc.__islocal) { + if(doc.quotation) cur_frm.cscript['Pull Quotation Details'](doc,cdt,cdn); + } else { cur_frm.cscript.load_taxes(doc, cdt, cdn); - } + } } // Refresh //================== cur_frm.cscript.refresh = function(doc, cdt, cdn) { - cur_frm.clear_custom_buttons(); - - if(doc.docstatus==1) { - if(doc.status != 'Stopped') { - cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); - // delivery note - if(doc.per_delivered < 100 && doc.order_type!='Maintenance') - cur_frm.add_custom_button('Make Delivery', cur_frm.cscript['Make Delivery Note']); - - // maintenance - if(doc.per_delivered < 100 && doc.order_type=='Maintenance') { - cur_frm.add_custom_button('Make Maint. Visit', cur_frm.cscript['Make Maintenance Visit']); - cur_frm.add_custom_button('Make Maint. Schedule', cur_frm.cscript['Make Maintenance Schedule']); - } + cur_frm.clear_custom_buttons(); + + if(doc.docstatus==1) { + if(doc.status != 'Stopped') { + cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); + // delivery note + if(doc.per_delivered < 100 && doc.order_type!='Maintenance') + cur_frm.add_custom_button('Make Delivery', cur_frm.cscript['Make Delivery Note']); + + // maintenance + if(doc.per_delivered < 100 && doc.order_type=='Maintenance') { + cur_frm.add_custom_button('Make Maint. Visit', cur_frm.cscript['Make Maintenance Visit']); + cur_frm.add_custom_button('Make Maint. Schedule', cur_frm.cscript['Make Maintenance Schedule']); + } - // indent - if(doc.order_type != 'Maintenance') - cur_frm.add_custom_button('Make ' + get_doctype_label('Indent'), cur_frm.cscript['Make Purchase Requisition']); - - // sales invoice - if(doc.per_billed < 100) - cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Sales Invoice']); - - // stop - if(doc.per_delivered < 100 || doc.per_billed < 100) - cur_frm.add_custom_button('Stop!', cur_frm.cscript['Stop Sales Order']); - } else { - - // un-stop - cur_frm.add_custom_button('Unstop', cur_frm.cscript['Unstop Sales Order']); - } - - unhide_field(['Repair Sales Order', 'Send SMS', 'message', 'customer_mobile_no']) - } else { - hide_field(['Repair Sales Order', 'Send SMS', 'message', 'customer_mobile_no']) - } + // indent + if(doc.order_type != 'Maintenance') + cur_frm.add_custom_button('Make ' + get_doctype_label('Indent'), cur_frm.cscript['Make Purchase Requisition']); + + // sales invoice + if(doc.per_billed < 100) + cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Sales Invoice']); + + // stop + if(doc.per_delivered < 100 || doc.per_billed < 100) + cur_frm.add_custom_button('Stop!', cur_frm.cscript['Stop Sales Order']); + } else { + + // un-stop + cur_frm.add_custom_button('Unstop', cur_frm.cscript['Unstop Sales Order']); + } + + unhide_field(['Repair Sales Order', 'Send SMS', 'message', 'customer_mobile_no']) + } else { + hide_field(['Repair Sales Order', 'Send SMS', 'message', 'customer_mobile_no']) + } } //customer cur_frm.cscript.customer = function(doc,dt,dn) { - var callback = function(r,rt) { - var doc = locals[cur_frm.doctype][cur_frm.docname]; - get_server_fields('get_shipping_address',doc.customer,'',doc, dt, dn, 0); - cur_frm.refresh(); - } + var callback = function(r,rt) { + var doc = locals[cur_frm.doctype][cur_frm.docname]; + get_server_fields('get_shipping_address',doc.customer,'',doc, dt, dn, 0); + cur_frm.refresh(); + } - if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_address', '', callback); - if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']); + if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_address', '', callback); + if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']); } -cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { - if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1); +cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { + if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1); } cur_frm.fields_dict.customer_address.on_new = function(dn) { - locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; - locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; + locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; + locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; } cur_frm.fields_dict.contact_person.on_new = function(dn) { - locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; - locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; + locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; + locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; } cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) { - return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; + return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) { - return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; + return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } cur_frm.cscript['Pull Quotation Details'] = function(doc,dt,dn) { - var callback = function(r,rt){ - var doc = locals[cur_frm.doctype][cur_frm.docname]; - if(r.message){ - doc.quotation_no = r.message; - if(doc.quotation_no) { - unhide_field(['quotation_date','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']); - if(doc.customer) get_server_fields('get_shipping_address',doc.customer,'',doc, dt, dn, 0); - } - cur_frm.refresh(); - } - } + var callback = function(r,rt){ + var doc = locals[cur_frm.doctype][cur_frm.docname]; + if(r.message){ + doc.quotation_no = r.message; + if(doc.quotation_no) { + unhide_field(['quotation_date','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']); + if(doc.customer) get_server_fields('get_shipping_address',doc.customer,'',doc, dt, dn, 0); + } + cur_frm.refresh(); + } + } $c_obj(make_doclist(doc.doctype, doc.name),'pull_quotation_details','',callback); } @@ -126,10 +129,10 @@ cur_frm.cscript['Pull Quotation Details'] = function(doc,dt,dn) { //================ create new contact ============================================================================ cur_frm.cscript.new_contact = function(){ - tn = createLocal('Contact'); - locals['Contact'][tn].is_customer = 1; - if(doc.customer) locals['Contact'][tn].customer = doc.customer; - loaddoc('Contact', tn); + tn = createLocal('Contact'); + locals['Contact'][tn].is_customer = 1; + if(doc.customer) locals['Contact'][tn].customer = doc.customer; + loaddoc('Contact', tn); } // DOCTYPE TRIGGERS @@ -138,35 +141,35 @@ cur_frm.cscript.new_contact = function(){ /* // ***************** get shipping address based on customer selected ***************** cur_frm.fields_dict['ship_det_no'].get_query = function(doc, cdt, cdn) { - return 'SELECT `tabShipping Address`.`name`, `tabShipping Address`.`ship_to`, `tabShipping Address`.`shipping_address` FROM `tabShipping Address` WHERE `tabShipping Address`.customer = "'+ doc.customer+'" AND `tabShipping Address`.`docstatus` != 2 AND `tabShipping Address`.`name` LIKE "%s" ORDER BY `tabShipping Address`.name ASC LIMIT 50'; + return 'SELECT `tabShipping Address`.`name`, `tabShipping Address`.`ship_to`, `tabShipping Address`.`shipping_address` FROM `tabShipping Address` WHERE `tabShipping Address`.customer = "'+ doc.customer+'" AND `tabShipping Address`.`docstatus` != 2 AND `tabShipping Address`.`name` LIKE "%s" ORDER BY `tabShipping Address`.name ASC LIMIT 50'; } */ // ***************** Get project name ***************** cur_frm.fields_dict['project_name'].get_query = function(doc, cdt, cdn) { - var cond = ''; - if(doc.customer) cond = '(`tabProject`.customer = "'+doc.customer+'" OR IFNULL(`tabProject`.customer,"")="") AND'; - return repl('SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND %(cond)s `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50', {cond:cond}); + var cond = ''; + if(doc.customer) cond = '(`tabProject`.customer = "'+doc.customer+'" OR IFNULL(`tabProject`.customer,"")="") AND'; + return repl('SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND %(cond)s `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50', {cond:cond}); } //---- get customer details ---------------------------- cur_frm.cscript.project_name = function(doc,cdt,cdn){ - $c_obj(make_doclist(doc.doctype, doc.name),'pull_project_customer','', function(r,rt){ - refresh_many(['customer','customer_name', 'customer_address', 'contact_person', 'territory', 'contact_no', 'email_id', 'customer_group']); - }); - + $c_obj(make_doclist(doc.doctype, doc.name),'pull_project_customer','', function(r,rt){ + refresh_many(['customer','customer_name', 'customer_address', 'contact_person', 'territory', 'contact_no', 'email_id', 'customer_group']); + }); + } // *************** Customized link query for QUOTATION ***************************** cur_frm.fields_dict['quotation_no'].get_query = function(doc) { - var cond=''; - if(doc.order_type) cond = ' ifnull(`tabQuotation`.order_type, "") = "'+doc.order_type+'" and'; - if(doc.customer) cond += ' ifnull(`tabQuotation`.customer, "") = "'+doc.customer+'" and'; - - return repl('SELECT DISTINCT name, customer, transaction_date FROM `tabQuotation` WHERE `tabQuotation`.company = "' + doc.company + '" and `tabQuotation`.`docstatus` = 1 and `tabQuotation`.status != "Order Lost" and %(cond)s `tabQuotation`.%(key)s LIKE "%s" ORDER BY `tabQuotation`.`name` DESC LIMIT 50', {cond:cond}); + var cond=''; + if(doc.order_type) cond = ' ifnull(`tabQuotation`.order_type, "") = "'+doc.order_type+'" and'; + if(doc.customer) cond += ' ifnull(`tabQuotation`.customer, "") = "'+doc.customer+'" and'; + + return repl('SELECT DISTINCT name, customer, transaction_date FROM `tabQuotation` WHERE `tabQuotation`.company = "' + doc.company + '" and `tabQuotation`.`docstatus` = 1 and `tabQuotation`.status != "Order Lost" and %(cond)s `tabQuotation`.%(key)s LIKE "%s" ORDER BY `tabQuotation`.`name` DESC LIMIT 50', {cond:cond}); } @@ -175,164 +178,164 @@ cur_frm.fields_dict['quotation_no'].get_query = function(doc) { // ***************** Get available qty in warehouse of item selected **************** cur_frm.cscript.reserved_warehouse = function(doc, cdt , cdn) { - var d = locals[cdt][cdn]; - if (d.reserved_warehouse) { - arg = "{'item_code':'" + d.item_code + "','warehouse':'" + d.reserved_warehouse +"'}"; - get_server_fields('get_available_qty',arg,'sales_order_details',doc,cdt,cdn,1); - } + var d = locals[cdt][cdn]; + if (d.reserved_warehouse) { + arg = "{'item_code':'" + d.item_code + "','warehouse':'" + d.reserved_warehouse +"'}"; + get_server_fields('get_available_qty',arg,'sales_order_details',doc,cdt,cdn,1); + } } //----------- make maintenance schedule---------- cur_frm.cscript['Make Maintenance Schedule'] = function() { - var doc = cur_frm.doc; + var doc = cur_frm.doc; - if (doc.docstatus == 1) { - $c_obj(make_doclist(doc.doctype, doc.name),'check_maintenance_schedule','', - function(r,rt){ - if(r.message == 'No'){ - n = createLocal("Maintenance Schedule"); - $c('dt_map', args={ - 'docs':compress_doclist([locals["Maintenance Schedule"][n]]), - 'from_doctype':'Sales Order', - 'to_doctype':'Maintenance Schedule', - 'from_docname':doc.name, - 'from_to_list':"[['Sales Order', 'Maintenance Schedule'], ['Sales Order Detail', 'Item Maintenance Detail']]" - } - , function(r,rt) { - loaddoc("Maintenance Schedule", n); - } - ); - } - else{ - msgprint("You have already created Maintenance Schedule against this Sales Order"); - } - } - ); - } + if (doc.docstatus == 1) { + $c_obj(make_doclist(doc.doctype, doc.name),'check_maintenance_schedule','', + function(r,rt){ + if(r.message == 'No'){ + n = createLocal("Maintenance Schedule"); + $c('dt_map', args={ + 'docs':compress_doclist([locals["Maintenance Schedule"][n]]), + 'from_doctype':'Sales Order', + 'to_doctype':'Maintenance Schedule', + 'from_docname':doc.name, + 'from_to_list':"[['Sales Order', 'Maintenance Schedule'], ['Sales Order Detail', 'Item Maintenance Detail']]" + } + , function(r,rt) { + loaddoc("Maintenance Schedule", n); + } + ); + } + else{ + msgprint("You have already created Maintenance Schedule against this Sales Order"); + } + } + ); + } } //------------ make maintenance visit ------------ cur_frm.cscript['Make Maintenance Visit'] = function() { - var doc = cur_frm.doc; + var doc = cur_frm.doc; - if (doc.docstatus == 1) { - $c_obj(make_doclist(doc.doctype, doc.name),'check_maintenance_visit','', - function(r,rt){ - if(r.message == 'No'){ - n = createLocal("Maintenance Visit"); - $c('dt_map', args={ - 'docs':compress_doclist([locals["Maintenance Visit"][n]]), - 'from_doctype':'Sales Order', - 'to_doctype':'Maintenance Visit', - 'from_docname':doc.name, - 'from_to_list':"[['Sales Order', 'Maintenance Visit'], ['Sales Order Detail', 'Maintenance Visit Detail']]" - } - , function(r,rt) { - loaddoc("Maintenance Visit", n); - } - ); - } - else{ - msgprint("You have already completed maintenance against this Sales Order"); - } - } - ); - } + if (doc.docstatus == 1) { + $c_obj(make_doclist(doc.doctype, doc.name),'check_maintenance_visit','', + function(r,rt){ + if(r.message == 'No'){ + n = createLocal("Maintenance Visit"); + $c('dt_map', args={ + 'docs':compress_doclist([locals["Maintenance Visit"][n]]), + 'from_doctype':'Sales Order', + 'to_doctype':'Maintenance Visit', + 'from_docname':doc.name, + 'from_to_list':"[['Sales Order', 'Maintenance Visit'], ['Sales Order Detail', 'Maintenance Visit Detail']]" + } + , function(r,rt) { + loaddoc("Maintenance Visit", n); + } + ); + } + else{ + msgprint("You have already completed maintenance against this Sales Order"); + } + } + ); + } } // make indent // ================================================================================================ cur_frm.cscript['Make Purchase Requisition'] = function() { - var doc = cur_frm.doc; - if (doc.docstatus == 1) { - n = createLocal("Indent"); - $c('dt_map', args={ - 'docs':compress_doclist([locals["Indent"][n]]), - 'from_doctype':'Sales Order', - 'to_doctype':'Indent', - 'from_docname':doc.name, - 'from_to_list':"[['Sales Order', 'Indent'], ['Sales Order Detail', 'Indent Detail']]" - } - , function(r,rt) { - loaddoc("Indent", n); - } - ); - } + var doc = cur_frm.doc; + if (doc.docstatus == 1) { + n = createLocal("Indent"); + $c('dt_map', args={ + 'docs':compress_doclist([locals["Indent"][n]]), + 'from_doctype':'Sales Order', + 'to_doctype':'Indent', + 'from_docname':doc.name, + 'from_to_list':"[['Sales Order', 'Indent'], ['Sales Order Detail', 'Indent Detail']]" + } + , function(r,rt) { + loaddoc("Indent", n); + } + ); + } } // MAKE DELIVERY NOTE // ================================================================================================ cur_frm.cscript['Make Delivery Note'] = function() { - var doc = cur_frm.doc; - if (doc.docstatus == 1) { - n = createLocal("Delivery Note"); - $c('dt_map', args={ - 'docs':compress_doclist([locals["Delivery Note"][n]]), - 'from_doctype':'Sales Order', - 'to_doctype':'Delivery Note', - 'from_docname':doc.name, - 'from_to_list':"[['Sales Order', 'Delivery Note'], ['Sales Order Detail', 'Delivery Note Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]" - } - , function(r,rt) { - loaddoc("Delivery Note", n); - } - ); - } + var doc = cur_frm.doc; + if (doc.docstatus == 1) { + n = createLocal("Delivery Note"); + $c('dt_map', args={ + 'docs':compress_doclist([locals["Delivery Note"][n]]), + 'from_doctype':'Sales Order', + 'to_doctype':'Delivery Note', + 'from_docname':doc.name, + 'from_to_list':"[['Sales Order', 'Delivery Note'], ['Sales Order Detail', 'Delivery Note Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]" + } + , function(r,rt) { + loaddoc("Delivery Note", n); + } + ); + } } // MAKE SALES INVOICE // ================================================================================================ cur_frm.cscript['Make Sales Invoice'] = function() { - var doc = cur_frm.doc; + var doc = cur_frm.doc; - n = createLocal('Receivable Voucher'); - $c('dt_map', args={ - 'docs':compress_doclist([locals['Receivable Voucher'][n]]), - 'from_doctype':doc.doctype, - 'to_doctype':'Receivable Voucher', - 'from_docname':doc.name, - 'from_to_list':"[['Sales Order','Receivable Voucher'],['Sales Order Detail','RV Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]" - }, function(r,rt) { - loaddoc('Receivable Voucher', n); - } - ); + n = createLocal('Receivable Voucher'); + $c('dt_map', args={ + 'docs':compress_doclist([locals['Receivable Voucher'][n]]), + 'from_doctype':doc.doctype, + 'to_doctype':'Receivable Voucher', + 'from_docname':doc.name, + 'from_to_list':"[['Sales Order','Receivable Voucher'],['Sales Order Detail','RV Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]" + }, function(r,rt) { + loaddoc('Receivable Voucher', n); + } + ); } // STOP SALES ORDER // ================================================================================================== cur_frm.cscript['Stop Sales Order'] = function() { - var doc = cur_frm.doc; + var doc = cur_frm.doc; - var check = confirm("Are you sure you want to STOP " + doc.name); + var check = confirm("Are you sure you want to STOP " + doc.name); - if (check) { - $c('runserverobj', args={'method':'stop_sales_order', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) { - cur_frm.refresh(); - }); - } + if (check) { + $c('runserverobj', args={'method':'stop_sales_order', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) { + cur_frm.refresh(); + }); + } } // UNSTOP SALES ORDER // ================================================================================================== cur_frm.cscript['Unstop Sales Order'] = function() { - var doc = cur_frm.doc; + var doc = cur_frm.doc; - var check = confirm("Are you sure you want to UNSTOP " + doc.name); + var check = confirm("Are you sure you want to UNSTOP " + doc.name); - if (check) { - $c('runserverobj', args={'method':'unstop_sales_order', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) { - cur_frm.refresh(); - }); - } + if (check) { + $c('runserverobj', args={'method':'unstop_sales_order', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) { + cur_frm.refresh(); + }); + } } //get query select Territory //======================================================================================================================= cur_frm.fields_dict['territory'].get_query = function(doc,cdt,cdn) { - return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s" ORDER BY `tabTerritory`.`name` ASC LIMIT 50'; + return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s" ORDER BY `tabTerritory`.`name` ASC LIMIT 50'; } $import(Notification Control) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index aefe666940..225e0dc095 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -85,8 +85,18 @@ class DocType(TransactionBase): # ================================================================================ # Get Item Details # ---------------- - def get_item_details(self, item_code): - return get_obj('Sales Common').get_item_details(item_code, self) + def get_item_details(self, item_code=None): + if item_code: + return get_obj('Sales Common').get_item_details(item_code, self) + else: + obj = get_obj('Sales Common') + for doc in self.doclist: + if doc.fields.get('item_code'): + ret = obj.get_item_details(doc.item_code, self) + for r in ret: + if not doc.fields.get(r): + doc.fields[r] = ret[r] + # Re-calculates Basic Rate & amount based on Price List Selected # -------------------------------------------------------------- diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py index 93273ba7aa..6524f5cc0a 100644 --- a/erpnext/setup/doctype/email_digest/email_digest.py +++ b/erpnext/setup/doctype/email_digest/email_digest.py @@ -763,7 +763,7 @@ def send(): """ edigest_list = webnotes.conn.sql(""" SELECT name FROM `tabEmail Digest` - WHERE enabled=1 + WHERE enabled=1 and docstatus<2 """, as_list=1) from webnotes.model.code import get_obj diff --git a/erpnext/setup/doctype/price_list/price_list.py b/erpnext/setup/doctype/price_list/price_list.py index 23a43e7400..c4bab3b787 100644 --- a/erpnext/setup/doctype/price_list/price_list.py +++ b/erpnext/setup/doctype/price_list/price_list.py @@ -85,8 +85,9 @@ class DocType: from webnotes.utils import file_manager fn, content = file_manager.get_file(fid) - - if not type(content) == str: + + # NOTE: Don't know why this condition exists + if not isinstance(content, basestring) and hasattr(content, 'tostring'): content = content.tostring() - return content \ No newline at end of file + return content diff --git a/erpnext/setup/doctype/upload_accounts_transactions/upload_accounts_transactions.py b/erpnext/setup/doctype/upload_accounts_transactions/upload_accounts_transactions.py index 2028e5fe60..35564bb11a 100644 --- a/erpnext/setup/doctype/upload_accounts_transactions/upload_accounts_transactions.py +++ b/erpnext/setup/doctype/upload_accounts_transactions/upload_accounts_transactions.py @@ -96,8 +96,9 @@ class DocType: from webnotes.utils import file_manager fn, content = file_manager.get_file(fid) - - if not type(content) == str: + + # NOTE: Don't know why this condition exists + if not isinstance(content, basestring) and hasattr(content, 'tostring'): content = content.tostring() return content diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index 59dff8a954..4099174d5d 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -11,93 +11,97 @@ $import(SMS Control) // ONLOAD // ================================================================================================ cur_frm.cscript.onload = function(doc, dt, dn) { - if(!doc.status) set_multiple(dt,dn,{status:'Draft'}); - if(!doc.transaction_date) set_multiple(dt,dn,{transaction_date:get_today()}); - if(!doc.posting_date) set_multiple(dt,dn,{posting_date:get_today()}); - if(doc.__islocal && doc.customer) cur_frm.cscript.pull_item_details_onload(doc,dt,dn); - if(!doc.price_list_currency) { - set_multiple(dt, dn, {price_list_currency: doc.currency, plc_conversion_rate:1}); -} - if(!doc.posting_time) doc.posting_time = wn.datetime.get_cur_time() - - if(doc.__islocal){ - hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); - } + if(!doc.status) set_multiple(dt,dn,{status:'Draft'}); + if(!doc.transaction_date) set_multiple(dt,dn,{transaction_date:get_today()}); + if(!doc.posting_date) set_multiple(dt,dn,{posting_date:get_today()}); + if(doc.__islocal && doc.customer) cur_frm.cscript.pull_item_details_onload(doc,dt,dn); + if(!doc.price_list_currency) { + set_multiple(dt, dn, {price_list_currency: doc.currency, plc_conversion_rate:1}); + } + if(!doc.posting_time) doc.posting_time = wn.datetime.get_cur_time() + + if(doc.__islocal){ + hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); + } + + // defined in sales_common.js + //cur_frm.cscript.update_item_details(doc, cdt, cdn); + } cur_frm.cscript.onload_post_render = function(doc, dt, dn) { - // load default charges - if(doc.__islocal && !getchildren('RV Tax Detail', doc.name, 'other_charges', doc.doctype).length) - cur_frm.cscript.load_taxes(doc, cdt, cdn); + // load default charges + if(doc.__islocal && !getchildren('RV Tax Detail', doc.name, 'other_charges', doc.doctype).length) + cur_frm.cscript.load_taxes(doc, cdt, cdn); } // REFRESH // ================================================================================================ cur_frm.cscript.refresh = function(doc, cdt, cdn) { - cur_frm.clear_custom_buttons(); + cur_frm.clear_custom_buttons(); - if(doc.per_billed < 100 && doc.docstatus==1) cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Sales Invoice']); - - if(doc.per_installed < 100 && doc.docstatus==1) cur_frm.add_custom_button('Make Installation Note', cur_frm.cscript['Make Installation Note']); + if(doc.per_billed < 100 && doc.docstatus==1) cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Sales Invoice']); + + if(doc.per_installed < 100 && doc.docstatus==1) cur_frm.add_custom_button('Make Installation Note', cur_frm.cscript['Make Installation Note']); - if (doc.docstatus!=1) { - hide_field(['SMS', 'Send SMS', 'message', 'customer_mobile_no', 'Repair Delivery Note']); - } else { - cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); - unhide_field(['SMS','Send SMS', 'message', 'customer_mobile_no', 'Repair Delivery Note']); - } + if (doc.docstatus!=1) { + hide_field(['SMS', 'Send SMS', 'message', 'customer_mobile_no', 'Repair Delivery Note']); + } else { + cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); + unhide_field(['SMS','Send SMS', 'message', 'customer_mobile_no', 'Repair Delivery Note']); + } - if(doc.docstatus==1) { - cur_frm.add_custom_button('Make Packing Slip', cur_frm.cscript['Make Packing Slip']); - } - - set_print_hide(doc, cdt, cdn); + if(doc.docstatus==1) { + cur_frm.add_custom_button('Make Packing Slip', cur_frm.cscript['Make Packing Slip']); + } + + set_print_hide(doc, cdt, cdn); } //customer -cur_frm.cscript.customer = function(doc,dt,dn) { - var callback = function(r,rt) { - var doc = locals[cur_frm.doctype][cur_frm.docname]; - cur_frm.refresh(); - } - if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_shipping_address', '', callback); - if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']); +cur_frm.cscript.customer = function(doc,dt,dn) { + var callback = function(r,rt) { + var doc = locals[cur_frm.doctype][cur_frm.docname]; + cur_frm.refresh(); + } + if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_shipping_address', '', callback); + if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']); } -cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { - if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1); +cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { + if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1); } cur_frm.fields_dict.customer_address.on_new = function(dn) { - locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; - locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; + locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; + locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; } cur_frm.fields_dict.contact_person.on_new = function(dn) { - locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; - locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; + locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer; + locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name; } cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) { - return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; + return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) { - return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; + return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } cur_frm.cscript['Get Items'] = function(doc,dt,dn) { - var callback = function(r,rt){ - var doc = locals[cur_frm.doctype][cur_frm.docname]; - if(r.message){ - doc.sales_order_no = r.message; - if(doc.sales_order_no) { - unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); - } - refresh_many(['delivery_note_details','customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); - } - } + var callback = function(r,rt){ + var doc = locals[cur_frm.doctype][cur_frm.docname]; + if(r.message){ + doc.sales_order_no = r.message; + if(doc.sales_order_no) { + unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); + } + refresh_many(['delivery_note_details','customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); + } + } $c_obj(make_doclist(doc.doctype, doc.name),'pull_sales_order_details','',callback); } @@ -105,45 +109,45 @@ cur_frm.cscript['Get Items'] = function(doc,dt,dn) { //RV-DN : Pull Item details - UOM, Item Group as it was not in Sales Invoice //--------------------------------------------------------------------- cur_frm.cscript.pull_item_details_onload = function(doc,dt,dn){ - var callback = function(r,rt){ - refresh_field('delivery_note_details'); - cur_frm.cscript.customer(doc,dt,dn); - } - $c_obj(make_doclist(dt,dn),'set_item_details','',callback); + var callback = function(r,rt){ + refresh_field('delivery_note_details'); + cur_frm.cscript.customer(doc,dt,dn); + } + $c_obj(make_doclist(dt,dn),'set_item_details','',callback); } //================ create new contact ============================================================================ cur_frm.cscript.new_contact = function(){ - tn = createLocal('Contact'); - locals['Contact'][tn].is_customer = 1; - if(doc.customer) locals['Contact'][tn].customer = doc.customer; - loaddoc('Contact', tn); + tn = createLocal('Contact'); + locals['Contact'][tn].is_customer = 1; + if(doc.customer) locals['Contact'][tn].customer = doc.customer; + loaddoc('Contact', tn); } //========================= Overloaded query for link batch_no ============================================================= cur_frm.fields_dict['delivery_note_details'].grid.get_field('batch_no').get_query= function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - if(d.item_code){ - return "SELECT tabBatch.name, tabBatch.description FROM tabBatch WHERE tabBatch.docstatus != 2 AND tabBatch.item = '"+ d.item_code +"' AND `tabBatch`.`name` like '%s' ORDER BY `tabBatch`.`name` DESC LIMIT 50" - } - else{ - alert("Please enter Item Code."); - } + var d = locals[cdt][cdn]; + if(d.item_code){ + return "SELECT tabBatch.name, tabBatch.description FROM tabBatch WHERE tabBatch.docstatus != 2 AND tabBatch.item = '"+ d.item_code +"' AND `tabBatch`.`name` like '%s' ORDER BY `tabBatch`.`name` DESC LIMIT 50" + } + else{ + alert("Please enter Item Code."); + } } // ***************** Get project name ***************** cur_frm.fields_dict['project_name'].get_query = function(doc, cdt, cdn) { - var cond = ''; - if(doc.customer) cond = '(`tabProject`.customer = "'+doc.customer+'" OR IFNULL(`tabProject`.customer,"")="") AND'; - return repl('SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND %(cond)s `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50', {cond:cond}); + var cond = ''; + if(doc.customer) cond = '(`tabProject`.customer = "'+doc.customer+'" OR IFNULL(`tabProject`.customer,"")="") AND'; + return repl('SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND %(cond)s `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50', {cond:cond}); } /* //---- get customer details ---------------------------- cur_frm.cscript.project_name = function(doc,cdt,cdn){ - $c_obj(make_doclist(doc.doctype, doc.name),'pull_project_customer','', function(r,rt){ - refresh_many(['customer','customer_name', 'customer_address', 'contact_person', 'territory', 'contact_no', 'email_id', 'customer_group']); - }); + $c_obj(make_doclist(doc.doctype, doc.name),'pull_project_customer','', function(r,rt){ + refresh_many(['customer','customer_name', 'customer_address', 'contact_person', 'territory', 'contact_no', 'email_id', 'customer_group']); + }); } */ @@ -154,23 +158,23 @@ cur_frm.cscript.project_name = function(doc,cdt,cdn){ /* var cfn_set_fields = function(doc, cdt, cdn) { var supplier_field_list = ['Supplier','supplier','supplier_address']; - var customer_field_list = ['Customer','customer','customer_name','customer_address','territory','customer_group','Business Associate','sales_partner','commission_rate','total_commission','sales_order_no','Get Items']; - if (doc.delivery_type == 'Rejected' && doc.purchase_receipt_no) { - unhide_field('purchase_receipt_no'); - unhide_field(supplier_field_list); - hide_field(customer_field_list); - get_field(doc.doctype, 'delivery_type' , doc.name).permlevel = 1; - } - else if (doc.delivery_type == 'Subcontract' && doc.purchase_order_no) { - unhide_field('purchase_order_no'); - unhide_field(supplier_field_list); - hide_field(cutomer_field_list); - get_field(doc.doctype, 'delivery_type' , doc.name).permlevel = 1; - } - else if (doc.delivery_type == 'Sample') unhide_field('to_warehouse'); - else get_field(doc.doctype, 'delivery_type' , doc.name).permlevel = 0; - - + var customer_field_list = ['Customer','customer','customer_name','customer_address','territory','customer_group','Business Associate','sales_partner','commission_rate','total_commission','sales_order_no','Get Items']; + if (doc.delivery_type == 'Rejected' && doc.purchase_receipt_no) { + unhide_field('purchase_receipt_no'); + unhide_field(supplier_field_list); + hide_field(customer_field_list); + get_field(doc.doctype, 'delivery_type' , doc.name).permlevel = 1; + } + else if (doc.delivery_type == 'Subcontract' && doc.purchase_order_no) { + unhide_field('purchase_order_no'); + unhide_field(supplier_field_list); + hide_field(cutomer_field_list); + get_field(doc.doctype, 'delivery_type' , doc.name).permlevel = 1; + } + else if (doc.delivery_type == 'Sample') unhide_field('to_warehouse'); + else get_field(doc.doctype, 'delivery_type' , doc.name).permlevel = 0; + + } */ @@ -181,14 +185,14 @@ var cfn_set_fields = function(doc, cdt, cdn) { /* // ***************** Get Contact Person based on customer selected ***************** cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) { - return 'SELECT `tabContact`.contact_name FROM `tabContact` WHERE ((`tabContact`.is_customer = 1 AND `tabContact`.customer = "'+ doc.customer+'") or (`tabContact`.is_sales_partner = 1 AND `tabContact`.sales_partner = "'+ doc.sales_partner+'")) AND `tabContact`.docstatus != 2 AND `tabContact`.contact_name LIKE "%s" ORDER BY `tabContact`.contact_name ASC LIMIT 50'; + return 'SELECT `tabContact`.contact_name FROM `tabContact` WHERE ((`tabContact`.is_customer = 1 AND `tabContact`.customer = "'+ doc.customer+'") or (`tabContact`.is_sales_partner = 1 AND `tabContact`.sales_partner = "'+ doc.sales_partner+'")) AND `tabContact`.docstatus != 2 AND `tabContact`.contact_name LIKE "%s" ORDER BY `tabContact`.contact_name ASC LIMIT 50'; } */ /* // ***************** get shipping address based on customer selected ***************** cur_frm.fields_dict['ship_det_no'].get_query = function(doc, cdt, cdn) { - return 'SELECT `tabShipping Address`.`name`, `tabShipping Address`.`ship_to`, `tabShipping Address`.`shipping_address` FROM `tabShipping Address` WHERE `tabShipping Address`.customer = "'+ doc.customer+'" AND `tabShipping Address`.`docstatus` != 2 AND `tabShipping Address`.`name` LIKE "%s" ORDER BY `tabShipping Address`.name ASC LIMIT 50'; + return 'SELECT `tabShipping Address`.`name`, `tabShipping Address`.`ship_to`, `tabShipping Address`.`shipping_address` FROM `tabShipping Address` WHERE `tabShipping Address`.customer = "'+ doc.customer+'" AND `tabShipping Address`.`docstatus` != 2 AND `tabShipping Address`.`name` LIKE "%s" ORDER BY `tabShipping Address`.name ASC LIMIT 50'; } */ @@ -196,179 +200,179 @@ cur_frm.fields_dict['ship_det_no'].get_query = function(doc, cdt, cdn) { // *************** Customized link query for SALES ORDER based on customer and currency***************************** cur_frm.fields_dict['sales_order_no'].get_query = function(doc) { - doc = locals[this.doctype][this.docname]; - var cond = ''; - - if(doc.customer) { - if(doc.currency) cond = '`tabSales Order`.customer = "'+doc.customer+'" and `tabSales Order`.currency = "'+doc.currency+'" and'; - else cond = '`tabSales Order`.customer = "'+doc.customer+'" and'; - } - else { - if(doc.currency) cond = '`tabSales Order`.currency = "'+doc.currency+'" and'; - else cond = ''; - } - if(doc.project_name){ - cond += '`tabSales Order`.project_name ="'+doc.project_name+'"'; - } - return repl('SELECT DISTINCT `tabSales Order`.`name` FROM `tabSales Order` WHERE `tabSales Order`.company = "%(company)s" and `tabSales Order`.`docstatus` = 1 and `tabSales Order`.`status` != "Stopped" and ifnull(`tabSales Order`.per_delivered,0) < 100 and %(cond)s `tabSales Order`.%(key)s LIKE "%s" ORDER BY `tabSales Order`.`name` DESC LIMIT 50', {company:doc.company,cond:cond}) + doc = locals[this.doctype][this.docname]; + var cond = ''; + + if(doc.customer) { + if(doc.currency) cond = '`tabSales Order`.customer = "'+doc.customer+'" and `tabSales Order`.currency = "'+doc.currency+'" and'; + else cond = '`tabSales Order`.customer = "'+doc.customer+'" and'; + } + else { + if(doc.currency) cond = '`tabSales Order`.currency = "'+doc.currency+'" and'; + else cond = ''; + } + if(doc.project_name){ + cond += '`tabSales Order`.project_name ="'+doc.project_name+'"'; + } + return repl('SELECT DISTINCT `tabSales Order`.`name` FROM `tabSales Order` WHERE `tabSales Order`.company = "%(company)s" and `tabSales Order`.`docstatus` = 1 and `tabSales Order`.`status` != "Stopped" and ifnull(`tabSales Order`.per_delivered,0) < 100 and %(cond)s `tabSales Order`.%(key)s LIKE "%s" ORDER BY `tabSales Order`.`name` DESC LIMIT 50', {company:doc.company,cond:cond}) } // ****************************** DELIVERY TYPE ************************************ cur_frm.cscript.delivery_type = function(doc, cdt, cdn) { - if (doc.delivery_type = 'Sample') cfn_set_fields(doc, cdt, cdn); + if (doc.delivery_type = 'Sample') cfn_set_fields(doc, cdt, cdn); } cur_frm.cscript.serial_no = function(doc, cdt , cdn) { - var d = locals[cdt][cdn]; - if (d.serial_no) { - get_server_fields('get_serial_details',d.serial_no,'delivery_note_details',doc,cdt,cdn,1); - } + var d = locals[cdt][cdn]; + if (d.serial_no) { + get_server_fields('get_serial_details',d.serial_no,'delivery_note_details',doc,cdt,cdn,1); + } } /* // this won't work in case of Sales Bom item where item.is_stock_item = 'No' cur_frm.fields_dict['delivery_note_details'].grid.get_field('warehouse').get_query= function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - return "SELECT `tabBin`.`warehouse`, `tabBin`.`actual_qty` FROM `tabBin` WHERE `tabBin`.`item_code` = '"+ d.item_code +"' AND ifnull(`tabBin`.`actual_qty`,0) > 0 AND `tabBin`.`warehouse` like '%s' ORDER BY `tabBin`.`warehouse` DESC LIMIT 50"; + var d = locals[cdt][cdn]; + return "SELECT `tabBin`.`warehouse`, `tabBin`.`actual_qty` FROM `tabBin` WHERE `tabBin`.`item_code` = '"+ d.item_code +"' AND ifnull(`tabBin`.`actual_qty`,0) > 0 AND `tabBin`.`warehouse` like '%s' ORDER BY `tabBin`.`warehouse` DESC LIMIT 50"; } */ cur_frm.cscript.warehouse = function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - if (! d.item_code) {alert("please enter item code first"); return}; - if (d.warehouse) { - arg = "{'item_code':'" + d.item_code + "','warehouse':'" + d.warehouse +"'}"; - get_server_fields('get_actual_qty',arg,'delivery_note_details',doc,cdt,cdn,1); - } + var d = locals[cdt][cdn]; + if (! d.item_code) {alert("please enter item code first"); return}; + if (d.warehouse) { + arg = "{'item_code':'" + d.item_code + "','warehouse':'" + d.warehouse +"'}"; + get_server_fields('get_actual_qty',arg,'delivery_note_details',doc,cdt,cdn,1); + } } cur_frm.fields_dict['transporter_name'].get_query = function(doc) { - return 'SELECT DISTINCT `tabSupplier`.`name` FROM `tabSupplier` WHERE `tabSupplier`.supplier_type = "transporter" AND `tabSupplier`.docstatus != 2 AND `tabSupplier`.%(key)s LIKE "%s" ORDER BY `tabSupplier`.`name` LIMIT 50'; + return 'SELECT DISTINCT `tabSupplier`.`name` FROM `tabSupplier` WHERE `tabSupplier`.supplier_type = "transporter" AND `tabSupplier`.docstatus != 2 AND `tabSupplier`.%(key)s LIKE "%s" ORDER BY `tabSupplier`.`name` LIMIT 50'; } //-----------------------------------Make Sales Invoice---------------------------------------------- cur_frm.cscript['Make Sales Invoice'] = function() { - var doc = cur_frm.doc - n = createLocal('Receivable Voucher'); - $c('dt_map', args={ - 'docs':compress_doclist([locals['Receivable Voucher'][n]]), - 'from_doctype':doc.doctype, - 'to_doctype':'Receivable Voucher', - 'from_docname':doc.name, - 'from_to_list':"[['Delivery Note','Receivable Voucher'],['Delivery Note Detail','RV Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]" - }, function(r,rt) { - loaddoc('Receivable Voucher', n); - } - ); + var doc = cur_frm.doc + n = createLocal('Receivable Voucher'); + $c('dt_map', args={ + 'docs':compress_doclist([locals['Receivable Voucher'][n]]), + 'from_doctype':doc.doctype, + 'to_doctype':'Receivable Voucher', + 'from_docname':doc.name, + 'from_to_list':"[['Delivery Note','Receivable Voucher'],['Delivery Note Detail','RV Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]" + }, function(r,rt) { + loaddoc('Receivable Voucher', n); + } + ); } //-----------------------------------Make Installation Note---------------------------------------------- cur_frm.cscript['Make Installation Note'] = function() { - var doc = cur_frm.doc; - if(doc.per_installed < 100){ - n = createLocal('Installation Note'); - $c('dt_map', args={ - 'docs':compress_doclist([locals['Installation Note'][n]]), - 'from_doctype':doc.doctype, - 'to_doctype':'Installation Note', - 'from_docname':doc.name, - 'from_to_list':"[['Delivery Note','Installation Note'],['Delivery Note Detail','Installed Item Details']]" - }, function(r,rt) { - loaddoc('Installation Note', n); - } - ); - } - else if(doc.per_installed >= 100) - msgprint("Item installation is already completed") + var doc = cur_frm.doc; + if(doc.per_installed < 100){ + n = createLocal('Installation Note'); + $c('dt_map', args={ + 'docs':compress_doclist([locals['Installation Note'][n]]), + 'from_doctype':doc.doctype, + 'to_doctype':'Installation Note', + 'from_docname':doc.name, + 'from_to_list':"[['Delivery Note','Installation Note'],['Delivery Note Detail','Installed Item Details']]" + }, function(r,rt) { + loaddoc('Installation Note', n); + } + ); + } + else if(doc.per_installed >= 100) + msgprint("Item installation is already completed") } //-----------------------------------Make Sales Invoice---------------------------------------------- cur_frm.cscript['Make Packing Slip'] = function() { - var doc = cur_frm.doc - n = createLocal('Packing Slip'); - $c('dt_map', args={ - 'docs':compress_doclist([locals['Packing Slip'][n]]), - 'from_doctype':doc.doctype, - 'to_doctype':'Packing Slip', - 'from_docname':doc.name, - 'from_to_list':"[['Delivery Note','Packing Slip'],['Delivery Note Detail','Packing Slip Detail']]" - }, function(r,rt) { - loaddoc('Packing Slip', n); - } - ); + var doc = cur_frm.doc + n = createLocal('Packing Slip'); + $c('dt_map', args={ + 'docs':compress_doclist([locals['Packing Slip'][n]]), + 'from_doctype':doc.doctype, + 'to_doctype':'Packing Slip', + 'from_docname':doc.name, + 'from_to_list':"[['Delivery Note','Packing Slip'],['Delivery Note Detail','Packing Slip Detail']]" + }, function(r,rt) { + loaddoc('Packing Slip', n); + } + ); } //get query select Territory //======================================================================================================================= cur_frm.fields_dict['territory'].get_query = function(doc,cdt,cdn) { - return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s" ORDER BY `tabTerritory`.`name` ASC LIMIT 50'; + return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s" ORDER BY `tabTerritory`.`name` ASC LIMIT 50'; } //------------------------for printing without amount---------- var set_print_hide= function(doc, cdt, cdn){ - if (doc.print_without_amount) { - fields['Delivery Note']['currency'].print_hide = 1; - fields['Delivery Note Detail']['export_rate'].print_hide = 1; - fields['Delivery Note Detail']['adj_rate'].print_hide = 1; - fields['Delivery Note Detail']['ref_rate'].print_hide = 1; - fields['Delivery Note Detail']['export_amount'].print_hide = 1; - } else { - fields['Delivery Note']['currency'].print_hide = 0; - fields['Delivery Note Detail']['export_rate'].print_hide = 0; - fields['Delivery Note Detail']['adj_rate'].print_hide = 0; - fields['Delivery Note Detail']['ref_rate'].print_hide = 0; - fields['Delivery Note Detail']['export_amount'].print_hide = 0; - } + if (doc.print_without_amount) { + fields['Delivery Note']['currency'].print_hide = 1; + fields['Delivery Note Detail']['export_rate'].print_hide = 1; + fields['Delivery Note Detail']['adj_rate'].print_hide = 1; + fields['Delivery Note Detail']['ref_rate'].print_hide = 1; + fields['Delivery Note Detail']['export_amount'].print_hide = 1; + } else { + fields['Delivery Note']['currency'].print_hide = 0; + fields['Delivery Note Detail']['export_rate'].print_hide = 0; + fields['Delivery Note Detail']['adj_rate'].print_hide = 0; + fields['Delivery Note Detail']['ref_rate'].print_hide = 0; + fields['Delivery Note Detail']['export_amount'].print_hide = 0; + } } cur_frm.cscript.print_without_amount = function(doc, cdt, cdn) { - set_print_hide(doc, cdt, cdn); + set_print_hide(doc, cdt, cdn); } //****************** For print sales order no and date************************* cur_frm.pformat.sales_order_no= function(doc, cdt, cdn){ - //function to make row of table - - var make_row = function(title,val1, val2, bold){ - var bstart = ''; var bend = ''; + //function to make row of table + + var make_row = function(title,val1, val2, bold){ + var bstart = ''; var bend = ''; - return '
' - +'' - +'' - } + return '' + +'' + +'' + } - out =''; - - var cl = getchildren('Delivery Note Detail',doc.name,'delivery_note_details'); + out =''; + + var cl = getchildren('Delivery Note Detail',doc.name,'delivery_note_details'); - // outer table - var out='
'+(bold?bstart:'')+title+(bold?bend:'')+''+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'
'+(bold?bstart:'')+title+(bold?bend:'')+''+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'
'; - - // main table - out +=''; + // outer table + var out='
'; + + // main table + out +=''; - // add rows - if(cl.length){ - prevdoc_list = new Array(); - for(var i=0;i ch[i].billed_qty) allow_billing = 1; - } - cur_frm.add_custom_button('Make Purchase Invoice', cur_frm.cscript['Make Purchase Invoice']); - cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); - } - else{ - hide_field(['Repair Purchase Receipt']); - } + // Unhide Fields in Next Steps + // --------------------------------- + cur_frm.clear_custom_buttons(); + if(doc.docstatus == 1){ + var ch = getchildren('Purchase Receipt Detail',doc.name,'purchase_receipt_details'); + allow_billing = 0; + for(var i in ch){ + if(ch[i].qty > ch[i].billed_qty) allow_billing = 1; + } + cur_frm.add_custom_button('Make Purchase Invoice', cur_frm.cscript['Make Purchase Invoice']); + cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); + } + else{ + hide_field(['Repair Purchase Receipt']); + } } //Supplier cur_frm.cscript.supplier = function(doc,dt,dn) { - if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1); - if(doc.supplier) unhide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']); + if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1); + if(doc.supplier) unhide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']); } -cur_frm.cscript.supplier_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { - if(doc.supplier) get_server_fields('get_supplier_address', JSON.stringify({supplier: doc.supplier, address: doc.supplier_address, contact: doc.contact_person}),'', doc, dt, dn, 1); +cur_frm.cscript.supplier_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { + if(doc.supplier) get_server_fields('get_supplier_address', JSON.stringify({supplier: doc.supplier, address: doc.supplier_address, contact: doc.contact_person}),'', doc, dt, dn, 1); } cur_frm.fields_dict['supplier_address'].get_query = function(doc, cdt, cdn) { - return 'SELECT name,address_line1,city FROM tabAddress WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; + return 'SELECT name,address_line1,city FROM tabAddress WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) { - return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; + return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } cur_frm.fields_dict.supplier_address.on_new = function(dn) { - locals['Address'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier; - locals['Address'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; + locals['Address'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier; + locals['Address'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; } cur_frm.fields_dict.contact_person.on_new = function(dn) { - locals['Contact'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier; - locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; + locals['Contact'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier; + locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; } // Get Purchase Order Button // ----------------- cur_frm.cscript['Pull Purchase Order Details'] = function(doc, dt, dn) { - var callback = function(r,rt) { - unhide_field(['supplier_address','contact_person','supplier_name','address_display', 'contact_display', 'contact_mobile','contact_email']); - refresh_many(['supplier','supplier_address','contact_person', 'supplier_name', 'address_display', 'contact_display','contact_mobile', 'contact_email', 'purchase_receipt_details', 'purchase_tax_details']); - } - $c_obj(make_doclist(dt,dn),'get_po_details','',callback); + var callback = function(r,rt) { + unhide_field(['supplier_address','contact_person','supplier_name','address_display', 'contact_display', 'contact_mobile','contact_email']); + refresh_many(['supplier','supplier_address','contact_person', 'supplier_name', 'address_display', 'contact_display','contact_mobile', 'contact_email', 'purchase_receipt_details', 'purchase_tax_details']); + } + $c_obj(make_doclist(dt,dn),'get_po_details','',callback); } //================ create new contact ============================================================================ cur_frm.cscript.new_contact = function(){ - tn = createLocal('Contact'); - locals['Contact'][tn].is_supplier = 1; - if(doc.supplier) locals['Contact'][tn].supplier = doc.supplier; - loaddoc('Contact', tn); + tn = createLocal('Contact'); + locals['Contact'][tn].is_supplier = 1; + if(doc.supplier) locals['Contact'][tn].supplier = doc.supplier; + loaddoc('Contact', tn); } //======================= posting date ============================= cur_frm.cscript.transaction_date = function(doc,cdt,cdn){ - if(doc.__islocal){ - cur_frm.cscript.get_default_schedule_date(doc); - } + if(doc.__islocal){ + cur_frm.cscript.get_default_schedule_date(doc); + } } // ***************** Get project name ***************** cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) { - return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50'; + return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50'; } //========================= Overloaded query for link batch_no ============================================================= cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('batch_no').get_query= function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - if(d.item_code){ - return "SELECT tabBatch.name, tabBatch.description FROM tabBatch WHERE tabBatch.docstatus != 2 AND tabBatch.item = '"+ d.item_code +"' AND `tabBatch`.`name` like '%s' ORDER BY `tabBatch`.`name` DESC LIMIT 50" - } - else{ - alert("Please enter Item Code."); - } + var d = locals[cdt][cdn]; + if(d.item_code){ + return "SELECT tabBatch.name, tabBatch.description FROM tabBatch WHERE tabBatch.docstatus != 2 AND tabBatch.item = '"+ d.item_code +"' AND `tabBatch`.`name` like '%s' ORDER BY `tabBatch`.`name` DESC LIMIT 50" + } + else{ + alert("Please enter Item Code."); + } } cur_frm.cscript.select_print_heading = function(doc,cdt,cdn){ - if(doc.select_print_heading){ - // print heading - cur_frm.pformat.print_heading = doc.select_print_heading; - } - else - cur_frm.pformat.print_heading = "Purchase Receipt"; + if(doc.select_print_heading){ + // print heading + cur_frm.pformat.print_heading = doc.select_print_heading; + } + else + cur_frm.pformat.print_heading = "Purchase Receipt"; } -// ***************** Get Print Heading ***************** +// ***************** Get Print Heading ***************** cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) { - return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50'; + return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50'; } //========================= Received Qty ============================================================= cur_frm.cscript.received_qty = function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - ret = { - 'qty' : 0, - 'stock_qty': 0, - 'rejected_qty' : 0 - } - set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details'); - cur_frm.cscript.calc_amount(doc, 2); + var d = locals[cdt][cdn]; + ret = { + 'qty' : 0, + 'stock_qty': 0, + 'rejected_qty' : 0 + } + set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details'); + cur_frm.cscript.calc_amount(doc, 2); } //======================== Qty (Accepted Qty) ========================================================= cur_frm.cscript.qty = function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - // Step 1 :=> Check If Qty > Received Qty - if (flt(d.qty) > flt(d.received_qty)) { - alert("Accepted Qty cannot be greater than Received Qty") - ret = { - 'qty' : 0, - 'stock_qty': 0, - 'rejected_qty' : 0 - } - // => Set Qty = 0 and rejected_qty = 0 - set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details'); - cur_frm.cscript.calc_amount(doc, 2); - // => Return - return - } - // Step 2 :=> Check IF Qty <= REceived Qty - else { - ret = { - 'rejected_qty':flt(d.received_qty) - flt(d.qty) - } - // => Set Rejected Qty = Received Qty - Qty - set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details'); - // => Calculate Amount - cur_frm.cscript.calc_amount(doc, 2); - cur_frm.cscript.update_stock_qty(doc,cdt,cdn); - } + var d = locals[cdt][cdn]; + // Step 1 :=> Check If Qty > Received Qty + if (flt(d.qty) > flt(d.received_qty)) { + alert("Accepted Qty cannot be greater than Received Qty") + ret = { + 'qty' : 0, + 'stock_qty': 0, + 'rejected_qty' : 0 + } + // => Set Qty = 0 and rejected_qty = 0 + set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details'); + cur_frm.cscript.calc_amount(doc, 2); + // => Return + return + } + // Step 2 :=> Check IF Qty <= REceived Qty + else { + ret = { + 'rejected_qty':flt(d.received_qty) - flt(d.qty) + } + // => Set Rejected Qty = Received Qty - Qty + set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details'); + // => Calculate Amount + cur_frm.cscript.calc_amount(doc, 2); + cur_frm.cscript.update_stock_qty(doc,cdt,cdn); + } } //======================== Rejected Qty ========================================================= cur_frm.cscript.rejected_qty = function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - // Step 1 :=> Check If Rejected Qty > Received Qty - if (flt(d.rejected_qty) > flt(d.received_qty)) { - alert("Rejected Qty cannot be greater than Received Qty") - ret = { - 'qty' : 0, - 'stock_qty': 0, - 'rejected_qty' : 0 - } - // => Set Qty = 0 and rejected_qty = 0 - set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details'); - cur_frm.cscript.calc_amount(doc, 2); - // => Return - return - } - // Step 2 :=> Check IF Rejected Qty <= REceived Qty - else { - ret = { - 'qty':flt(d.received_qty) - flt(d.rejected_qty) - } - // => Set Qty = Received Qty - Rejected Qty - set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details'); - // Calculate Amount - cur_frm.cscript.calc_amount(doc, 2); - cur_frm.cscript.update_stock_qty(doc,cdt,cdn); - } + var d = locals[cdt][cdn]; + // Step 1 :=> Check If Rejected Qty > Received Qty + if (flt(d.rejected_qty) > flt(d.received_qty)) { + alert("Rejected Qty cannot be greater than Received Qty") + ret = { + 'qty' : 0, + 'stock_qty': 0, + 'rejected_qty' : 0 + } + // => Set Qty = 0 and rejected_qty = 0 + set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details'); + cur_frm.cscript.calc_amount(doc, 2); + // => Return + return + } + // Step 2 :=> Check IF Rejected Qty <= REceived Qty + else { + ret = { + 'qty':flt(d.received_qty) - flt(d.rejected_qty) + } + // => Set Qty = Received Qty - Rejected Qty + set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details'); + // Calculate Amount + cur_frm.cscript.calc_amount(doc, 2); + cur_frm.cscript.update_stock_qty(doc,cdt,cdn); + } } //================================= Purchase Order No Get Query ==================================== cur_frm.fields_dict['purchase_order_no'].get_query = function(doc) { - if (doc.supplier) - return 'SELECT DISTINCT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`supplier` = "' +doc.supplier + '" and`tabPurchase Order`.`docstatus` = 1 and `tabPurchase Order`.`status` != "Stopped" and ifnull(`tabPurchase Order`.`per_received`, 0) < 100 and `tabPurchase Order`.`currency` = ifnull("' +doc.currency+ '","") and `tabPurchase Order`.company = "'+ doc.company +'" and `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50'; - else - return 'SELECT DISTINCT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 and `tabPurchase Order`.`company` = "'+ doc.company +'" and `tabPurchase Order`.`status` != "Stopped" and ifnull(`tabPurchase Order`.`per_received`, 0) < 100 and `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50'; + if (doc.supplier) + return 'SELECT DISTINCT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`supplier` = "' +doc.supplier + '" and`tabPurchase Order`.`docstatus` = 1 and `tabPurchase Order`.`status` != "Stopped" and ifnull(`tabPurchase Order`.`per_received`, 0) < 100 and `tabPurchase Order`.`currency` = ifnull("' +doc.currency+ '","") and `tabPurchase Order`.company = "'+ doc.company +'" and `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50'; + else + return 'SELECT DISTINCT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 and `tabPurchase Order`.`company` = "'+ doc.company +'" and `tabPurchase Order`.`status` != "Stopped" and ifnull(`tabPurchase Order`.`per_received`, 0) < 100 and `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50'; } // QA INspection report get_query //--------------------------------- cur_frm.fields_dict.purchase_receipt_details.grid.get_field("qa_no").get_query = function(doc) { - return 'SELECT `tabQA Inspection Report`.name FROM `tabQA Inspection Report` WHERE `tabQA Inspection Report`.docstatus = 1 AND `tabQA Inspection Report`.%(key)s LIKE "%s"'; + return 'SELECT `tabQA Inspection Report`.name FROM `tabQA Inspection Report` WHERE `tabQA Inspection Report`.docstatus = 1 AND `tabQA Inspection Report`.%(key)s LIKE "%s"'; } // On Button Click Functions @@ -231,17 +233,17 @@ cur_frm.fields_dict.purchase_receipt_details.grid.get_field("qa_no").get_query = // ================================ Make Purchase Invoice ========================================== cur_frm.cscript['Make Purchase Invoice'] = function() { - n = createLocal('Payable Voucher'); - $c('dt_map', args={ - 'docs':compress_doclist([locals['Payable Voucher'][n]]), - 'from_doctype': cur_frm.doc.doctype, - 'to_doctype':'Payable Voucher', - 'from_docname': cur_frm.doc.name, - 'from_to_list':"[['Purchase Receipt','Payable Voucher'],['Purchase Receipt Detail','PV Detail']]" - }, function(r,rt) { - loaddoc('Payable Voucher', n); - } - ); + n = createLocal('Payable Voucher'); + $c('dt_map', args={ + 'docs':compress_doclist([locals['Payable Voucher'][n]]), + 'from_doctype': cur_frm.doc.doctype, + 'to_doctype':'Payable Voucher', + 'from_docname': cur_frm.doc.name, + 'from_to_list':"[['Purchase Receipt','Payable Voucher'],['Purchase Receipt Detail','PV Detail'],['Purchase Tax Detail','Purchase Tax Detail']]" + }, function(r,rt) { + loaddoc('Payable Voucher', n); + } + ); } @@ -249,43 +251,43 @@ cur_frm.cscript['Make Purchase Invoice'] = function() { //****************** For print sales order no and date************************* cur_frm.pformat.purchase_order_no = function(doc, cdt, cdn){ - //function to make row of table - - var make_row = function(title,val1, val2, bold){ - var bstart = ''; var bend = ''; + //function to make row of table + + var make_row = function(title,val1, val2, bold){ + var bstart = ''; var bend = ''; - return '' - +'' - +'' - } + return '' + +'' + +'' + } - out =''; - - var cl = getchildren('Purchase Receipt Detail',doc.name,'purchase_receipt_details'); + out =''; + + var cl = getchildren('Purchase Receipt Detail',doc.name,'purchase_receipt_details'); - // outer table - var out='
'+(bold?bstart:'')+title+(bold?bend:'')+''+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'
'+(bold?bstart:'')+title+(bold?bend:'')+''+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'
'; - - // main table - out +=''; + // outer table + var out='
'; + + // main table + out +=''; - // add rows - if(cl.length){ - prevdoc_list = new Array(); - for(var i=0;i flt(max_qty): - curr_qty = (flt(max_qty) - flt(qty)) * flt(d.conversion_factor) - else: - curr_qty = flt(pr_qty) + if flt(qty) + flt(pr_qty) > flt(max_qty): + curr_qty = (flt(max_qty) - flt(qty)) * flt(d.conversion_factor) + else: + curr_qty = flt(pr_qty) - ord_qty = -flt(curr_qty) - # update order qty in bin - bin = get_obj('Warehouse', d.warehouse).update_bin(0, 0, (is_submit and 1 or -1) * flt(ord_qty), 0, 0, d.item_code, self.doc.transaction_date) + ord_qty = -flt(curr_qty) + # update order qty in bin + bin = get_obj('Warehouse', d.warehouse).update_bin(0, 0, (is_submit and 1 or -1) * flt(ord_qty), 0, 0, d.item_code, self.doc.transaction_date) - # UPDATE actual qty to warehouse by pr_qty - self.make_sl_entry(d, d.warehouse, flt(pr_qty), d.valuation_rate, is_submit) - # UPDATE actual to rejected warehouse by rejected qty - if flt(d.rejected_qty) > 0: - self.make_sl_entry(d, self.doc.rejected_warehouse, flt(d.rejected_qty) * flt(d.conversion_factor), d.valuation_rate, is_submit) + # UPDATE actual qty to warehouse by pr_qty + self.make_sl_entry(d, d.warehouse, flt(pr_qty), d.valuation_rate, is_submit) + # UPDATE actual to rejected warehouse by rejected qty + if flt(d.rejected_qty) > 0: + self.make_sl_entry(d, self.doc.rejected_warehouse, flt(d.rejected_qty) * flt(d.conversion_factor), d.valuation_rate, is_submit) - self.bk_flush_supp_wh(is_submit) + self.bk_flush_supp_wh(is_submit) - if self.values: - get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values) + if self.values: + get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values) - # make Stock Entry - def make_sl_entry(self, d, wh, qty, in_value, is_submit): - self.values.append({ - 'item_code' : d.fields.has_key('item_code') and d.item_code or d.rm_item_code, - 'warehouse' : wh, - 'transaction_date' : self.doc.transaction_date, - 'posting_date' : self.doc.posting_date, - 'posting_time' : self.doc.posting_time, - 'voucher_type' : 'Purchase Receipt', - 'voucher_no' : self.doc.name, - 'voucher_detail_no' : d.name, - 'actual_qty' : qty, - 'stock_uom' : d.stock_uom, - 'incoming_rate' : in_value, - 'company' : self.doc.company, - 'fiscal_year' : self.doc.fiscal_year, - 'is_cancelled' : (is_submit==1) and 'No' or 'Yes', - 'batch_no' : d.batch_no, - 'serial_no' : d.serial_no - }) + # make Stock Entry + def make_sl_entry(self, d, wh, qty, in_value, is_submit): + self.values.append({ + 'item_code' : d.fields.has_key('item_code') and d.item_code or d.rm_item_code, + 'warehouse' : wh, + 'transaction_date' : self.doc.transaction_date, + 'posting_date' : self.doc.posting_date, + 'posting_time' : self.doc.posting_time, + 'voucher_type' : 'Purchase Receipt', + 'voucher_no' : self.doc.name, + 'voucher_detail_no' : d.name, + 'actual_qty' : qty, + 'stock_uom' : d.stock_uom, + 'incoming_rate' : in_value, + 'company' : self.doc.company, + 'fiscal_year' : self.doc.fiscal_year, + 'is_cancelled' : (is_submit==1) and 'No' or 'Yes', + 'batch_no' : d.batch_no, + 'serial_no' : d.serial_no + }) - def validate_inspection(self): - for d in getlist(self.doclist, 'purchase_receipt_details'): #Enter inspection date for all items that require inspection - ins_reqd = sql("select inspection_required from `tabItem` where name = %s", (d.item_code), as_dict = 1) - ins_reqd = ins_reqd and ins_reqd[0]['inspection_required'] or 'No' - if ins_reqd == 'Yes' and not d.qa_no: - msgprint("Item: " + d.item_code + " requires QA Inspection. Please enter QA No or report to authorized person to create QA Inspection Report") + def validate_inspection(self): + for d in getlist(self.doclist, 'purchase_receipt_details'): #Enter inspection date for all items that require inspection + ins_reqd = sql("select inspection_required from `tabItem` where name = %s", (d.item_code), as_dict = 1) + ins_reqd = ins_reqd and ins_reqd[0]['inspection_required'] or 'No' + if ins_reqd == 'Yes' and not d.qa_no: + msgprint("Item: " + d.item_code + " requires QA Inspection. Please enter QA No or report to authorized person to create QA Inspection Report") - # Check for Stopped status - def check_for_stopped_status(self, pc_obj): - check_list =[] - for d in getlist(self.doclist, 'purchase_receipt_details'): - if d.fields.has_key('prevdoc_docname') and d.prevdoc_docname and d.prevdoc_docname not in check_list: - check_list.append(d.prevdoc_docname) - pc_obj.check_for_stopped_status( d.prevdoc_doctype, d.prevdoc_docname) + # Check for Stopped status + def check_for_stopped_status(self, pc_obj): + check_list =[] + for d in getlist(self.doclist, 'purchase_receipt_details'): + if d.fields.has_key('prevdoc_docname') and d.prevdoc_docname and d.prevdoc_docname not in check_list: + check_list.append(d.prevdoc_docname) + pc_obj.check_for_stopped_status( d.prevdoc_doctype, d.prevdoc_docname) - # on submit - def on_submit(self): - # Check for Approving Authority - get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total) + # on submit + def on_submit(self): + # Check for Approving Authority + get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total) - # Set status as Submitted - set(self.doc,'status', 'Submitted') - pc_obj = get_obj('Purchase Common') + # Set status as Submitted + set(self.doc,'status', 'Submitted') + pc_obj = get_obj('Purchase Common') - # Update Previous Doc i.e. update pending_qty and Status accordingly - pc_obj.update_prevdoc_detail(self, is_submit = 1) + # Update Previous Doc i.e. update pending_qty and Status accordingly + pc_obj.update_prevdoc_detail(self, is_submit = 1) - # Update Serial Record - get_obj('Stock Ledger').update_serial_record(self, 'purchase_receipt_details', is_submit = 1, is_incoming = 1) + # Update Serial Record + get_obj('Stock Ledger').update_serial_record(self, 'purchase_receipt_details', is_submit = 1, is_incoming = 1) - # Update Stock - self.update_stock(is_submit = 1) + # Update Stock + self.update_stock(is_submit = 1) - # Update last purchase rate - pc_obj.update_last_purchase_rate(self, 1) + # Update last purchase rate + pc_obj.update_last_purchase_rate(self, 1) - #On Cancel - #---------------------------------------------------------------------------------------------------- - def check_next_docstatus(self): - submit_rv = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_receipt = '%s' and t1.docstatus = 1" % (self.doc.name)) - if submit_rv: - msgprint("Purchase Invoice : " + cstr(self.submit_rv[0][0]) + " has already been submitted !") - raise Exception , "Validation Error." + #On Cancel + #---------------------------------------------------------------------------------------------------- + def check_next_docstatus(self): + submit_rv = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_receipt = '%s' and t1.docstatus = 1" % (self.doc.name)) + if submit_rv: + msgprint("Purchase Invoice : " + cstr(self.submit_rv[0][0]) + " has already been submitted !") + raise Exception , "Validation Error." - def on_cancel(self): - pc_obj = get_obj('Purchase Common') + def on_cancel(self): + pc_obj = get_obj('Purchase Common') - self.check_for_stopped_status(pc_obj) - # 1.Check if Payable Voucher has been submitted against current Purchase Order - # pc_obj.check_docstatus(check = 'Next', doctype = 'Payable Voucher', docname = self.doc.name, detail_doctype = 'PV Detail') + self.check_for_stopped_status(pc_obj) + # 1.Check if Payable Voucher has been submitted against current Purchase Order + # pc_obj.check_docstatus(check = 'Next', doctype = 'Payable Voucher', docname = self.doc.name, detail_doctype = 'PV Detail') - submitted = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_receipt = '%s' and t1.docstatus = 1" % self.doc.name) - if submitted: - msgprint("Purchase Invoice : " + cstr(submitted[0][0]) + " has already been submitted !") - raise Exception + submitted = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_receipt = '%s' and t1.docstatus = 1" % self.doc.name) + if submitted: + msgprint("Purchase Invoice : " + cstr(submitted[0][0]) + " has already been submitted !") + raise Exception - # 2.Set Status as Cancelled - set(self.doc,'status','Cancelled') + # 2.Set Status as Cancelled + set(self.doc,'status','Cancelled') - # 3. Cancel Serial No - get_obj('Stock Ledger').update_serial_record(self, 'purchase_receipt_details', is_submit = 0, is_incoming = 1) + # 3. Cancel Serial No + get_obj('Stock Ledger').update_serial_record(self, 'purchase_receipt_details', is_submit = 0, is_incoming = 1) - # 4.Update Bin - self.update_stock(is_submit = 0) + # 4.Update Bin + self.update_stock(is_submit = 0) - # 5.Update Indents Pending Qty and accordingly it's Status - pc_obj.update_prevdoc_detail(self, is_submit = 0) + # 5.Update Indents Pending Qty and accordingly it's Status + pc_obj.update_prevdoc_detail(self, is_submit = 0) - # 6. Update last purchase rate - pc_obj.update_last_purchase_rate(self, 0) + # 6. Update last purchase rate + pc_obj.update_last_purchase_rate(self, 0) #----------- code for Sub-contracted Items ------------------- - #--------check for sub-contracted items and accordingly update PR raw material detail table-------- - def update_rw_material_detail(self): + #--------check for sub-contracted items and accordingly update PR raw material detail table-------- + def update_rw_material_detail(self): - for d in getlist(self.doclist,'purchase_receipt_details'): - item_det = sql("select is_sub_contracted_item, is_purchase_item from `tabItem` where name = '%s'"%(d.item_code)) + for d in getlist(self.doclist,'purchase_receipt_details'): + item_det = sql("select is_sub_contracted_item, is_purchase_item from `tabItem` where name = '%s'"%(d.item_code)) - if item_det[0][0] == 'Yes': - if item_det[0][1] == 'Yes': - if not self.doc.is_subcontracted: - msgprint("Please enter whether purchase receipt to be made for subcontracting or for purchase in 'Is Subcontracted' field .") - raise Exception - if self.doc.is_subcontracted == 'Yes': - if not self.doc.supplier_warehouse: - msgprint("Please Enter Supplier Warehouse for subcontracted Items") - raise Exception - self.add_bom(d) - else: - self.doc.clear_table(self.doclist,'pr_raw_material_details',1) - self.doc.save() - elif item_det[0][1] == 'No': - if not self.doc.supplier_warehouse: - msgprint("Please Enter Supplier Warehouse for subcontracted Items") - raise Exception - self.add_bom(d) + if item_det[0][0] == 'Yes': + if item_det[0][1] == 'Yes': + if not self.doc.is_subcontracted: + msgprint("Please enter whether purchase receipt to be made for subcontracting or for purchase in 'Is Subcontracted' field .") + raise Exception + if self.doc.is_subcontracted == 'Yes': + if not self.doc.supplier_warehouse: + msgprint("Please Enter Supplier Warehouse for subcontracted Items") + raise Exception + self.add_bom(d) + else: + self.doc.clear_table(self.doclist,'pr_raw_material_details',1) + self.doc.save() + elif item_det[0][1] == 'No': + if not self.doc.supplier_warehouse: + msgprint("Please Enter Supplier Warehouse for subcontracted Items") + raise Exception + self.add_bom(d) - self.delete_irrelevant_raw_material() - #---------------calculate amt in PR Raw Material Detail------------- - self.calculate_amount(d) + self.delete_irrelevant_raw_material() + #---------------calculate amt in PR Raw Material Detail------------- + self.calculate_amount(d) - def add_bom(self, d): - #----- fetching default bom from Bill of Materials instead of Item Master -- - bom_det = sql("select t1.item, t2.item_code, t2.qty_consumed_per_unit, t2.moving_avg_rate, t2.value_as_per_mar, t2.stock_uom, t2.name, t2.description from `tabBill Of Materials` t1, `tabBOM Material` t2 where t2.parent = t1.name and t1.item = '%s' and ifnull(t1.is_default,0) = 1 and t1.docstatus = 1 and t2.docstatus =1" % d.item_code) - if not bom_det: - msgprint("No default BOM exists for item: %s" % d.item_code) - raise Exception - else: - #-------------- add child function-------------------- - chgd_rqd_qty = [] - for i in bom_det: + def add_bom(self, d): + #----- fetching default bom from Bill of Materials instead of Item Master -- + bom_det = sql("select t1.item, t2.item_code, t2.qty_consumed_per_unit, t2.moving_avg_rate, t2.value_as_per_mar, t2.stock_uom, t2.name, t2.description from `tabBill Of Materials` t1, `tabBOM Material` t2 where t2.parent = t1.name and t1.item = '%s' and ifnull(t1.is_default,0) = 1 and t1.docstatus = 1 and t2.docstatus =1" % d.item_code) + if not bom_det: + msgprint("No default BOM exists for item: %s" % d.item_code) + raise Exception + else: + #-------------- add child function-------------------- + chgd_rqd_qty = [] + for i in bom_det: - if i and not sql("select name from `tabPR Raw Material Detail` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)): + if i and not sql("select name from `tabPR Raw Material Detail` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)): - rm_child = addchild(self.doc, 'pr_raw_material_details', 'PR Raw Material Detail', 1, self.doclist) + rm_child = addchild(self.doc, 'pr_raw_material_details', 'PR Raw Material Detail', 1, self.doclist) - rm_child.reference_name = d.name - rm_child.bom_detail_no = i and i[6] or '' - rm_child.main_item_code = i and i[0] or '' - rm_child.rm_item_code = i and i[1] or '' - rm_child.description = i and i[7] or '' - rm_child.stock_uom = i and i[5] or '' - rm_child.rate = i and flt(i[3]) or flt(i[4]) - rm_child.conversion_factor = d.conversion_factor - rm_child.required_qty = flt(i and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor) - rm_child.consumed_qty = flt(i and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor) - rm_child.amount = flt(flt(rm_child.consumed_qty)*flt(rm_child.rate)) - rm_child.save() - chgd_rqd_qty.append(cstr(i[1])) - else: - act_qty = flt(i and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor) - for pr_rmd in getlist(self.doclist, 'pr_raw_material_details'): - if i and i[6] == pr_rmd.bom_detail_no and (flt(act_qty) != flt(pr_rmd.required_qty) or i[1] != pr_rmd.rm_item_code or i[7] != pr_rmd.description): - chgd_rqd_qty.append(cstr(i[1])) - pr_rmd.main_item_code = i[0] - pr_rmd.rm_item_code = i[1] - pr_rmd.description = i[7] - pr_rmd.stock_uom = i[5] - pr_rmd.required_qty = flt(act_qty) - pr_rmd.consumed_qty = flt(act_qty) - pr_rmd.rate = i and flt(i[3]) or flt(i[4]) - pr_rmd.amount = flt(flt(pr_rmd.consumed_qty)*flt(pr_rmd.rate)) - pr_rmd.save() - if chgd_rqd_qty: - msgprint("Please check consumed quantity for Raw Material Item Code: '%s'in Raw materials Detail Table" % ((len(chgd_rqd_qty) > 1 and ','.join(chgd_rqd_qty[:-1]) +' and ' + cstr(chgd_rqd_qty[-1:][0]) ) or cstr(chgd_rqd_qty[0]))) + rm_child.reference_name = d.name + rm_child.bom_detail_no = i and i[6] or '' + rm_child.main_item_code = i and i[0] or '' + rm_child.rm_item_code = i and i[1] or '' + rm_child.description = i and i[7] or '' + rm_child.stock_uom = i and i[5] or '' + rm_child.rate = i and flt(i[3]) or flt(i[4]) + rm_child.conversion_factor = d.conversion_factor + rm_child.required_qty = flt(i and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor) + rm_child.consumed_qty = flt(i and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor) + rm_child.amount = flt(flt(rm_child.consumed_qty)*flt(rm_child.rate)) + rm_child.save() + chgd_rqd_qty.append(cstr(i[1])) + else: + act_qty = flt(i and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor) + for pr_rmd in getlist(self.doclist, 'pr_raw_material_details'): + if i and i[6] == pr_rmd.bom_detail_no and (flt(act_qty) != flt(pr_rmd.required_qty) or i[1] != pr_rmd.rm_item_code or i[7] != pr_rmd.description): + chgd_rqd_qty.append(cstr(i[1])) + pr_rmd.main_item_code = i[0] + pr_rmd.rm_item_code = i[1] + pr_rmd.description = i[7] + pr_rmd.stock_uom = i[5] + pr_rmd.required_qty = flt(act_qty) + pr_rmd.consumed_qty = flt(act_qty) + pr_rmd.rate = i and flt(i[3]) or flt(i[4]) + pr_rmd.amount = flt(flt(pr_rmd.consumed_qty)*flt(pr_rmd.rate)) + pr_rmd.save() + if chgd_rqd_qty: + msgprint("Please check consumed quantity for Raw Material Item Code: '%s'in Raw materials Detail Table" % ((len(chgd_rqd_qty) > 1 and ','.join(chgd_rqd_qty[:-1]) +' and ' + cstr(chgd_rqd_qty[-1:][0]) ) or cstr(chgd_rqd_qty[0]))) - # Delete irrelevant raw material from PR Raw material details - #-------------------------------------------------------------- - def delete_irrelevant_raw_material(self): - for d in getlist(self.doclist,'pr_raw_material_details'): - if not sql("select name from `tabPurchase Receipt Detail` where name = '%s' and parent = '%s' and item_code = '%s'" % (d.reference_name, self.doc.name, d.main_item_code)): - d.parent = 'old_par:'+self.doc.name - d.save() + # Delete irrelevant raw material from PR Raw material details + #-------------------------------------------------------------- + def delete_irrelevant_raw_material(self): + for d in getlist(self.doclist,'pr_raw_material_details'): + if not sql("select name from `tabPurchase Receipt Detail` where name = '%s' and parent = '%s' and item_code = '%s'" % (d.reference_name, self.doc.name, d.main_item_code)): + d.parent = 'old_par:'+self.doc.name + d.save() - def calculate_amount(self, d): - amt = 0 - for i in getlist(self.doclist,'pr_raw_material_details'): + def calculate_amount(self, d): + amt = 0 + for i in getlist(self.doclist,'pr_raw_material_details'): - if(i.reference_name == d.name): - #if i.consumed_qty == 0: - # msgprint("consumed qty cannot be 0. Please Enter consumed qty ") - #raise Exception - i.amount = flt(i.consumed_qty)* flt(i.rate) - amt += i.amount - d.rm_supp_cost = amt - d.save() + if(i.reference_name == d.name): + #if i.consumed_qty == 0: + # msgprint("consumed qty cannot be 0. Please Enter consumed qty ") + #raise Exception + i.amount = flt(i.consumed_qty)* flt(i.rate) + amt += i.amount + d.rm_supp_cost = amt + d.save() - # --------------- Back Flush function called on submit and on cancel from update stock - def bk_flush_supp_wh(self, is_submit): - for d in getlist(self.doclist, 'pr_raw_material_details'): - #--------- -ve quantity is passed as raw material qty has to be decreased when PR is submitted and it has to be increased when PR is cancelled - consumed_qty = - flt(d.consumed_qty) - self.make_sl_entry(d, self.doc.supplier_warehouse, flt(consumed_qty), 0, is_submit) + # --------------- Back Flush function called on submit and on cancel from update stock + def bk_flush_supp_wh(self, is_submit): + for d in getlist(self.doclist, 'pr_raw_material_details'): + #--------- -ve quantity is passed as raw material qty has to be decreased when PR is submitted and it has to be increased when PR is cancelled + consumed_qty = - flt(d.consumed_qty) + self.make_sl_entry(d, self.doc.supplier_warehouse, flt(consumed_qty), 0, is_submit) - # get current_stock - # ---------------- - def get_current_stock(self): - for d in getlist(self.doclist, 'pr_raw_material_details'): - if self.doc.supplier_warehouse: - bin = sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.rm_item_code, self.doc.supplier_warehouse), as_dict = 1) - d.current_stock = bin and flt(bin[0]['actual_qty']) or 0 + # get current_stock + # ---------------- + def get_current_stock(self): + for d in getlist(self.doclist, 'pr_raw_material_details'): + if self.doc.supplier_warehouse: + bin = sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.rm_item_code, self.doc.supplier_warehouse), as_dict = 1) + d.current_stock = bin and flt(bin[0]['actual_qty']) or 0 @@ -427,15 +442,15 @@ class DocType(TransactionBase): # OTHER CHARGES TRIGGER FUNCTIONS # ==================================================================================== - # *********** Get Tax rate if account type is TAX ******************** - def get_rate(self,arg): - return get_obj('Purchase Common').get_rate(arg,self) + # *********** Get Tax rate if account type is TAX ******************** + def get_rate(self,arg): + return get_obj('Purchase Common').get_rate(arg,self) - # **** Pull details from other charges master (Get Other Charges) **** - def get_purchase_tax_details(self): - return get_obj('Purchase Common').get_purchase_tax_details(self) + # **** Pull details from other charges master (Get Other Charges) **** + def get_purchase_tax_details(self): + return get_obj('Purchase Common').get_purchase_tax_details(self) - # Repair Purchase Order - # =========================================== - def repair_purchase_receipt(self): - get_obj('Purchase Common').repair_curr_doctype_details(self) + # Repair Purchase Order + # =========================================== + def repair_purchase_receipt(self): + get_obj('Purchase Common').repair_curr_doctype_details(self) diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py index 7b9d294659..ace16fb60a 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py @@ -25,8 +25,9 @@ class DocType: from webnotes.utils import file_manager fn, content = file_manager.get_file(filename[1]) - if not type(content) == str: - content = content.tostring() + # NOTE: Don't know why this condition exists + if not isinstance(content, basestring) and hasattr(content, 'tostring'): + content = content.tostring() return content diff --git a/erpnext/support/doctype/support_ticket/__init__.py b/erpnext/support/doctype/support_ticket/__init__.py index 3b05bda051..1b09fc95cc 100644 --- a/erpnext/support/doctype/support_ticket/__init__.py +++ b/erpnext/support/doctype/support_ticket/__init__.py @@ -1,4 +1,5 @@ import webnotes +from webnotes.utils import cstr from webnotes.utils.email_lib.receive import POP3Mailbox @@ -111,7 +112,7 @@ class SupportMailbox(POP3Mailbox): status = add_file_list('Support Ticket', doc.name, attachment['filename'], fid) if not status: doc.description = doc.description \ - + "\nCould not attach: " + str(attachment['filename']) + + "\nCould not attach: " + cstr(attachment['filename']) doc.save() webnotes.conn.commit() @@ -137,7 +138,7 @@ We will get back to you as soon as possible sendmail(\ recipients = [d.raised_by], \ sender = self.email_settings.support_email, \ - subject = '['+d.name+'] ' + str(d.subject or ''), \ + subject = '['+d.name+'] ' + cstr(d.subject), \ msg = response) def auto_close_tickets(self): diff --git a/erpnext/utilities/doctype/bulk_rename_tool/bulk_rename_tool.py b/erpnext/utilities/doctype/bulk_rename_tool/bulk_rename_tool.py index 62d4d83c6c..bb9d9e63fb 100644 --- a/erpnext/utilities/doctype/bulk_rename_tool/bulk_rename_tool.py +++ b/erpnext/utilities/doctype/bulk_rename_tool/bulk_rename_tool.py @@ -76,7 +76,8 @@ class DocType: from webnotes.utils import file_manager fn, content = file_manager.get_file(fid) - if not type(content) == str: + # NOTE: Don't know why this condition exists + if not isinstance(content, basestring) and hasattr(content, 'tostring'): content = content.tostring() return content diff --git a/index.html b/index.html index 2793bd71b0..150a2cf730 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ ERPNext -