From bcff7dce8ef2ee8861fae6ab7f45a4a2e2197cf9 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 3 Jul 2013 18:32:29 +0530 Subject: [PATCH] [cleanup] [stock entry] [sales order] --- .../Purchase Order-Purchase Invoice.txt | 100 +++++++------- .../Purchase Receipt-Purchase Invoice.txt | 118 ++++++++--------- .../production_order/production_order.js | 19 ++- .../production_order/production_order.txt | 124 ++++++++++-------- projects/doctype/task/task.py | 3 +- selling/doctype/opportunity/opportunity.js | 2 - selling/doctype/quotation/quotation.js | 2 - selling/doctype/quotation/quotation.txt | 4 +- selling/doctype/sales_order/sales_order.js | 8 ++ selling/doctype/sales_order/sales_order.txt | 37 ++++-- stock/doctype/item/item.py | 2 +- stock/doctype/stock_entry/stock_entry.py | 101 ++++++++------ stock/doctype/stock_entry/test_stock_entry.py | 15 +-- 13 files changed, 299 insertions(+), 236 deletions(-) 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 ce45824e40..8c11d5070b 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 f6c87e266c..99c74ac818 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/manufacturing/doctype/production_order/production_order.js b/manufacturing/doctype/production_order/production_order.js index 5243026c70..4c41d94715 100644 --- a/manufacturing/doctype/production_order/production_order.js +++ b/manufacturing/doctype/production_order/production_order.js @@ -20,20 +20,19 @@ cur_frm.cscript.onload = function(doc, dt, dn) { } 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 @@ cur_frm.cscript.make_se = function(doc, purpose) { 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 38a98fefab..08123e8e0b 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" }, @@ -42,6 +42,13 @@ "doctype": "DocType", "name": "Production Order" }, + { + "doctype": "DocField", + "fieldname": "item", + "fieldtype": "Section Break", + "label": "Item", + "options": "icon-gift" + }, { "default": "PRO", "doctype": "DocField", @@ -51,22 +58,6 @@ "options": "\nPRO", "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", @@ -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", @@ -122,6 +101,15 @@ "read_only": 0, "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", @@ -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", @@ -205,6 +215,16 @@ "read_only": 0, "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", diff --git a/projects/doctype/task/task.py b/projects/doctype/task/task.py index a76dc9beaa..1df8547690 100644 --- a/projects/doctype/task/task.py +++ b/projects/doctype/task/task.py @@ -63,7 +63,8 @@ class DocType: 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/opportunity/opportunity.js b/selling/doctype/opportunity/opportunity.js index 72afeeafda..583f25adf1 100644 --- a/selling/doctype/opportunity/opportunity.js +++ b/selling/doctype/opportunity/opportunity.js @@ -25,8 +25,6 @@ cur_frm.cscript.refresh = function(doc, cdt, cdn){ 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 fd8c706571..66d4d0bddd 100644 --- a/selling/doctype/quotation/quotation.js +++ b/selling/doctype/quotation/quotation.js @@ -43,8 +43,6 @@ erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({ 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"); } } diff --git a/selling/doctype/quotation/quotation.txt b/selling/doctype/quotation/quotation.txt index f583dbeeb6..cfe0881208 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-03 16:12:44", "modified_by": "Administrator", "owner": "Administrator" }, @@ -237,7 +237,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/sales_order/sales_order.js b/selling/doctype/sales_order/sales_order.js index d9e2d7b047..c4d50cc045 100644 --- a/selling/doctype/sales_order/sales_order.js +++ b/selling/doctype/sales_order/sales_order.js @@ -29,9 +29,16 @@ wn.require('app/utilities/doctype/sms_control/sms_control.js'); 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 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend( 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.txt b/selling/doctype/sales_order/sales_order.txt index 6bb1d265f6..2a78bf79b3 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-03 16:12:26", "modified_by": "Administrator", "owner": "Administrator" }, @@ -39,6 +39,13 @@ "doctype": "DocType", "name": "Sales Order" }, + { + "doctype": "DocField", + "fieldname": "customer_section", + "fieldtype": "Section Break", + "label": "Customer", + "options": "icon-user" + }, { "doctype": "DocField", "fieldname": "column_break0", @@ -86,38 +93,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 +255,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 +327,8 @@ "fieldname": "items", "fieldtype": "Section Break", "label": "Items", - "oldfieldtype": "Section Break" + "oldfieldtype": "Section Break", + "options": "icon-shopping-cart" }, { "allow_on_submit": 1, @@ -345,6 +350,7 @@ "hidden": 0, "label": "Packing List", "oldfieldtype": "Section Break", + "options": "icon-suitcase", "print_hide": 1 }, { @@ -444,6 +450,7 @@ "fieldtype": "Section Break", "label": "Taxes", "oldfieldtype": "Section Break", + "options": "icon-money", "print_hide": 0 }, { @@ -537,6 +544,7 @@ "fieldtype": "Section Break", "label": "Totals", "oldfieldtype": "Section Break", + "options": "icon-money", "print_hide": 1 }, { @@ -626,6 +634,7 @@ "fieldtype": "Section Break", "label": "Terms and Conditions", "oldfieldtype": "Section Break", + "options": "icon-legal", "print_hide": 0 }, { @@ -671,7 +680,8 @@ "doctype": "DocField", "fieldname": "contact_info", "fieldtype": "Section Break", - "label": "Contact Info" + "label": "Contact Info", + "options": "icon-bullhorn" }, { "doctype": "DocField", @@ -734,6 +744,7 @@ "fieldtype": "Section Break", "label": "More Info", "oldfieldtype": "Section Break", + "options": "icon-file-text", "print_hide": 1 }, { @@ -904,6 +915,7 @@ "fieldtype": "Section Break", "label": "Sales Team", "oldfieldtype": "Section Break", + "options": "icon-group", "print_hide": 1 }, { @@ -951,7 +963,6 @@ "doctype": "DocField", "fieldname": "section_break1", "fieldtype": "Section Break", - "options": "Simple", "print_hide": 1 }, { diff --git a/stock/doctype/item/item.py b/stock/doctype/item/item.py index 295bff328f..dc4fde8723 100644 --- a/stock/doctype/item/item.py +++ b/stock/doctype/item/item.py @@ -204,7 +204,7 @@ class DocType(DocListController): 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/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py index d2f25f0e46..4e64089376 100644 --- a/stock/doctype/stock_entry/stock_entry.py +++ b/stock/doctype/stock_entry/stock_entry.py @@ -466,20 +466,23 @@ class DocType(StockController): 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 @@ class DocType(StockController): 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 @@ class DocType(StockController): 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 @@ class DocType(StockController): 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 @@ class DocType(StockController): 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 345e73c87e..7b058be073 100644 --- a/stock/doctype/stock_entry/test_stock_entry.py +++ b/stock/doctype/stock_entry/test_stock_entry.py @@ -6,6 +6,11 @@ import webnotes, unittest 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 @@ class TestStockEntry(unittest.TestCase): ["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 @@ class TestStockEntry(unittest.TestCase): ]) ) - 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 @@ class TestStockEntry(unittest.TestCase): 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