Merge branch 'responsive' of git://github.com/webnotes/erpnext into responsive
diff --git a/accounts/DocType Mapper/Purchase Order-Purchase Invoice/Purchase Order-Purchase Invoice.txt b/accounts/DocType Mapper/Purchase Order-Purchase Invoice/Purchase Order-Purchase Invoice.txt
index ce45824..8c11d50 100644
--- a/accounts/DocType Mapper/Purchase Order-Purchase Invoice/Purchase Order-Purchase Invoice.txt
+++ b/accounts/DocType Mapper/Purchase Order-Purchase Invoice/Purchase Order-Purchase Invoice.txt
@@ -1,122 +1,122 @@
[
{
- "owner": "Administrator",
- "docstatus": 0,
"creation": "2010-08-08 17:09:35",
+ "docstatus": 0,
+ "modified": "2013-07-03 18:00:40",
"modified_by": "Administrator",
- "modified": "2012-04-03 12:49:50"
+ "owner": "Administrator"
},
{
- "name": "__common__",
- "parent": "Purchase Order-Purchase Invoice",
"doctype": "Table Mapper Detail",
- "parenttype": "DocType Mapper",
- "parentfield": "table_mapper_details"
- },
- {
"name": "__common__",
"parent": "Purchase Order-Purchase Invoice",
- "doctype": "Field Mapper Detail",
- "parenttype": "DocType Mapper",
- "parentfield": "field_mapper_details"
+ "parentfield": "table_mapper_details",
+ "parenttype": "DocType Mapper"
},
{
+ "doctype": "Field Mapper Detail",
"name": "__common__",
- "to_doctype": "Purchase Invoice",
- "module": "Accounts",
+ "parent": "Purchase Order-Purchase Invoice",
+ "parentfield": "field_mapper_details",
+ "parenttype": "DocType Mapper"
+ },
+ {
"doctype": "DocType Mapper",
+ "from_doctype": "Purchase Order",
+ "module": "Accounts",
+ "name": "__common__",
"ref_doc_submitted": 1,
- "from_doctype": "Purchase Order"
+ "to_doctype": "Purchase Invoice"
},
{
- "name": "Purchase Order-Purchase Invoice",
- "doctype": "DocType Mapper"
+ "doctype": "DocType Mapper",
+ "name": "Purchase Order-Purchase Invoice"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "eval: (flt(obj.amount) - flt(obj.billed_amt)) / obj.purchase_rate",
"map": "Yes",
"match_id": 1,
- "to_field": "qty",
- "doctype": "Field Mapper Detail",
- "from_field": "eval: flt(obj.qty) - flt(obj.billed_qty)"
+ "to_field": "qty"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "purchase_rate",
"map": "Yes",
"match_id": 1,
- "to_field": "rate",
- "doctype": "Field Mapper Detail",
- "from_field": "purchase_rate"
+ "to_field": "rate"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "eval: flt(obj.amount) - flt(obj.billed_amt)",
"map": "Yes",
"match_id": 1,
- "to_field": "amount",
- "doctype": "Field Mapper Detail",
- "from_field": "eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.purchase_rate)"
+ "to_field": "amount"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "eval: (flt(obj.amount) - flt(obj.billed_amt)) / flt(obj.conversion_rate)",
"map": "Yes",
"match_id": 1,
- "to_field": "import_amount",
- "doctype": "Field Mapper Detail",
- "from_field": "eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.import_rate)"
+ "to_field": "import_amount"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "parent",
"map": "Yes",
"match_id": 1,
- "to_field": "purchase_order",
- "doctype": "Field Mapper Detail",
- "from_field": "parent"
+ "to_field": "purchase_order"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "name",
"map": "Yes",
"match_id": 1,
- "to_field": "po_detail",
- "doctype": "Field Mapper Detail",
- "from_field": "name"
+ "to_field": "po_detail"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "naming_series",
"map": "No",
"match_id": 0,
- "to_field": "naming_series",
- "doctype": "Field Mapper Detail",
- "from_field": "naming_series"
+ "to_field": "naming_series"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "total_tax",
"map": "Yes",
"match_id": 0,
- "to_field": "total_tax",
- "doctype": "Field Mapper Detail",
- "from_field": "total_tax"
+ "to_field": "total_tax"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "conversion_rate",
"map": "Yes",
"match_id": 0,
- "to_field": "conversion_rate",
- "doctype": "Field Mapper Detail",
- "from_field": "conversion_rate"
+ "to_field": "conversion_rate"
},
{
- "match_id": 0,
"doctype": "Table Mapper Detail",
"from_table": "Purchase Order",
+ "match_id": 0,
"to_table": "Purchase Invoice",
"validation_logic": "docstatus =1"
},
{
- "match_id": 1,
- "to_field": "entries",
"doctype": "Table Mapper Detail",
"from_field": "po_details",
"from_table": "Purchase Order Item",
+ "match_id": 1,
+ "to_field": "entries",
"to_table": "Purchase Invoice Item",
- "validation_logic": "ifnull(billed_qty,0) < qty and docstatus = 1"
+ "validation_logic": "ifnull(billed_amt,0) < amount and docstatus = 1"
},
{
- "match_id": 2,
- "to_field": "purchase_tax_details",
"doctype": "Table Mapper Detail",
"from_field": "purchase_tax_details",
"from_table": "Purchase Taxes and Charges",
+ "match_id": 2,
+ "to_field": "purchase_tax_details",
"to_table": "Purchase Taxes and Charges",
"validation_logic": "docstatus =1"
}
diff --git a/accounts/DocType Mapper/Purchase Receipt-Purchase Invoice/Purchase Receipt-Purchase Invoice.txt b/accounts/DocType Mapper/Purchase Receipt-Purchase Invoice/Purchase Receipt-Purchase Invoice.txt
index f6c87e2..99c74ac 100644
--- a/accounts/DocType Mapper/Purchase Receipt-Purchase Invoice/Purchase Receipt-Purchase Invoice.txt
+++ b/accounts/DocType Mapper/Purchase Receipt-Purchase Invoice/Purchase Receipt-Purchase Invoice.txt
@@ -1,143 +1,143 @@
[
{
- "owner": "Administrator",
- "docstatus": 0,
"creation": "2010-08-08 17:09:35",
+ "docstatus": 0,
+ "modified": "2013-07-03 17:56:30",
"modified_by": "Administrator",
- "modified": "2012-04-03 12:49:50"
+ "owner": "Administrator"
},
{
- "name": "__common__",
- "parent": "Purchase Receipt-Purchase Invoice",
"doctype": "Table Mapper Detail",
- "parenttype": "DocType Mapper",
- "parentfield": "table_mapper_details"
- },
- {
"name": "__common__",
"parent": "Purchase Receipt-Purchase Invoice",
- "doctype": "Field Mapper Detail",
- "parenttype": "DocType Mapper",
- "parentfield": "field_mapper_details"
+ "parentfield": "table_mapper_details",
+ "parenttype": "DocType Mapper"
},
{
+ "doctype": "Field Mapper Detail",
"name": "__common__",
- "to_doctype": "Purchase Invoice",
- "module": "Accounts",
+ "parent": "Purchase Receipt-Purchase Invoice",
+ "parentfield": "field_mapper_details",
+ "parenttype": "DocType Mapper"
+ },
+ {
"doctype": "DocType Mapper",
+ "from_doctype": "Purchase Receipt",
+ "module": "Accounts",
+ "name": "__common__",
"ref_doc_submitted": 1,
- "from_doctype": "Purchase Receipt"
+ "to_doctype": "Purchase Invoice"
},
{
- "name": "Purchase Receipt-Purchase Invoice",
- "doctype": "DocType Mapper"
+ "doctype": "DocType Mapper",
+ "name": "Purchase Receipt-Purchase Invoice"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "eval: (flt(obj.amount) - flt(obj.billed_amt)) / obj.purchase_rate",
"map": "Yes",
"match_id": 1,
- "to_field": "qty",
- "doctype": "Field Mapper Detail",
- "from_field": "eval: flt(obj.qty) - flt(obj.billed_qty)"
+ "to_field": "qty"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "purchase_rate",
"map": "Yes",
"match_id": 1,
- "to_field": "rate",
- "doctype": "Field Mapper Detail",
- "from_field": "purchase_rate"
+ "to_field": "rate"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "eval: flt(obj.amount) - flt(obj.billed_amt)",
"map": "Yes",
"match_id": 1,
- "to_field": "amount",
- "doctype": "Field Mapper Detail",
- "from_field": "eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.purchase_rate)"
+ "to_field": "amount"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "eval: (flt(obj.amount) - flt(obj.billed_amt)) / flt(obj.conversion_rate)",
"map": "Yes",
"match_id": 1,
- "to_field": "import_amount",
- "doctype": "Field Mapper Detail",
- "from_field": "eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.import_rate)"
+ "to_field": "import_amount"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "parent",
"map": "Yes",
"match_id": 1,
- "to_field": "purchase_receipt",
- "doctype": "Field Mapper Detail",
- "from_field": "parent"
+ "to_field": "purchase_receipt"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "prevdoc_docname",
"map": "Yes",
"match_id": 1,
- "to_field": "purchase_order",
- "doctype": "Field Mapper Detail",
- "from_field": "prevdoc_docname"
+ "to_field": "purchase_order"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "name",
"map": "Yes",
"match_id": 1,
- "to_field": "pr_detail",
- "doctype": "Field Mapper Detail",
- "from_field": "name"
+ "to_field": "pr_detail"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "prevdoc_detail_docname",
"map": "Yes",
"match_id": 1,
- "to_field": "po_detail",
- "doctype": "Field Mapper Detail",
- "from_field": "prevdoc_detail_docname"
+ "to_field": "po_detail"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "naming_series",
"map": "No",
"match_id": 0,
- "to_field": "naming_series",
- "doctype": "Field Mapper Detail",
- "from_field": "naming_series"
+ "to_field": "naming_series"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "net_total",
"map": "Yes",
"match_id": 0,
- "to_field": "net_total",
- "doctype": "Field Mapper Detail",
- "from_field": "net_total"
+ "to_field": "net_total"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "grand_total",
"map": "Yes",
"match_id": 0,
- "to_field": "grand_total",
- "doctype": "Field Mapper Detail",
- "from_field": "grand_total"
+ "to_field": "grand_total"
},
{
+ "doctype": "Field Mapper Detail",
+ "from_field": "total_tax",
"map": "Yes",
"match_id": 0,
- "to_field": "total_tax",
- "doctype": "Field Mapper Detail",
- "from_field": "total_tax"
+ "to_field": "total_tax"
},
{
- "match_id": 1,
- "to_field": "entries",
"doctype": "Table Mapper Detail",
"from_field": "purchase_receipt_details",
"from_table": "Purchase Receipt Item",
+ "match_id": 1,
+ "to_field": "entries",
"to_table": "Purchase Invoice Item",
- "validation_logic": "ifnull(billed_qty,0) < qty"
+ "validation_logic": "ifnull(billed_amt,0) < amount"
},
{
- "match_id": 0,
"doctype": "Table Mapper Detail",
"from_table": "Purchase Receipt",
+ "match_id": 0,
"to_table": "Purchase Invoice",
"validation_logic": "docstatus=1"
},
{
- "match_id": 2,
- "to_field": "purchase_tax_details",
"doctype": "Table Mapper Detail",
"from_field": "purchase_tax_details",
"from_table": "Purchase Taxes and Charges",
+ "match_id": 2,
+ "to_field": "purchase_tax_details",
"to_table": "Purchase Taxes and Charges",
"validation_logic": "docstatus=1"
}
diff --git a/buying/doctype/purchase_common/purchase_common.js b/buying/doctype/purchase_common/purchase_common.js
index f9694d0..c8e4aa3 100644
--- a/buying/doctype/purchase_common/purchase_common.js
+++ b/buying/doctype/purchase_common/purchase_common.js
@@ -53,6 +53,12 @@
});
},
+ refresh: function(doc) {
+ this.frm.toggle_display("supplier_name",
+ (this.supplier_name && this.frm.doc.supplier_name!==this.frm.doc.supplier));
+ this._super();
+ },
+
supplier: function() {
if(this.frm.doc.supplier || this.frm.doc.credit_to) {
if(!this.frm.doc.company) {
diff --git a/buying/doctype/purchase_order/purchase_order.txt b/buying/doctype/purchase_order/purchase_order.txt
index b78552f..b2bf146 100644
--- a/buying/doctype/purchase_order/purchase_order.txt
+++ b/buying/doctype/purchase_order/purchase_order.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-21 16:16:39",
"docstatus": 0,
- "modified": "2013-06-11 16:05:08",
+ "modified": "2013-07-04 10:48:54",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -40,6 +40,13 @@
"name": "Purchase Order"
},
{
+ "doctype": "DocField",
+ "fieldname": "supplier_section",
+ "fieldtype": "Section Break",
+ "label": "Supplier",
+ "options": "icon-user"
+ },
+ {
"description": "To manage multiple series please go to Setup > Manage Series",
"doctype": "DocField",
"fieldname": "naming_series",
@@ -67,7 +74,6 @@
"search_index": 1
},
{
- "depends_on": "supplier",
"doctype": "DocField",
"fieldname": "supplier_name",
"fieldtype": "Data",
@@ -77,38 +83,34 @@
"read_only": 1
},
{
- "depends_on": "supplier",
"doctype": "DocField",
"fieldname": "address_display",
"fieldtype": "Small Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Address",
"read_only": 1
},
{
- "depends_on": "supplier",
"doctype": "DocField",
"fieldname": "contact_display",
"fieldtype": "Small Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Contact",
"read_only": 1
},
{
- "depends_on": "supplier",
"doctype": "DocField",
"fieldname": "contact_mobile",
"fieldtype": "Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Mobile No",
"read_only": 1
},
{
- "depends_on": "supplier",
"doctype": "DocField",
"fieldname": "contact_email",
"fieldtype": "Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Contact Email",
"print_hide": 1,
"read_only": 1
@@ -139,7 +141,8 @@
"fieldname": "items",
"fieldtype": "Section Break",
"label": "Items",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-shopping-cart"
},
{
"allow_on_submit": 1,
@@ -155,8 +158,7 @@
{
"doctype": "DocField",
"fieldname": "sb_last_purchase",
- "fieldtype": "Section Break",
- "options": "Simple"
+ "fieldtype": "Section Break"
},
{
"doctype": "DocField",
@@ -238,7 +240,8 @@
"doctype": "DocField",
"fieldname": "price_list_and_currency",
"fieldtype": "Section Break",
- "label": "Currency & Price List"
+ "label": "Currency & Price List",
+ "options": "icon-tag"
},
{
"doctype": "DocField",
@@ -309,6 +312,7 @@
"fieldtype": "Section Break",
"label": "Taxes",
"oldfieldtype": "Section Break",
+ "options": "icon-money",
"print_hide": 0
},
{
@@ -364,7 +368,8 @@
"fieldname": "totals",
"fieldtype": "Section Break",
"label": "Totals",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-money"
},
{
"doctype": "DocField",
@@ -523,7 +528,8 @@
"fieldname": "terms_section_break",
"fieldtype": "Section Break",
"label": "Terms and Conditions",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-legal"
},
{
"doctype": "DocField",
@@ -555,7 +561,8 @@
"doctype": "DocField",
"fieldname": "contact_section",
"fieldtype": "Section Break",
- "label": "Contact Info"
+ "label": "Contact Info",
+ "options": "icon-bullhorn"
},
{
"doctype": "DocField",
@@ -759,8 +766,9 @@
"doctype": "DocField",
"fieldname": "raw_material_details",
"fieldtype": "Section Break",
- "label": "Raw Material Details",
+ "label": "Raw Materials Supplied",
"oldfieldtype": "Section Break",
+ "options": "icon-truck",
"print_hide": 1
},
{
diff --git a/buying/doctype/supplier/supplier.js b/buying/doctype/supplier/supplier.js
index 901b3cc..5374d50 100644
--- a/buying/doctype/supplier/supplier.js
+++ b/buying/doctype/supplier/supplier.js
@@ -45,7 +45,7 @@
}
cur_frm.cscript.make_dashboard = function(doc) {
- cur_frm.dashboard.wrapper.empty().toggle(doc.__islocal ? false : true);
+ cur_frm.dashboard.reset();
if(doc.__islocal)
return;
cur_frm.dashboard.set_headline('<span class="text-muted">Loading...</span>')
diff --git a/buying/doctype/supplier/supplier.txt b/buying/doctype/supplier/supplier.txt
index 95fa717..3d71e1d 100644
--- a/buying/doctype/supplier/supplier.txt
+++ b/buying/doctype/supplier/supplier.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-01-10 16:34:11",
"docstatus": 0,
- "modified": "2013-01-29 14:35:42",
+ "modified": "2013-07-04 10:13:19",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -46,7 +46,8 @@
"fieldname": "basic_info",
"fieldtype": "Section Break",
"label": "Basic Info",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-user"
},
{
"doctype": "DocField",
@@ -91,7 +92,8 @@
"fieldname": "address_contacts",
"fieldtype": "Section Break",
"label": "Address & Contacts",
- "oldfieldtype": "Column Break"
+ "oldfieldtype": "Column Break",
+ "options": "icon-map-marker"
},
{
"depends_on": "eval:doc.__islocal",
@@ -132,7 +134,9 @@
{
"doctype": "DocField",
"fieldname": "communication_history",
- "fieldtype": "Section Break"
+ "fieldtype": "Section Break",
+ "label": "Communication History",
+ "options": "icon-comments"
},
{
"doctype": "DocField",
@@ -145,7 +149,8 @@
"fieldname": "more_info",
"fieldtype": "Section Break",
"label": "More Info",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-file-text"
},
{
"description": "Enter the company name under which Account Head will be created for this Supplier",
diff --git a/buying/doctype/supplier_quotation/supplier_quotation.txt b/buying/doctype/supplier_quotation/supplier_quotation.txt
index 072b146..d9ecf60 100644
--- a/buying/doctype/supplier_quotation/supplier_quotation.txt
+++ b/buying/doctype/supplier_quotation/supplier_quotation.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-21 16:16:45",
"docstatus": 0,
- "modified": "2013-06-11 16:05:53",
+ "modified": "2013-07-04 10:51:05",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -40,6 +40,13 @@
"name": "Supplier Quotation"
},
{
+ "doctype": "DocField",
+ "fieldname": "supplier_section",
+ "fieldtype": "Section Break",
+ "label": "Supplier",
+ "options": "icon-user"
+ },
+ {
"description": "To manage multiple series please go to Setup > Manage Series",
"doctype": "DocField",
"fieldname": "naming_series",
@@ -67,7 +74,6 @@
"search_index": 1
},
{
- "depends_on": "supplier",
"doctype": "DocField",
"fieldname": "supplier_name",
"fieldtype": "Data",
@@ -77,38 +83,34 @@
"read_only": 1
},
{
- "depends_on": "supplier",
"doctype": "DocField",
"fieldname": "address_display",
"fieldtype": "Small Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Address",
"read_only": 1
},
{
- "depends_on": "supplier",
"doctype": "DocField",
"fieldname": "contact_display",
"fieldtype": "Small Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Contact",
"read_only": 1
},
{
- "depends_on": "supplier",
"doctype": "DocField",
"fieldname": "contact_mobile",
"fieldtype": "Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Mobile No",
"read_only": 1
},
{
- "depends_on": "supplier",
"doctype": "DocField",
"fieldname": "contact_email",
"fieldtype": "Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Contact Email",
"print_hide": 1,
"read_only": 1
@@ -139,7 +141,8 @@
"fieldname": "items",
"fieldtype": "Section Break",
"label": "Items",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-shopping-cart"
},
{
"allow_on_submit": 1,
@@ -155,8 +158,7 @@
{
"doctype": "DocField",
"fieldname": "section_break0",
- "fieldtype": "Section Break",
- "options": "Simple"
+ "fieldtype": "Section Break"
},
{
"doctype": "DocField",
@@ -168,8 +170,7 @@
{
"doctype": "DocField",
"fieldname": "section_break_14",
- "fieldtype": "Section Break",
- "options": "Simple"
+ "fieldtype": "Section Break"
},
{
"description": "You can make a purchase order from multiple Material Requests. Select Material Requests one by one and click on the button below.",
@@ -197,7 +198,8 @@
"doctype": "DocField",
"fieldname": "currency_price_list",
"fieldtype": "Section Break",
- "label": "Currency & Price List"
+ "label": "Currency & Price List",
+ "options": "icon-tag"
},
{
"description": "Supplier's currency",
@@ -264,7 +266,8 @@
"fieldname": "taxes",
"fieldtype": "Section Break",
"label": "Taxes",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-money"
},
{
"description": "If you have created a standard template in Purchase Taxes and Charges Master, select one and click on the button below.",
@@ -319,7 +322,8 @@
"fieldname": "totals",
"fieldtype": "Section Break",
"label": "Totals",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-money"
},
{
"doctype": "DocField",
@@ -478,7 +482,8 @@
"fieldname": "terms_section_break",
"fieldtype": "Section Break",
"label": "Terms and Conditions",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-legal"
},
{
"allow_on_submit": 1,
@@ -512,7 +517,7 @@
"doctype": "DocField",
"fieldname": "terms",
"fieldtype": "Text Editor",
- "label": "Terms and Conditions1",
+ "label": "Terms and Conditions",
"oldfieldname": "terms",
"oldfieldtype": "Text Editor"
},
@@ -521,7 +526,8 @@
"doctype": "DocField",
"fieldname": "contact_section",
"fieldtype": "Section Break",
- "label": "Contact Info"
+ "label": "Contact Info",
+ "options": "icon-bullhorn"
},
{
"doctype": "DocField",
@@ -546,7 +552,8 @@
"fieldname": "more_info",
"fieldtype": "Section Break",
"label": "More Info",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-file-text"
},
{
"doctype": "DocField",
@@ -586,6 +593,11 @@
"report_hide": 0
},
{
+ "doctype": "DocField",
+ "fieldname": "column_break_57",
+ "fieldtype": "Column Break"
+ },
+ {
"description": "Select the relevant company name if you have multiple companies",
"doctype": "DocField",
"fieldname": "company",
diff --git a/controllers/selling_controller.py b/controllers/selling_controller.py
index 087df34..140e0c0 100644
--- a/controllers/selling_controller.py
+++ b/controllers/selling_controller.py
@@ -262,7 +262,9 @@
def validate_order_type(self):
valid_types = ["Sales", "Maintenance", "Shopping Cart"]
- if self.doc.order_type not in valid_types:
+ if not self.doc.order_type:
+ self.doc.order_type = "Sales"
+ elif self.doc.order_type not in valid_types:
msgprint(_(self.meta.get_label("order_type")) + " " +
_("must be one of") + ": " + comma_or(valid_types),
raise_exception=True)
diff --git a/manufacturing/doctype/production_order/production_order.js b/manufacturing/doctype/production_order/production_order.js
index 5243026..4c41d94 100644
--- a/manufacturing/doctype/production_order/production_order.js
+++ b/manufacturing/doctype/production_order/production_order.js
@@ -20,20 +20,19 @@
}
cur_frm.cscript.refresh = function(doc, dt, dn) {
+ cur_frm.dashboard.reset();
erpnext.hide_naming_series();
cur_frm.set_intro("");
cfn_set_fields(doc, dt, dn);
+
if(doc.docstatus===0 && !doc.__islocal) {
cur_frm.set_intro("Submit this Production Order for further processing.");
} else if(doc.docstatus===1) {
+ var percent = flt(doc.produced_qty) / doc.qty * 100;
+ cur_frm.dashboard.add_progress(cint(percent) + "% " + wn._("Complete"));
+
if(doc.status === "Stopped") {
- cur_frm.set_intro("This Production Order is Stopped.");
- } else {
- if(doc.produced_qty == doc.qty) {
- cur_frm.set_intro("This Production Order is Completed.");
- } else {
- cur_frm.set_intro("This Production Order is in progress.");
- }
+ cur_frm.dashboard.set_headline_alert(wn._("Stopped"), "alert-danger", "icon-stop");
}
}
}
@@ -88,6 +87,12 @@
var se = wn.model.get_new_doc("Stock Entry");
se.purpose = purpose;
se.production_order = doc.name;
+ if(purpose==="Material Transfer") {
+ se.to_warehouse = doc.wip_warehouse;
+ } else {
+ se.from_warehouse = doc.wip_warehouse;
+ se.to_warehouse = doc.fg_warehouse;
+ }
se.company = doc.company;
se.fg_completed_qty = doc.qty - doc.produced_qty;
se.bom_no = doc.bom_no;
diff --git a/manufacturing/doctype/production_order/production_order.txt b/manufacturing/doctype/production_order/production_order.txt
index 38a98fe..08123e8 100644
--- a/manufacturing/doctype/production_order/production_order.txt
+++ b/manufacturing/doctype/production_order/production_order.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-01-10 16:34:16",
"docstatus": 0,
- "modified": "2013-07-02 11:56:54",
+ "modified": "2013-07-03 17:00:29",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -43,6 +43,13 @@
"name": "Production Order"
},
{
+ "doctype": "DocField",
+ "fieldname": "item",
+ "fieldtype": "Section Break",
+ "label": "Item",
+ "options": "icon-gift"
+ },
+ {
"default": "PRO",
"doctype": "DocField",
"fieldname": "naming_series",
@@ -52,22 +59,6 @@
"reqd": 1
},
{
- "depends_on": "eval:!doc.__islocal",
- "doctype": "DocField",
- "fieldname": "status",
- "fieldtype": "Select",
- "in_filter": 1,
- "in_list_view": 1,
- "label": "Status",
- "no_copy": 1,
- "oldfieldname": "status",
- "oldfieldtype": "Select",
- "options": "\nDraft\nSubmitted\nStopped\nIn Process\nCompleted\nCancelled",
- "read_only": 1,
- "reqd": 1,
- "search_index": 1
- },
- {
"doctype": "DocField",
"fieldname": "production_item",
"fieldtype": "Link",
@@ -95,24 +86,12 @@
"reqd": 1
},
{
- "depends_on": "production_item",
- "description": "Manufactured quantity will be updated in this warehouse",
+ "default": "1",
+ "description": "If checked, BOM for sub-assembly items will be considered for getting raw materials. Otherwise, all sub-assembly items will be treated as a raw material.",
"doctype": "DocField",
- "fieldname": "fg_warehouse",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "For Warehouse",
- "options": "Warehouse",
- "read_only": 0,
- "reqd": 1
- },
- {
- "doctype": "DocField",
- "fieldname": "wip_warehouse",
- "fieldtype": "Link",
- "label": "Work-in-Progress Warehouse",
- "options": "Warehouse",
- "reqd": 1
+ "fieldname": "use_multi_level_bom",
+ "fieldtype": "Check",
+ "label": "Use Multi-Level BOM"
},
{
"doctype": "DocField",
@@ -123,6 +102,15 @@
"width": "50%"
},
{
+ "description": "Manufacture against Sales Order",
+ "doctype": "DocField",
+ "fieldname": "sales_order",
+ "fieldtype": "Link",
+ "label": "Sales Order",
+ "options": "Sales Order",
+ "read_only": 0
+ },
+ {
"depends_on": "production_item",
"doctype": "DocField",
"fieldname": "qty",
@@ -147,38 +135,60 @@
"read_only": 1
},
{
- "depends_on": "production_item",
"doctype": "DocField",
- "fieldname": "stock_uom",
- "fieldtype": "Data",
- "label": "Stock UOM",
- "oldfieldname": "stock_uom",
- "oldfieldtype": "Data",
- "read_only": 1
+ "fieldname": "warehouses",
+ "fieldtype": "Section Break",
+ "label": "Warehouses",
+ "options": "icon-building"
},
{
- "default": "1",
- "description": "If checked, BOM for sub-assembly items will be considered for getting raw materials. Otherwise, all sub-assembly items will be treated as a raw material.",
+ "depends_on": "production_item",
+ "description": "Manufactured quantity will be updated in this warehouse",
"doctype": "DocField",
- "fieldname": "use_multi_level_bom",
- "fieldtype": "Check",
- "label": "Use Multi-Level BOM"
+ "fieldname": "fg_warehouse",
+ "fieldtype": "Link",
+ "in_list_view": 1,
+ "label": "For Warehouse",
+ "options": "Warehouse",
+ "read_only": 0,
+ "reqd": 1
+ },
+ {
+ "doctype": "DocField",
+ "fieldname": "column_break_12",
+ "fieldtype": "Column Break"
+ },
+ {
+ "doctype": "DocField",
+ "fieldname": "wip_warehouse",
+ "fieldtype": "Link",
+ "label": "Work-in-Progress Warehouse",
+ "options": "Warehouse",
+ "reqd": 1
},
{
"doctype": "DocField",
"fieldname": "more_info",
"fieldtype": "Section Break",
"label": "More Info",
+ "options": "icon-file-text",
"read_only": 0
},
{
- "description": "Manufacture against Sales Order",
+ "depends_on": "eval:!doc.__islocal",
"doctype": "DocField",
- "fieldname": "sales_order",
- "fieldtype": "Link",
- "label": "Sales Order",
- "options": "Sales Order",
- "read_only": 0
+ "fieldname": "status",
+ "fieldtype": "Select",
+ "in_filter": 1,
+ "in_list_view": 1,
+ "label": "Status",
+ "no_copy": 1,
+ "oldfieldname": "status",
+ "oldfieldtype": "Select",
+ "options": "\nDraft\nSubmitted\nStopped\nIn Process\nCompleted\nCancelled",
+ "read_only": 1,
+ "reqd": 1,
+ "search_index": 1
},
{
"doctype": "DocField",
@@ -206,6 +216,16 @@
"width": "50%"
},
{
+ "depends_on": "production_item",
+ "doctype": "DocField",
+ "fieldname": "stock_uom",
+ "fieldtype": "Data",
+ "label": "Stock UOM",
+ "oldfieldname": "stock_uom",
+ "oldfieldtype": "Data",
+ "read_only": 1
+ },
+ {
"doctype": "DocField",
"fieldname": "company",
"fieldtype": "Link",
diff --git a/projects/doctype/task/task.py b/projects/doctype/task/task.py
index a76dc9b..1df8547 100644
--- a/projects/doctype/task/task.py
+++ b/projects/doctype/task/task.py
@@ -63,7 +63,8 @@
def on_update(self):
"""update percent complete in project"""
if self.doc.project:
- webnotes.bean("Project", self.doc.project).controller.update_percent_complete()
+ project = webnotes.bean("Project", self.doc.project)
+ project.run_method("update_percent_complete")
@webnotes.whitelist()
def get_events(start, end, filters=None):
diff --git a/selling/doctype/lead/lead.js b/selling/doctype/lead/lead.js
index 3aea4c8..1b51505 100644
--- a/selling/doctype/lead/lead.js
+++ b/selling/doctype/lead/lead.js
@@ -99,38 +99,10 @@
$.extend(cur_frm.cscript, new erpnext.LeadController({frm: cur_frm}));
cur_frm.cscript['Create Customer'] = function(){
- var doc = cur_frm.doc;
- $c('runserverobj',args={ 'method':'check_status', 'docs':wn.model.compress(make_doclist(doc.doctype, doc.name))},
- function(r,rt){
- if(r.message == 'Converted'){
- msgprint("This lead is already converted to customer");
- }
- else{
- n = wn.model.make_new_doc_and_get_name("Customer");
- $c('dt_map', args={
- 'docs':wn.model.compress([locals["Customer"][n]]),
- 'from_doctype':'Lead',
- 'to_doctype':'Customer',
- 'from_docname':doc.name,
- 'from_to_list':"[['Lead', 'Customer']]"
- },
- function(r,rt) {
- wn.model.with_doctype("Customer", function() {
- var customer = wn.model.get_doc("Customer", n);
- var customer_copy = $.extend({}, customer);
-
- var updated = wn.model.set_default_values(customer_copy);
- $.each(updated, function(i, f) {
- if(!customer[f]) customer[f] = customer_copy[f];
- });
-
- loaddoc("Customer", n);
- });
- }
- );
- }
- }
- );
+ wn.model.open_mapped_doc({
+ method: "selling.doctype.lead.lead.make_customer",
+ source_name: cur_frm.doc.name
+ })
}
// Create New Opportunity
diff --git a/selling/doctype/lead/lead.py b/selling/doctype/lead/lead.py
index 928eda7..3a3d8e5 100644
--- a/selling/doctype/lead/lead.py
+++ b/selling/doctype/lead/lead.py
@@ -95,4 +95,24 @@
webnotes.conn.sql("""update `tabSupport Ticket` set lead='' where lead=%s""",
self.doc.name)
- self.delete_events()
\ No newline at end of file
+ self.delete_events()
+
+@webnotes.whitelist()
+def make_customer(source_name, target_doclist=None):
+ from webnotes.model.mapper import get_mapped_doclist
+
+ if target_doclist:
+ target_doclist = json.loads(target_doclist)
+
+ doclist = get_mapped_doclist("Lead", source_name,
+ {"Lead": {
+ "doctype": "Customer",
+ "field_map": {
+ "name": "lead_name",
+ "company_name": "customer_name",
+ "contact_no": "phone_1",
+ "fax": "fax_1"
+ }
+ }}, target_doclist)
+
+ return [d.fields for d in doclist]
\ No newline at end of file
diff --git a/selling/doctype/lead/test_lead.py b/selling/doctype/lead/test_lead.py
index e525547..3fc177f 100644
--- a/selling/doctype/lead/test_lead.py
+++ b/selling/doctype/lead/test_lead.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
test_records = [
[{"doctype":"Lead", "lead_name": "_Test Lead", "status":"Open",
"email_id":"test_lead@example.com"}],
@@ -8,3 +10,17 @@
[{"doctype":"Lead", "lead_name": "_Test Lead 3", "status":"Converted",
"email_id":"test_lead3@example.com"}],
]
+
+import webnotes
+import unittest
+
+class TestLead(unittest.TestCase):
+ def test_make_customer(self):
+ from selling.doctype.lead.lead import make_customer
+
+ customer = make_customer("_T-Lead-00001")
+ self.assertEquals(customer[0]["doctype"], "Customer")
+ self.assertEquals(customer[0]["lead_name"], "_T-Lead-00001")
+
+ webnotes.bean(customer).insert()
+
\ No newline at end of file
diff --git a/selling/doctype/opportunity/opportunity.js b/selling/doctype/opportunity/opportunity.js
index 72afeea..583f25a 100644
--- a/selling/doctype/opportunity/opportunity.js
+++ b/selling/doctype/opportunity/opportunity.js
@@ -25,8 +25,6 @@
cur_frm.dashboard.set_headline_alert(wn._(doc.status), "alert-success", "icon-ok-sign");
} else if(doc.status=="Opportunity Lost") {
cur_frm.dashboard.set_headline_alert(wn._(doc.status), "alert-danger", "icon-exclamation-sign");
- } else {
- cur_frm.dashboard.set_headline_alert(wn._(doc.status), "alert-info", "icon-exclamation-sign");
}
}
diff --git a/selling/doctype/quotation/quotation.js b/selling/doctype/quotation/quotation.js
index fd8c706..259c810 100644
--- a/selling/doctype/quotation/quotation.js
+++ b/selling/doctype/quotation/quotation.js
@@ -43,8 +43,6 @@
cur_frm.dashboard.set_headline_alert(wn._(doc.status), "alert-success", "icon-ok-sign");
} else if(doc.status==="Order Lost") {
cur_frm.dashboard.set_headline_alert(wn._(doc.status), "alert-danger", "icon-exclamation-sign");
- } else {
- cur_frm.dashboard.set_headline_alert(wn._(doc.status), "alert-info", "icon-exclamation-sign");
}
}
@@ -121,20 +119,10 @@
// Make Sales Order
// =====================================================================================
cur_frm.cscript['Make Sales Order'] = function() {
- var doc = cur_frm.doc;
-
- if (doc.docstatus == 1) {
- var n = wn.model.make_new_doc_and_get_name("Sales Order");
- $c('dt_map', args={
- 'docs':wn.model.compress([locals["Sales Order"][n]]),
- 'from_doctype':'Quotation',
- 'to_doctype':'Sales Order',
- 'from_docname':doc.name,
- 'from_to_list':"[['Quotation', 'Sales Order'], ['Quotation Item', 'Sales Order Item'],['Sales Taxes and Charges','Sales Taxes and Charges'], ['Sales Team', 'Sales Team'], ['TC Detail', 'TC Detail']]"
- }, function(r,rt) {
- loaddoc("Sales Order", n);
- });
- }
+ wn.model.open_mapped_doc({
+ method: "selling.doctype.quotation.quotation.make_sales_order",
+ source_name: cur_frm.doc.name
+ })
}
//pull enquiry details
diff --git a/selling/doctype/quotation/quotation.py b/selling/doctype/quotation/quotation.py
index 0cbc76e..1adce20 100644
--- a/selling/doctype/quotation/quotation.py
+++ b/selling/doctype/quotation/quotation.py
@@ -154,8 +154,11 @@
super(DocType, self).validate()
import utilities
- utilities.validate_status(self.doc.status, ["Draft", "Submitted",
- "Order Confirmed", "Order Lost", "Cancelled"])
+ if not self.doc.status:
+ self.doc.status = "Draft"
+ else:
+ utilities.validate_status(self.doc.status, ["Draft", "Submitted",
+ "Order Confirmed", "Order Lost", "Cancelled"])
self.validate_fiscal_year()
self.set_last_contact_date()
@@ -247,3 +250,37 @@
sql("delete from `tabCommunication Log` where parent = '%s'"%self.doc.name)
for d in getlist(self.doclist, 'follow_up'):
d.save()
+
+@webnotes.whitelist()
+def make_sales_order(source_name, target_doclist=None):
+ from webnotes.model.mapper import get_mapped_doclist
+
+ if target_doclist:
+ target_doclist = json.loads(target_doclist)
+
+ doclist = get_mapped_doclist("Quotation", source_name, {
+ "Quotation": {
+ "doctype": "Sales Order",
+ "field_map": {
+ "name": "quotation_no",
+ "transaction_date": "quotation_date"
+ },
+ "validation": {
+ "docstatus": ["=", 1]
+ }
+ },
+ "Quotation Item": {
+ "doctype": "Sales Order Item",
+ "field_map": {
+ "parent": "prevdoc_docname"
+ }
+ },
+ "Sales Taxes and Charges": {
+ "doctype": "Sales Taxes and Charges",
+ },
+ "Sales Team": {
+ "doctype": "Sales Team",
+ }
+ }, target_doclist)
+
+ return [d.fields for d in doclist]
\ No newline at end of file
diff --git a/selling/doctype/quotation/quotation.txt b/selling/doctype/quotation/quotation.txt
index f583dbe..5aa3aa3 100644
--- a/selling/doctype/quotation/quotation.txt
+++ b/selling/doctype/quotation/quotation.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-24 19:29:08",
"docstatus": 0,
- "modified": "2013-07-03 11:54:11",
+ "modified": "2013-07-04 10:56:10",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -114,7 +114,6 @@
"read_only": 0
},
{
- "depends_on": "customer",
"doctype": "DocField",
"fieldname": "customer_name",
"fieldtype": "Data",
@@ -237,7 +236,7 @@
"fieldname": "section_break0",
"fieldtype": "Section Break",
"label": "Price List and Currency",
- "options": "icon-globe",
+ "options": "icon-tag",
"read_only": 0
},
{
diff --git a/selling/doctype/quotation/test_quotation.py b/selling/doctype/quotation/test_quotation.py
new file mode 100644
index 0000000..de609b8
--- /dev/null
+++ b/selling/doctype/quotation/test_quotation.py
@@ -0,0 +1,63 @@
+import webnotes, json
+from webnotes.utils import flt
+import unittest
+
+test_dependencies = ["Sales BOM"]
+
+class TestQuotation(unittest.TestCase):
+ def test_make_sales_order(self):
+ from selling.doctype.quotation.quotation import make_sales_order
+
+ self.assertRaises(webnotes.ValidationError, make_sales_order, "_T-Quotation-00001")
+
+ quotation = webnotes.bean("Quotation","_T-Quotation-00001")
+ quotation.submit()
+
+ sales_order = make_sales_order("_T-Quotation-00001")
+
+ self.assertEquals(sales_order[0]["doctype"], "Sales Order")
+ self.assertEquals(len(sales_order), 2)
+ self.assertEquals(sales_order[1]["doctype"], "Sales Order Item")
+ self.assertEquals(sales_order[1]["prevdoc_docname"], "_T-Quotation-00001")
+ self.assertEquals(sales_order[0]["customer"], "_Test Customer")
+
+ sales_order[0]["delivery_date"] = "2014-01-01"
+
+
+ webnotes.print_messages = True
+ webnotes.bean(sales_order).insert()
+
+
+test_records = [
+ [
+ {
+ "company": "_Test Company",
+ "conversion_rate": 1.0,
+ "currency": "INR",
+ "customer": "_Test Customer",
+ "customer_name": "_Test Customer",
+ "customer_group": "_Test Customer Group",
+ "doctype": "Quotation",
+ "fiscal_year": "_Test Fiscal Year 2013",
+ "order_type": "Sales",
+ "plc_conversion_rate": 1.0,
+ "price_list_currency": "INR",
+ "price_list_name": "_Test Price List",
+ "territory": "_Test Territory",
+ "transaction_date": "2013-02-21",
+ "grand_total": 1000.0,
+ "grand_total_export": 1000.0,
+ },
+ {
+ "description": "CPU",
+ "doctype": "Quotation Item",
+ "item_code": "_Test Item Home Desktop 100",
+ "item_name": "CPU",
+ "parentfield": "quotation_details",
+ "qty": 10.0,
+ "basic_rate": 100.0,
+ "export_rate": 100.0,
+ "amount": 1000.0,
+ }
+ ],
+]
\ No newline at end of file
diff --git a/selling/doctype/sales_common/sales_common.js b/selling/doctype/sales_common/sales_common.js
index 77e7759..5534369 100644
--- a/selling/doctype/sales_common/sales_common.js
+++ b/selling/doctype/sales_common/sales_common.js
@@ -37,6 +37,12 @@
this.toggle_rounded_total();
},
+ refresh: function(doc) {
+ this.frm.toggle_display("customer_name",
+ (this.customer_name && this.frm.doc.customer_name!==this.frm.doc.customer));
+ this._super();
+ },
+
customer: function() {
var me = this;
if(this.frm.doc.customer || this.frm.doc.debit_to) {
diff --git a/selling/doctype/sales_order/sales_order.js b/selling/doctype/sales_order/sales_order.js
index d9e2d7b..c4d50cc 100644
--- a/selling/doctype/sales_order/sales_order.js
+++ b/selling/doctype/sales_order/sales_order.js
@@ -29,9 +29,16 @@
erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend({
refresh: function(doc, dt, dn) {
this._super();
+ this.frm.dashboard.reset();
if(doc.docstatus==1) {
if(doc.status != 'Stopped') {
+
+ cur_frm.dashboard.add_progress(cint(doc.per_delivered) + wn._("% Delivered"),
+ doc.per_delivered);
+ cur_frm.dashboard.add_progress(cint(doc.per_delivered) + wn._("% Billed"),
+ doc.per_billed);
+
cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms);
// delivery note
if(flt(doc.per_delivered, 2) < 100 && doc.order_type=='Sales')
@@ -56,6 +63,7 @@
cur_frm.add_custom_button('Stop!', cur_frm.cscript['Stop Sales Order']);
} else {
// un-stop
+ cur_frm.dashboard.set_headline_alert("Stopped", "alert-danger", "icon-stop");
cur_frm.add_custom_button('Unstop', cur_frm.cscript['Unstop Sales Order']);
}
}
diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py
index 461965a..ec365a2 100644
--- a/selling/doctype/sales_order/sales_order.py
+++ b/selling/doctype/sales_order/sales_order.py
@@ -167,7 +167,7 @@
def validate_order_type(self):
super(DocType, self).validate_order_type()
- #validate delivery date
+ def validate_delivery_date(self):
if self.doc.order_type == 'Sales' and not self.doc.delivery_date:
msgprint("Please enter 'Expected Delivery Date'")
raise Exception
@@ -186,6 +186,7 @@
self.validate_fiscal_year()
self.validate_order_type()
+ self.validate_delivery_date()
self.validate_mandatory()
self.validate_proj_cust()
self.validate_po()
diff --git a/selling/doctype/sales_order/sales_order.txt b/selling/doctype/sales_order/sales_order.txt
index 6bb1d26..6ac7565 100644
--- a/selling/doctype/sales_order/sales_order.txt
+++ b/selling/doctype/sales_order/sales_order.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-06-18 12:39:59",
"docstatus": 0,
- "modified": "2013-06-27 11:31:02",
+ "modified": "2013-07-04 10:56:35",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -41,6 +41,13 @@
},
{
"doctype": "DocField",
+ "fieldname": "customer_section",
+ "fieldtype": "Section Break",
+ "label": "Customer",
+ "options": "icon-user"
+ },
+ {
+ "doctype": "DocField",
"fieldname": "column_break0",
"fieldtype": "Column Break",
"in_filter": 0,
@@ -77,7 +84,6 @@
"search_index": 1
},
{
- "depends_on": "customer",
"doctype": "DocField",
"fieldname": "customer_name",
"fieldtype": "Data",
@@ -86,38 +92,34 @@
"read_only": 1
},
{
- "depends_on": "customer",
"doctype": "DocField",
"fieldname": "address_display",
"fieldtype": "Small Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Address",
"read_only": 1
},
{
- "depends_on": "customer",
"doctype": "DocField",
"fieldname": "contact_display",
"fieldtype": "Small Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Contact",
"read_only": 1
},
{
- "depends_on": "customer",
"doctype": "DocField",
"fieldname": "contact_mobile",
"fieldtype": "Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Mobile No",
"read_only": 1
},
{
- "depends_on": "customer",
"doctype": "DocField",
"fieldname": "contact_email",
"fieldtype": "Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Contact Email",
"print_hide": 1,
"read_only": 1
@@ -252,7 +254,8 @@
"doctype": "DocField",
"fieldname": "sec_break45",
"fieldtype": "Section Break",
- "label": "Price List and Currency"
+ "label": "Price List and Currency",
+ "options": "icon-tag"
},
{
"description": "Customer's currency",
@@ -323,7 +326,8 @@
"fieldname": "items",
"fieldtype": "Section Break",
"label": "Items",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-shopping-cart"
},
{
"allow_on_submit": 1,
@@ -345,6 +349,7 @@
"hidden": 0,
"label": "Packing List",
"oldfieldtype": "Section Break",
+ "options": "icon-suitcase",
"print_hide": 1
},
{
@@ -444,6 +449,7 @@
"fieldtype": "Section Break",
"label": "Taxes",
"oldfieldtype": "Section Break",
+ "options": "icon-money",
"print_hide": 0
},
{
@@ -537,6 +543,7 @@
"fieldtype": "Section Break",
"label": "Totals",
"oldfieldtype": "Section Break",
+ "options": "icon-money",
"print_hide": 1
},
{
@@ -626,6 +633,7 @@
"fieldtype": "Section Break",
"label": "Terms and Conditions",
"oldfieldtype": "Section Break",
+ "options": "icon-legal",
"print_hide": 0
},
{
@@ -671,7 +679,8 @@
"doctype": "DocField",
"fieldname": "contact_info",
"fieldtype": "Section Break",
- "label": "Contact Info"
+ "label": "Contact Info",
+ "options": "icon-bullhorn"
},
{
"doctype": "DocField",
@@ -734,6 +743,7 @@
"fieldtype": "Section Break",
"label": "More Info",
"oldfieldtype": "Section Break",
+ "options": "icon-file-text",
"print_hide": 1
},
{
@@ -904,6 +914,7 @@
"fieldtype": "Section Break",
"label": "Sales Team",
"oldfieldtype": "Section Break",
+ "options": "icon-group",
"print_hide": 1
},
{
@@ -951,7 +962,6 @@
"doctype": "DocField",
"fieldname": "section_break1",
"fieldtype": "Section Break",
- "options": "Simple",
"print_hide": 1
},
{
diff --git a/stock/doctype/item/item.js b/stock/doctype/item/item.js
index 1dcd038..2cc0b07 100644
--- a/stock/doctype/item/item.js
+++ b/stock/doctype/item/item.js
@@ -21,6 +21,8 @@
// make sensitive fields(has_serial_no, is_stock_item, valuation_method)
// read only if any stock ledger entry exists
+ cur_frm.cscript.make_dashboard()
+
cur_frm.toggle_display("naming_series", sys_defaults.item_naming_by=="Naming Series"
&& doc.__islocal)
cur_frm.toggle_display("item_code", sys_defaults.item_naming_by!="Naming Series"
@@ -36,6 +38,12 @@
}
}
+cur_frm.cscript.make_dashboard = function() {
+ cur_frm.dashboard.reset();
+ if(doc.__islocal)
+ return;
+}
+
cur_frm.cscript.item_code = function(doc) {
if(!doc.item_name) cur_frm.set_value("item_name", doc.item_code);
if(!doc.description) cur_frm.set_value("description", doc.item_code);
diff --git a/stock/doctype/item/item.py b/stock/doctype/item/item.py
index cd1f37c..85bb3d1 100644
--- a/stock/doctype/item/item.py
+++ b/stock/doctype/item/item.py
@@ -204,7 +204,7 @@
if vals and ((self.doc.is_stock_item == "No" and vals.is_stock_item == "Yes") or
vals.has_serial_no != self.doc.has_serial_no or
- vals.valuation_method != self.doc.valuation_method):
+ cstr(vals.valuation_method) != cstr(self.doc.valuation_method)):
if self.check_if_sle_exists() == "exists":
webnotes.msgprint(_("As there are existing stock transactions for this \
item, you can not change the values of 'Has Serial No', \
diff --git a/stock/doctype/material_request/material_request.js b/stock/doctype/material_request/material_request.js
index 6c7b2a7..5c2eed5 100644
--- a/stock/doctype/material_request/material_request.js
+++ b/stock/doctype/material_request/material_request.js
@@ -24,6 +24,16 @@
refresh: function(doc) {
this._super();
+ // dashboard
+ cur_frm.dashboard.reset();
+ if(doc.docstatus===1) {
+ if(doc.status==="Stopped") {
+ cur_frm.dashboard.set_headline_alert(wn._("Stopped"), "alert-danger", "icon-stop")
+ }
+ cur_frm.dashboard.add_progress(cint(doc.per_ordered) + "% "
+ + wn._("Fulfilled"), cint(doc.per_ordered));
+ }
+
if(doc.docstatus == 1 && doc.status != 'Stopped'){
if(doc.material_request_type === "Purchase")
cur_frm.add_custom_button("Make Supplier Quotation", cur_frm.cscript.make_supplier_quotation);
diff --git a/stock/doctype/material_request/material_request.txt b/stock/doctype/material_request/material_request.txt
index e7bad73..7ebb197 100644
--- a/stock/doctype/material_request/material_request.txt
+++ b/stock/doctype/material_request/material_request.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-03-07 14:48:38",
"docstatus": 0,
- "modified": "2013-06-11 16:16:36",
+ "modified": "2013-07-04 10:24:53",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -46,6 +46,13 @@
},
{
"doctype": "DocField",
+ "fieldname": "type_section",
+ "fieldtype": "Section Break",
+ "label": "Type",
+ "options": "icon-pushpin"
+ },
+ {
+ "doctype": "DocField",
"fieldname": "material_request_type",
"fieldtype": "Select",
"in_list_view": 1,
@@ -76,7 +83,8 @@
"fieldname": "items",
"fieldtype": "Section Break",
"label": "Items",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-shopping-cart"
},
{
"allow_on_submit": 0,
@@ -92,8 +100,7 @@
{
"doctype": "DocField",
"fieldname": "section_break1",
- "fieldtype": "Section Break",
- "options": "Simple"
+ "fieldtype": "Section Break"
},
{
"doctype": "DocField",
@@ -131,12 +138,12 @@
},
{
"default": "Give additional details about the indent.",
- "description": "Filing in Additional Information about the Material Request will help you analyze your data better.",
"doctype": "DocField",
"fieldname": "more_info",
"fieldtype": "Section Break",
"label": "More Info",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-file-text"
},
{
"doctype": "DocField",
@@ -287,7 +294,8 @@
"fieldname": "terms_section_break",
"fieldtype": "Section Break",
"label": "Terms and Conditions",
- "oldfieldtype": "Section Break"
+ "oldfieldtype": "Section Break",
+ "options": "icon-legal"
},
{
"doctype": "DocField",
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index d2f25f0..4e64089 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -466,20 +466,23 @@
item_dict = self.get_bom_raw_materials(self.doc.fg_completed_qty)
# add raw materials to Stock Entry Detail table
- self.add_to_stock_entry_detail(self.doc.from_warehouse, self.doc.to_warehouse,
- item_dict)
+ self.add_to_stock_entry_detail(item_dict)
# add finished good item to Stock Entry Detail table -- along with bom_no
if self.doc.production_order and self.doc.purpose == "Manufacture/Repack":
- self.add_to_stock_entry_detail(None, pro_obj.doc.fg_warehouse, {
+ self.doc.to_warehouse = pro_obj.doc.fg_warehouse
+ self.add_to_stock_entry_detail({
cstr(pro_obj.doc.production_item):
[self.doc.fg_completed_qty, pro_obj.doc.description, pro_obj.doc.stock_uom]
}, bom_no=pro_obj.doc.bom_no)
elif self.doc.purpose in ["Material Receipt", "Manufacture/Repack"]:
+ if self.doc.purpose=="Material Receipt":
+ self.doc.from_warehouse = ""
+
item = webnotes.conn.sql("""select item, description, uom from `tabBOM`
where name=%s""", (self.doc.bom_no,), as_dict=1)
- self.add_to_stock_entry_detail(None, self.doc.to_warehouse, {
+ self.add_to_stock_entry_detail({
item[0]["item"] :
[self.doc.fg_completed_qty, item[0]["description"], item[0]["uom"]]
}, bom_no=self.doc.bom_no)
@@ -492,36 +495,56 @@
child items of sub-contracted and sub assembly items
and sub assembly items itself.
"""
- # item dict = { item_code: [qty, description, stock_uom] }
+ # item dict = { item_code: {qty, description, stock_uom} }
item_dict = {}
def _make_items_dict(items_list):
"""makes dict of unique items with it's qty"""
for item in items_list:
if item_dict.has_key(item.item_code):
- item_dict[item.item_code][0] += flt(item.qty)
+ item_dict[item.item_code]["qty"] += flt(item.qty)
else:
- item_dict[item.item_code] = [flt(item.qty), item.description, item.stock_uom]
+ item_dict[item.item_code] = {
+ "qty": flt(item.qty),
+ "description": item.description,
+ "stock_uom": item.stock_uom,
+ "from_warehouse": item.default_warehouse
+ }
if self.doc.use_multi_level_bom:
# get all raw materials with sub assembly childs
- fl_bom_sa_child_item = sql("""select fb.item_code,
- ifnull(sum(fb.qty_consumed_per_unit),0)*%s as qty, fb.description, fb.stock_uom
- from `tabBOM Explosion Item` fb,`tabItem` it
- where it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No'
- and ifnull(it.is_sub_contracted_item, 'No') = 'No' and fb.docstatus < 2
- and fb.parent=%s group by item_code, stock_uom""",
+ fl_bom_sa_child_item = sql("""select
+ fb.item_code,
+ ifnull(sum(fb.qty_consumed_per_unit),0)*%s as qty,
+ fb.description,
+ fb.stock_uom,
+ it.default_warehouse
+ from
+ `tabBOM Explosion Item` fb,`tabItem` it
+ where
+ it.name = fb.item_code
+ and ifnull(it.is_pro_applicable, 'No') = 'No'
+ and ifnull(it.is_sub_contracted_item, 'No') = 'No'
+ and fb.docstatus < 2
+ and fb.parent=%s group by item_code, stock_uom""",
(qty, self.doc.bom_no), as_dict=1)
if fl_bom_sa_child_item:
_make_items_dict(fl_bom_sa_child_item)
else:
- # Get all raw materials considering multi level BOM,
- # if multi level bom consider childs of Sub-Assembly items
- fl_bom_sa_items = sql("""select item_code,
- ifnull(sum(qty_consumed_per_unit), 0) *%s as qty,
- description, stock_uom from `tabBOM Item`
- where parent = %s and docstatus < 2
+ # get only BOM items
+ fl_bom_sa_items = sql("""select
+ `tabItem`.item_code,
+ ifnull(sum(`tabBOM Item`.qty_consumed_per_unit), 0) *%s as qty,
+ `tabItem`.description,
+ `tabItem`.stock_uom,
+ `tabItem`.default_warehouse
+ from
+ `tabBOM Item`, `tabItem`
+ where
+ `tabBOM Item`.parent = %s and
+ `tabBOM Item`.item_code = tabItem.name
+ `tabBOM Item`.docstatus < 2
group by item_code""", (qty, self.doc.bom_no), as_dict=1)
if fl_bom_sa_items:
@@ -534,30 +557,30 @@
issue (item quantity) that is pending to issue or desire to transfer,
whichever is less
"""
- item_qty = self.get_bom_raw_materials(1)
+ item_dict = self.get_bom_raw_materials(1)
issued_item_qty = self.get_issued_qty()
max_qty = flt(pro_obj.doc.qty)
only_pending_fetched = []
- for item in item_qty:
- pending_to_issue = (max_qty * item_qty[item][0]) - issued_item_qty.get(item, 0)
- desire_to_transfer = flt(self.doc.fg_completed_qty) * item_qty[item][0]
+ for item in item_dict:
+ pending_to_issue = (max_qty * item_dict[item]["qty"]) - issued_item_qty.get(item, 0)
+ desire_to_transfer = flt(self.doc.fg_completed_qty) * item_dict[item]["qty"]
if desire_to_transfer <= pending_to_issue:
- item_qty[item][0] = desire_to_transfer
+ item_dict[item]["qty"] = desire_to_transfer
else:
- item_qty[item][0] = pending_to_issue
+ item_dict[item]["qty"] = pending_to_issue
if pending_to_issue:
only_pending_fetched.append(item)
# delete items with 0 qty
- for item in item_qty.keys():
- if not item_qty[item][0]:
- del item_qty[item]
+ for item in item_dict.keys():
+ if not item_dict[item]["qty"]:
+ del item_dict[item]
# show some message
- if not len(item_qty):
+ if not len(item_dict):
webnotes.msgprint(_("""All items have already been transferred \
for this Production Order."""))
@@ -565,7 +588,7 @@
webnotes.msgprint(_("""Only quantities pending to be transferred \
were fetched for the following items:\n""" + "\n".join(only_pending_fetched)))
- return item_qty
+ return item_dict
def get_issued_qty(self):
issued_item_qty = {}
@@ -579,18 +602,20 @@
return issued_item_qty
- def add_to_stock_entry_detail(self, source_wh, target_wh, item_dict, bom_no=None):
+ def add_to_stock_entry_detail(self, item_dict, bom_no=None):
for d in item_dict:
se_child = addchild(self.doc, 'mtn_details', 'Stock Entry Detail',
self.doclist)
- se_child.s_warehouse = source_wh
- se_child.t_warehouse = target_wh
+ se_child.s_warehouse = item_dict[d].get("from_warehouse", self.doc.from_warehouse)
+ se_child.t_warehouse = item_dict[d].get("to_warehouse", self.doc.to_warehouse)
se_child.item_code = cstr(d)
- se_child.description = item_dict[d][1]
- se_child.uom = item_dict[d][2]
- se_child.stock_uom = item_dict[d][2]
- se_child.qty = flt(item_dict[d][0])
- se_child.transfer_qty = flt(item_dict[d][0])
+ se_child.description = item_dict[d]["description"]
+ se_child.uom = item_dict[d]["stock_uom"]
+ se_child.stock_uom = item_dict[d]["stock_uom"]
+ se_child.qty = flt(item_dict[d]["qty"])
+
+ # in stock uom
+ se_child.transfer_qty = flt(item_dict[d]["qty"])
se_child.conversion_factor = 1.00
# to be assigned for finished item
diff --git a/stock/doctype/stock_entry/test_stock_entry.py b/stock/doctype/stock_entry/test_stock_entry.py
index 345e73c..7b058be 100644
--- a/stock/doctype/stock_entry/test_stock_entry.py
+++ b/stock/doctype/stock_entry/test_stock_entry.py
@@ -6,6 +6,11 @@
from webnotes.utils import flt
class TestStockEntry(unittest.TestCase):
+ def tearDown(self):
+ webnotes.defaults.set_global_default("auto_inventory_accounting", 0)
+ if hasattr(self, "old_default_company"):
+ webnotes.conn.set_default("company", self.old_default_company)
+
def test_auto_material_request(self):
webnotes.conn.sql("""delete from `tabMaterial Request Item`""")
webnotes.conn.sql("""delete from `tabMaterial Request`""")
@@ -72,8 +77,6 @@
["Stock Adjustment - _TC", 5000.0, 0.0]
])
)
-
- webnotes.defaults.set_global_default("auto_inventory_accounting", 0)
def test_material_issue_gl_entry(self):
self._clear_stock()
@@ -115,9 +118,6 @@
])
)
- webnotes.defaults.set_global_default("auto_inventory_accounting", 0)
- webnotes.conn.set_default("company", self.old_default_company)
-
def test_material_transfer_gl_entry(self):
self._clear_stock()
webnotes.defaults.set_global_default("auto_inventory_accounting", 1)
@@ -149,10 +149,7 @@
gl_entries = webnotes.conn.sql("""select * from `tabGL Entry`
where voucher_type = 'Stock Entry' and voucher_no=%s""", mtn.doc.name)
self.assertFalse(gl_entries)
-
- webnotes.defaults.set_global_default("auto_inventory_accounting", 0)
- webnotes.conn.set_default("company", self.old_default_company)
-
+
def check_stock_ledger_entries(self, voucher_type, voucher_no, expected_sle):
# check stock ledger entries
sle = webnotes.conn.sql("""select * from `tabStock Ledger Entry` where voucher_type = %s
diff --git a/stock/page/stock_home/stock_home.js b/stock/page/stock_home/stock_home.js
index b17784f..a59fe07 100644
--- a/stock/page/stock_home/stock_home.js
+++ b/stock/page/stock_home/stock_home.js
@@ -8,6 +8,11 @@
icon: "icon-copy",
items: [
{
+ label: wn._("Item"),
+ description: wn._("All Products or Services."),
+ doctype:"Item"
+ },
+ {
label: wn._("Material Request"),
description: wn._("Requests for items."),
doctype:"Material Request"
@@ -34,11 +39,6 @@
icon: "icon-book",
items: [
{
- label: wn._("Item"),
- description: wn._("All Products or Services."),
- doctype:"Item"
- },
- {
label: wn._("Serial No"),
description: wn._("Single unit of an Item."),
doctype:"Serial No"