diff --git a/erpnext/buying/DocType Mapper/Purchase Request-Supplier Quotation/Purchase Request-Supplier Quotation.txt b/erpnext/buying/DocType Mapper/Purchase Request-Supplier Quotation/Purchase Request-Supplier Quotation.txt index 95b13ba447..7d1de7524a 100644 --- a/erpnext/buying/DocType Mapper/Purchase Request-Supplier Quotation/Purchase Request-Supplier Quotation.txt +++ b/erpnext/buying/DocType Mapper/Purchase Request-Supplier Quotation/Purchase Request-Supplier Quotation.txt @@ -5,7 +5,7 @@ { 'creation': '2012-08-02 18:36:26', 'docstatus': 0, - 'modified': '2012-08-02 18:37:32', + 'modified': '2012-08-03 12:34:09', 'modified_by': u'Administrator', 'owner': u'Administrator' }, @@ -81,15 +81,6 @@ 'to_field': u'prevdoc_detail_docname' }, - # Field Mapper Detail - { - 'doctype': u'Field Mapper Detail', - 'from_field': u'uom', - 'map': u'Yes', - 'match_id': 1, - 'to_field': u'stock_uom' - }, - # Field Mapper Detail { 'checking_operator': u'>=', @@ -117,7 +108,7 @@ 'from_table': u'Purchase Request Item', 'match_id': 1, 'reference_doctype_key': u'prevdoc_doctype', - 'to_field': u'quotation_details', + 'to_field': u'quotation_items', 'to_table': u'Supplier Quotation Item', 'validation_logic': u'docstatus =1' } diff --git a/erpnext/buying/DocType Mapper/Supplier Quotation-Purchase Order/Supplier Quotation-Purchase Order.txt b/erpnext/buying/DocType Mapper/Supplier Quotation-Purchase Order/Supplier Quotation-Purchase Order.txt new file mode 100644 index 0000000000..a616266c91 --- /dev/null +++ b/erpnext/buying/DocType Mapper/Supplier Quotation-Purchase Order/Supplier Quotation-Purchase Order.txt @@ -0,0 +1,169 @@ +# DocType Mapper, Supplier Quotation-Purchase Order +[ + + # These values are common in all dictionaries + { + 'creation': '2012-08-03 12:33:04', + 'docstatus': 0, + 'modified': '2012-08-06 16:45:56', + 'modified_by': u'Administrator', + 'owner': u'Administrator' + }, + + # These values are common for all Table Mapper Detail + { + 'doctype': u'Table Mapper Detail', + 'name': '__common__', + 'parent': u'Supplier Quotation-Purchase Order', + 'parentfield': u'table_mapper_details', + 'parenttype': u'DocType Mapper', + 'validation_logic': u'docstatus = 1' + }, + + # These values are common for all Field Mapper Detail + { + 'doctype': u'Field Mapper Detail', + 'name': '__common__', + 'parent': u'Supplier Quotation-Purchase Order', + 'parentfield': u'field_mapper_details', + 'parenttype': u'DocType Mapper' + }, + + # These values are common for all DocType Mapper + { + 'doctype': u'DocType Mapper', + 'from_doctype': u'Supplier Quotation', + 'module': u'Buying', + 'name': '__common__', + 'ref_doc_submitted': 1, + 'to_doctype': u'Purchase Order' + }, + + # DocType Mapper, Supplier Quotation-Purchase Order + { + 'doctype': u'DocType Mapper', + 'name': u'Supplier Quotation-Purchase Order' + }, + + # Field Mapper Detail + { + 'checking_operator': u'=', + 'doctype': u'Field Mapper Detail', + 'from_field': u'company', + 'map': u'Yes', + 'match_id': 0, + 'to_field': u'company' + }, + + # Field Mapper Detail + { + 'checking_operator': u'>=', + 'doctype': u'Field Mapper Detail', + 'from_field': u'transaction_date', + 'map': u'No', + 'match_id': 0, + 'to_field': u'transaction_date' + }, + + # Field Mapper Detail + { + 'doctype': u'Field Mapper Detail', + 'from_field': u'conversion_rate', + 'map': u'Yes', + 'match_id': 0, + 'to_field': u'conversion_rate' + }, + + # Field Mapper Detail + { + 'doctype': u'Field Mapper Detail', + 'from_field': u'net_total', + 'map': u'Yes', + 'match_id': 0, + 'to_field': u'net_total' + }, + + # Field Mapper Detail + { + 'doctype': u'Field Mapper Detail', + 'from_field': u'total_tax', + 'map': u'Yes', + 'match_id': 0, + 'to_field': u'total_tax' + }, + + # Field Mapper Detail + { + 'doctype': u'Field Mapper Detail', + 'from_field': u'grand_total', + 'map': u'Yes', + 'match_id': 0, + 'to_field': u'grand_total' + }, + + # Field Mapper Detail + { + 'doctype': u'Field Mapper Detail', + 'from_field': u'parent', + 'map': u'Yes', + 'match_id': 1, + 'to_field': u'supplier_quotation' + }, + + # Field Mapper Detail + { + 'doctype': u'Field Mapper Detail', + 'from_field': u'name', + 'map': u'Yes', + 'match_id': 1, + 'to_field': u'supplier_quotation_item' + }, + + # Field Mapper Detail + { + 'doctype': u'Field Mapper Detail', + 'from_field': u'uom', + 'map': u'Yes', + 'match_id': 1, + 'to_field': u'stock_uom' + }, + + # Field Mapper Detail + { + 'doctype': u'Field Mapper Detail', + 'from_field': u'eval:flt(1)', + 'map': u'Yes', + 'match_id': 1, + 'to_field': u'conversion_factor' + }, + + # Table Mapper Detail + { + 'doctype': u'Table Mapper Detail', + 'from_table': u'Supplier Quotation', + 'match_id': 0, + 'reference_key': u'prevdoc_docname', + 'to_table': u'Purchase Order' + }, + + # Table Mapper Detail + { + 'doctype': u'Table Mapper Detail', + 'from_field': u'quotation_details', + 'from_table': u'Supplier Quotation Item', + 'match_id': 1, + 'reference_doctype_key': u'prevdoc_doctype', + 'to_field': u'po_details', + 'to_table': u'Purchase Order Item' + }, + + # Table Mapper Detail + { + 'doctype': u'Table Mapper Detail', + 'from_field': u'purchase_tax_details', + 'from_table': u'Purchase Taxes and Charges', + 'match_id': 2, + 'to_field': u'purchase_tax_details', + 'to_table': u'Purchase Taxes and Charges' + } +] \ No newline at end of file diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.js b/erpnext/buying/doctype/purchase_common/purchase_common.js index 81d5fbf813..dbac326678 100644 --- a/erpnext/buying/doctype/purchase_common/purchase_common.js +++ b/erpnext/buying/doctype/purchase_common/purchase_common.js @@ -122,7 +122,6 @@ var set_dynamic_label_child = function(doc, cdt, cdn, base_curr) { cur_frm.cscript.dynamic_label = function(doc, cdt, cdn, callback1) { var base_currency = wn.boot.company[doc.company].default_currency || sys_defaults['currency']; - if (doc.currency === base_currency) { set_multiple(cdt, cdn, {conversion_rate:1}); hide_field(['conversion_rate', 'net_total_import','grand_total_import', @@ -634,3 +633,7 @@ cur_frm.cscript.check_charge_type_and_get_tax_amount = function(doc, tax, t, cl, } } } + +cur_frm.cscript.toggle_contact_section = function(doc) { + cur_frm.toggle_display("contact_section", doc.supplier); +} \ No newline at end of file diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index a27f6ff73b..a1983c34a7 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -24,15 +24,15 @@ wn.require('erpnext/utilities/doctype/sms_control/sms_control.js'); wn.require('erpnext/setup/doctype/notification_control/notification_control.js'); 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.is_subcontracted) set_multiple(cdt, cdn, {is_subcontracted:'No'}); + // set missing values in parent doc + set_missing_values(doc, { + fiscal_year: sys_defaults.fiscal_year, + conversion_rate: 1, + currency: sys_defaults.currency, + status: "Draft", + transaction_date: get_today(), + is_subcontracted: "No" + }); } cur_frm.cscript.onload_post_render = function(doc, dt, dn) { @@ -55,8 +55,7 @@ cur_frm.cscript.refresh = function(doc, cdt, cdn) { if(doc.docstatus == 1 && doc.status == 'Stopped') cur_frm.add_custom_button('Unstop Purchase Order', cur_frm.cscript['Unstop Purchase Order']); - if(doc.supplier) $(cur_frm.fields_dict.contact_section.row.wrapper).toggle(true); - else $(cur_frm.fields_dict.contact_section.row.wrapper).toggle(false); + cur_frm.cscript.toggle_contact_section(doc); } cur_frm.cscript.supplier = function(doc,dt,dn) { diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index f4e07038eb..533e8ad778 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -87,7 +87,7 @@ class DocType(TransactionBase): if self.doc.indent_no: get_obj('DocType Mapper','Purchase Request-Purchase Order').dt_map('Purchase Request','Purchase Order',self.doc.indent_no, self.doc, self.doclist, "[['Purchase Request','Purchase Order'],['Purchase Request Item', 'Purchase Order Item']]") pcomm = get_obj('Purchase Common') - for d in getlist(self.doclist, 'po_details'): + for d in getlist(self.doclist, 'po_details'): if d.item_code and not d.purchase_rate: last_purchase_details, last_purchase_date = pcomm.get_last_purchase_details(d.item_code, self.doc.name) if last_purchase_details: @@ -100,6 +100,19 @@ class DocType(TransactionBase): d.import_rate = d.purchase_rate / conversion_rate else: d.purchase_ref_rate = d.discount_rate = d.purchase_rate = d.import_ref_rate = d.import_rate = 0.0 + + def get_supplier_quotation_items(self): + if self.doc.supplier_quotation: + get_obj("DocType Mapper", "Supplier Quotation-Purchase Order").dt_map("Supplier Quotation", + "Purchase Order", self.doc.supplier_quotation, self.doc, self.doclist, + """[['Supplier Quotation', 'Purchase Order'], + ['Supplier Quotation Item', 'Purchase Order Item'], + ['Purchase Taxes and Charges', 'Purchase Taxes and Charges']]""") + self.get_default_schedule_date() + for d in getlist(self.doclist, 'po_details'): + if d.prevdoc_detail_docname and not d.schedule_date: + d.schedule_date = webnotes.conn.get_value("Purchase Request Item", + d.prevdoc_detail_docname, "schedule_date") def get_tc_details(self): """get terms & conditions""" diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.txt b/erpnext/buying/doctype/purchase_order/purchase_order.txt index 9900adb224..b1a70bb506 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.txt +++ b/erpnext/buying/doctype/purchase_order/purchase_order.txt @@ -5,7 +5,7 @@ { 'creation': '2012-07-02 14:44:19', 'docstatus': 0, - 'modified': '2012-08-02 13:43:50', + 'modified': '2012-08-06 17:14:19', 'modified_by': u'Administrator', 'owner': u'Administrator' }, @@ -356,9 +356,35 @@ 'fieldtype': u'Button', 'hidden': 0, 'label': u'Get Items', + 'no_copy': 0, 'oldfieldtype': u'Button', 'options': u'get_indent_details', - 'permlevel': 0 + 'permlevel': 0, + 'print_hide': 1 + }, + + # DocField + { + 'description': u'You can make a purchase order from multiple Supplier Quotations. Select Supplier Quotations one by one and click on the button below.', + 'doctype': u'DocField', + 'fieldname': u'supplier_quotation', + 'fieldtype': u'Link', + 'label': u'Select Supplier Quotation', + 'no_copy': 1, + 'options': u'Supplier Quotation', + 'permlevel': 0, + 'print_hide': 1 + }, + + # DocField + { + 'doctype': u'DocField', + 'fieldname': u'get_supplier_quotation_items', + 'fieldtype': u'Button', + 'label': u'Get Items', + 'options': u'get_supplier_quotation_items', + 'permlevel': 0, + 'print_hide': 1 }, # DocField @@ -369,7 +395,8 @@ 'fieldtype': u'Section Break', 'label': u'Taxes', 'oldfieldtype': u'Section Break', - 'permlevel': 0 + 'permlevel': 0, + 'print_hide': 0 }, # DocField diff --git a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.txt b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.txt index 73a6f0165f..cecf9630c7 100755 --- a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.txt +++ b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.txt @@ -5,7 +5,7 @@ { 'creation': '2012-05-15 12:14:38', 'docstatus': 0, - 'modified': '2012-06-29 13:05:33', + 'modified': '2012-08-06 15:55:11', 'modified_by': u'Administrator', 'owner': u'Administrator' }, @@ -335,7 +335,7 @@ 'fieldtype': u'Date', 'hidden': 1, 'in_filter': 1, - 'label': u'Purchase Requisition Date', + 'label': u'Purchase Request Date', 'oldfieldname': u'prevdoc_date', 'oldfieldtype': u'Date', 'permlevel': 1, @@ -351,7 +351,7 @@ 'fieldtype': u'Data', 'hidden': 1, 'in_filter': 1, - 'label': u'Purchase Requisition Detail No', + 'label': u'Purchase Request Detail No', 'no_copy': 0, 'oldfieldname': u'prevdoc_detail_docname', 'oldfieldtype': u'Data', @@ -360,6 +360,30 @@ 'search_index': 1 }, + # DocField + { + 'doctype': u'DocField', + 'fieldname': u'supplier_quotation', + 'fieldtype': u'Link', + 'hidden': 1, + 'in_filter': 0, + 'label': u'Supplier Quotation', + 'options': u'Supplier Quotation', + 'permlevel': 1, + 'search_index': 0 + }, + + # DocField + { + 'doctype': u'DocField', + 'fieldname': u'supplier_quotation_item', + 'fieldtype': u'Link', + 'hidden': 1, + 'label': u'Supplier Quotation Item', + 'options': u'Supplier Quotation Item', + 'permlevel': 1 + }, + # DocField { 'doctype': u'DocField', diff --git a/erpnext/buying/doctype/purchase_request/purchase_request.js b/erpnext/buying/doctype/purchase_request/purchase_request.js index c29434dee2..733da5260c 100644 --- a/erpnext/buying/doctype/purchase_request/purchase_request.js +++ b/erpnext/buying/doctype/purchase_request/purchase_request.js @@ -51,10 +51,11 @@ cur_frm.cscript.refresh = function(doc, cdt, cdn) { if(doc.docstatus == 1 && doc.status != 'Stopped'){ if(doc.per_ordered < 100) { - cur_frm.add_custom_button('Make Purchase Order', cur_frm.cscript['Make Purchase Order']) - cur_frm.add_custom_button('Stop Purchase Request', cur_frm.cscript['Stop Purchase Request']) + cur_frm.add_custom_button('Make Purchase Order', cur_frm.cscript['Make Purchase Order']); + cur_frm.add_custom_button('Stop Purchase Request', cur_frm.cscript['Stop Purchase Request']); } cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms); + cur_frm.add_custom_button("Make Supplier Quotation", cur_frm.cscript.make_supplier_quotation); } if(doc.docstatus == 1 && doc.status == 'Stopped') @@ -124,3 +125,15 @@ cur_frm.cscript['Unstop Purchase Request'] = function(){ }); } } + +cur_frm.cscript.make_supplier_quotation = function() { + var new_sq_name = createLocal("Supplier Quotation"); + $c("dt_map", { + "docs": compress_doclist([locals['Supplier Quotation'][new_sq_name]]), + "from_doctype": cur_frm.doc.doctype, + "to_doctype": "Supplier Quotation", + "from_docname": cur_frm.doc.name, + "from_to_list": JSON.stringify([['Purchase Request', 'Supplier Quotation'], + ['Purchase Request Item', 'Supplier Quotation Item']]), + }, function(r, rt) { loaddoc("Supplier Quotation", new_sq_name) }); +} \ No newline at end of file diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js index 4d2673c5ef..430d1eed99 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js @@ -47,13 +47,17 @@ cur_frm.cscript.refresh = function(doc, dt, dn) { } } -cur_frm.cscript.toggle_contact_section = function(doc) { - console.log(doc.supplier); - doc.supplier ? unhide_field("contact_section") : hide_field("contact_section"); -} - -cur_frm.cscript.make_purchase_order = function(doc, dt, dn) { - +cur_frm.cscript.make_purchase_order = function() { + var new_po_name = createLocal("Purchase Order"); + $c("dt_map", { + "docs": compress_doclist([locals['Purchase Order'][new_po_name]]), + "from_doctype": cur_frm.doc.doctype, + "to_doctype": "Purchase Order", + "from_docname": cur_frm.doc.name, + "from_to_list": JSON.stringify([['Supplier Quotation', 'Purchase Order'], + ['Supplier Quotation Item', 'Purchase Order Item'], + ['Purchase Taxes and Charges', 'Purchase Taxes and Charges']]), + }, function(r, rt) { loaddoc("Purchase Order", new_po_name) }); } cur_frm.cscript.supplier = function(doc, dt, dn) { @@ -65,6 +69,10 @@ cur_frm.cscript.supplier = function(doc, dt, dn) { } } +cur_frm.cscript.uom = function(doc, cdt, cdn) { + // no need to trigger updation of stock uom, as this field doesn't exist in supplier quotation +} + cur_frm.fields_dict['quotation_items'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) { return "select `tabProject`.name from `tabProject` \ @@ -82,7 +90,6 @@ cur_frm.fields_dict['indent_no'].get_query = function(doc) { order by `tabPurchase Request`.`name` desc limit 50"; } - cur_frm.cscript.supplier_address = function(doc, dt, dn) { if (doc.supplier) { get_server_fields("get_supplier_address", JSON.stringify({supplier: doc.supplier, diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py index b90411cddb..1577eab1a6 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py @@ -22,7 +22,7 @@ from utilities.transaction_base import TransactionBase class DocType(TransactionBase): def __init__(self, doc, doclist=None): self.doc, self.doclist = doc, doclist or [] - self.tname, self.fname = "Supplier Quotation Item", "quotation_item" + self.tname, self.fname = "Supplier Quotation Item", "quotation_items" def autoname(self): """autoname based on naming series value""" @@ -67,7 +67,8 @@ class DocType(TransactionBase): self.doc, self.doclist, """[['Purchase Request', 'Supplier Quotation'], ['Purchase Request Item', 'Supplier Quotation Item']]""") - for d in getlist(self.doclist, "quotation_details"): + from webnotes.model.doclist import getlist + for d in getlist(self.doclist, self.fname): if d.item_code and not d.purchase_rate: d.purchase_ref_rate = d.discount_rate = d.purchase_rate = 0.0 d.import_ref_rate = d.import_rate = 0.0 @@ -75,9 +76,6 @@ class DocType(TransactionBase): def get_purchase_tax_details(self): self.doclist = get_obj('Purchase Common').get_purchase_tax_details(self) - def get_uom_details(self, args=None): - return get_obj('Purchase Common').get_uom_details(args) - def validate_fiscal_year(self): get_obj(dt = 'Purchase Common').validate_fiscal_year( \ self.doc.fiscal_year, self.doc.transaction_date, 'Quotation Date') diff --git a/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.txt b/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.txt index 1ee10ae496..895c8fc899 100644 --- a/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.txt +++ b/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.txt @@ -5,7 +5,7 @@ { 'creation': '2012-08-01 20:07:22', 'docstatus': 0, - 'modified': '2012-08-02 16:00:52', + 'modified': '2012-08-03 12:34:33', 'modified_by': u'Administrator', 'owner': u'Administrator' }, @@ -241,38 +241,6 @@ 'width': u'100px' }, - # DocField - { - 'colour': u'White:FFF', - 'doctype': u'DocField', - 'fieldname': u'conversion_factor', - 'fieldtype': u'Currency', - 'hidden': 0, - 'label': u'UOM Conversion Factor', - 'oldfieldname': u'conversion_factor', - 'oldfieldtype': u'Currency', - 'permlevel': 0, - 'print_hide': 1, - 'reqd': 1, - 'trigger': u'Client', - 'width': u'100px' - }, - - # DocField - { - 'doctype': u'DocField', - 'fieldname': u'stock_uom', - 'fieldtype': u'Data', - 'hidden': 0, - 'label': u'Stock UOM', - 'oldfieldname': u'stock_uom', - 'oldfieldtype': u'Data', - 'permlevel': 1, - 'print_hide': 1, - 'reqd': 1, - 'width': u'100px' - }, - # DocField { 'colour': u'White:FFF', diff --git a/erpnext/buying/report/supplier_quotations/supplier_quotations.txt b/erpnext/buying/report/supplier_quotations/supplier_quotations.txt new file mode 100644 index 0000000000..860a432810 --- /dev/null +++ b/erpnext/buying/report/supplier_quotations/supplier_quotations.txt @@ -0,0 +1,26 @@ +# Report, Supplier Quotations +[ + + # These values are common in all dictionaries + { + 'creation': '2012-08-07 14:52:42', + 'docstatus': 0, + 'modified': '2012-08-07 14:57:57', + 'modified_by': u'Administrator', + 'owner': u'Administrator' + }, + + # These values are common for all Report + { + 'doctype': 'Report', + 'json': u'{"filters":[["Supplier Quotation","supplier","like","%%"],["Supplier Quotation Item","item_code","like","%%"]],"columns":[["name","Supplier Quotation"],["supplier","Supplier Quotation"],["item_code","Supplier Quotation Item"],["description","Supplier Quotation Item"],["qty","Supplier Quotation Item"],["currency","Supplier Quotation"],["import_rate","Supplier Quotation Item"],["import_amount","Supplier Quotation Item"]],"sort_by":"modified","sort_order":"desc","sort_by_next":"name","sort_order_next":"desc"}', + 'name': '__common__', + 'ref_doctype': u'Supplier Quotation' + }, + + # Report, Supplier Quotations + { + 'doctype': 'Report', + 'name': u'Supplier Quotations' + } +] \ No newline at end of file diff --git a/erpnext/home/page/desktop/desktop.js b/erpnext/home/page/desktop/desktop.js index 0db20fb0c6..9ba5253e41 100644 --- a/erpnext/home/page/desktop/desktop.js +++ b/erpnext/home/page/desktop/desktop.js @@ -126,6 +126,7 @@ erpnext.desktop.show_pending_notifications = function() { add_circle('todo', 'things_todo', 'Things To Do'); add_circle('calendar', 'todays_events', 'Todays Events'); add_circle('project', 'open_tasks', 'Open Tasks'); + add_circle('kb', 'unanswered_questions', 'Unanswered Questions'); erpnext.update_messages(); diff --git a/erpnext/patches/august_2012/__init__.py b/erpnext/patches/august_2012/__init__.py new file mode 100644 index 0000000000..baffc48825 --- /dev/null +++ b/erpnext/patches/august_2012/__init__.py @@ -0,0 +1 @@ +from __future__ import unicode_literals diff --git a/erpnext/patches/august_2012/report_supplier_quotations.py b/erpnext/patches/august_2012/report_supplier_quotations.py new file mode 100644 index 0000000000..8eaf707c4c --- /dev/null +++ b/erpnext/patches/august_2012/report_supplier_quotations.py @@ -0,0 +1,4 @@ +from __future__ import unicode_literals +def execute(): + from webnotes.modules import reload_doc + reload_doc("buying", "report", "supplier_quotations") diff --git a/erpnext/patches/july_2012/repost_stock_due_to_wrong_packing_list.py b/erpnext/patches/july_2012/repost_stock_due_to_wrong_packing_list.py index 51976d0129..b552021cc4 100644 --- a/erpnext/patches/july_2012/repost_stock_due_to_wrong_packing_list.py +++ b/erpnext/patches/july_2012/repost_stock_due_to_wrong_packing_list.py @@ -41,7 +41,8 @@ def repost_reserved_qty(): and parenttype="Sales Order" and exists (select * from `tabSales Order` so where name = dnpi_in.parent and docstatus = 1 and status != 'Stopped') - ) dnpi) tab""", (d[0], d[1])) + ) dnpi) tab + where so_item_qty >= so_item_delivered_qty""", (d[0], d[1])) if flt(d[3]) != flt(reserved_qty[0][0]): print d[3], reserved_qty[0][0] diff --git a/erpnext/patches/july_2012/supplier_quotation.py b/erpnext/patches/july_2012/supplier_quotation.py new file mode 100644 index 0000000000..84809e52ba --- /dev/null +++ b/erpnext/patches/july_2012/supplier_quotation.py @@ -0,0 +1,15 @@ +from __future__ import unicode_literals +def execute(): + """sync supplier quotatoin and create supplier quotation mappers""" + from webnotes.model.sync import sync + sync('buying', 'supplier_quotation') + sync('buying', 'supplier_quotation_item') + sync('buying', 'purchase_request') + sync('buying', 'purchase_request_item') + sync('buying', 'purchase_order') + sync('buying', 'purchase_order_item') + + from webnotes.modules import reload_doc + reload_doc('buying', 'DocType Mapper', 'Purchase Request-Supplier Quotation') + reload_doc('buying', 'DocType Mapper', 'Supplier Quotation-Purchase Order') + \ No newline at end of file diff --git a/erpnext/patches/patch_list.py b/erpnext/patches/patch_list.py index d06c2f5d5b..e61a8efc34 100644 --- a/erpnext/patches/patch_list.py +++ b/erpnext/patches/patch_list.py @@ -537,4 +537,12 @@ patch_list = [ 'patch_module': 'patches.july_2012', 'patch_file': 'repost_stock_due_to_wrong_packing_list', }, + { + 'patch_module': 'patches.july_2012', + 'patch_file': 'supplier_quotation', + }, + { + 'patch_module': 'patches.august_2012', + 'patch_file': 'report_supplier_quotations', + }, ] \ No newline at end of file diff --git a/erpnext/startup/startup.js b/erpnext/startup/startup.js index 7594540526..67a7486e40 100644 --- a/erpnext/startup/startup.js +++ b/erpnext/startup/startup.js @@ -132,6 +132,7 @@ erpnext.update_messages = function(reset) { show_in_circle('things_todo', r.message.things_todo); show_in_circle('todays_events', r.message.todays_events); show_in_circle('open_tasks', r.message.open_tasks); + show_in_circle('unanswered_questions', r.message.unanswered_questions); } else { clearInterval(wn.updates.id); diff --git a/erpnext/startup/startup.py b/erpnext/startup/startup.py index c990207fe9..0ae31141fe 100644 --- a/erpnext/startup/startup.py +++ b/erpnext/startup/startup.py @@ -12,9 +12,7 @@ def get_unread_messages(): """, webnotes.user.name, as_list=1) def get_open_support_tickets(): - """ - Returns a count of open support tickets - """ + """Returns a count of open support tickets""" from webnotes.utils import cint open_support_tickets = webnotes.conn.sql("""\ SELECT COUNT(*) FROM `tabSupport Ticket` @@ -22,18 +20,14 @@ def get_open_support_tickets(): return open_support_tickets and cint(open_support_tickets[0][0]) or 0 def get_open_tasks(): - """ - Returns a count of open tasks - """ + """Returns a count of open tasks""" from webnotes.utils import cint return webnotes.conn.sql("""\ SELECT COUNT(*) FROM `tabTask` WHERE status = 'Open'""")[0][0] def get_things_todo(): - """ - Returns a count of incomplete todos - """ + """Returns a count of incomplete todos""" from webnotes.utils import cint incomplete_todos = webnotes.conn.sql("""\ SELECT COUNT(*) FROM `tabToDo` @@ -42,9 +36,7 @@ def get_things_todo(): return incomplete_todos and cint(incomplete_todos[0][0]) or 0 def get_todays_events(): - """ - Returns a count of todays events in calendar - """ + """Returns a count of todays events in calendar""" from webnotes.utils import nowdate, cint todays_events = webnotes.conn.sql("""\ SELECT COUNT(*) FROM `tabEvent` @@ -54,6 +46,11 @@ def get_todays_events(): webnotes.session.get('user'), nowdate())) return todays_events and cint(todays_events[0][0]) or 0 +def get_unanswered_questions(): + return len(filter(lambda d: d[0]==0, + webnotes.conn.sql("""select (select count(*) from tabAnswer + where tabAnswer.question = tabQuestion.name) as answers from tabQuestion"""))) + @webnotes.whitelist() def get_global_status_messages(arg=None): return { @@ -61,5 +58,6 @@ def get_global_status_messages(arg=None): 'open_support_tickets': get_open_support_tickets(), 'things_todo': get_things_todo(), 'todays_events': get_todays_events(), - 'open_tasks': get_open_tasks() + 'open_tasks': get_open_tasks(), + 'unanswered_questions': get_unanswered_questions() } diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index 85069ef872..6a0f200698 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -223,7 +223,7 @@ class DocType: import website.utils # if same name, do not repeat twice - if self.doc.name == self.doc.item_name: + if self.doc.name == self.doc.item_name or not self.doc.item_name: page_name = self.doc.name else: page_name = self.doc.name + " " + self.doc.item_name diff --git a/erpnext/utilities/page/kb_common/kb_common.js b/erpnext/utilities/page/kb_common/kb_common.js index d77a938e0e..9d6b7e8e0b 100644 --- a/erpnext/utilities/page/kb_common/kb_common.js +++ b/erpnext/utilities/page/kb_common/kb_common.js @@ -25,6 +25,7 @@ KBItemToolbar = function(args, kb) { this.wrapper = $a(this.parent, 'div', '', {}); this.line1 = $a(this.wrapper, 'div', '', {color: '#888', fontSize:'11px', margin:'7px 0px'}); this.make_timestamp(); + this.make_answers(); if(this.with_tags) this.make_tags(); this.setup_del(); @@ -43,6 +44,18 @@ KBItemToolbar = function(args, kb) { } } + this.make_answers = function() { + if(this.doctype=='Question') { + if(this.det.answers==0) { + this.line1.innerHTML += ' | no answers'; + } else if(this.det.answers==1) { + this.line1.innerHTML += ' | 1 answer'; + } else { + this.line1.innerHTML += ' | '+this.det.answers+' answers'; + } + } + } + this.make_tags = function() { this.line1.innerHTML += ' | ' this.tags_area = $a(this.line1, 'span', 'kb-tags') @@ -80,7 +93,7 @@ EditableText = function(args) {
\ [edit]\ \ - \ \ Cancel\ diff --git a/erpnext/utilities/page/markdown_reference/__init__.py b/erpnext/utilities/page/markdown_reference/__init__.py new file mode 100644 index 0000000000..baffc48825 --- /dev/null +++ b/erpnext/utilities/page/markdown_reference/__init__.py @@ -0,0 +1 @@ +from __future__ import unicode_literals diff --git a/erpnext/utilities/page/markdown_reference/markdown_reference.css b/erpnext/utilities/page/markdown_reference/markdown_reference.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/utilities/page/markdown_reference/markdown_reference.html b/erpnext/utilities/page/markdown_reference/markdown_reference.html new file mode 100644 index 0000000000..5af414f275 --- /dev/null +++ b/erpnext/utilities/page/markdown_reference/markdown_reference.html @@ -0,0 +1,150 @@ +*italic* **bold**
+_italic_ __bold__
+
+
+Inline:
+ +An [example](http://url.com/ "Title")
+
+
+Reference-style labels (titles are optional):
+ +An [example][id]. Then, anywhere
+else in the doc, define the link:
+
+ [id]: http://example.com/ "Title"
+
+
+Inline (titles are optional):
+ +
+
+
+Reference-style:
+ +![alt text][id]
+
+ [id]: /url/to/img.jpg "Title"
+
+
+Setext-style:
+ +Header 1
+========
+
+Header 2
+--------
+
+
+
+atx-style (closing #'s are optional):
+ +# Header 1 #
+
+
+
+
+Ordered, without paragraphs:
+ +1. Foo
+2. Bar
+
+
+Unordered, with paragraphs:
+ +* A list item.
+
+ With multiple paragraphs.
+
+* Bar
+
+
+You can nest them:
+ +* Abacus
+ * ass
+* Bastard
+ 1. bitch
+ 2. bupkis
+ * BELITTLER
+ 3. burper
+* Cunning
+
+
+> Email-style angle brackets
+
+> are used for blockquotes.
+
+> > And, they can be nested.
+
+> >
+> * You can quote a list.
+> * Etc.
+
+
+`<code>` spans are delimited
+by backticks.
+
+You can include literal backticks
+like `` `this` ``.
+
+
+Indent every line of a code block by at least 4 spaces or 1 tab, and use a colon at the end of the preceding paragraph.
+ +This is a normal paragraph:
+
+ This is a preformatted
+ code block.
+
+Preceded by a space, the colon
+disappears. :
+
+ This is a preformatted
+ code block.
+
+
+Three or more dashes or asterisks:
+ +---
+
+* * *
+
+- - - -
+
+
+End a line with two or more spaces:
+ +Roses are red,
+Violets are blue.
+
+