[cleanup] [stock entry] [sales order]

This commit is contained in:
Rushabh Mehta 2013-07-03 18:32:29 +05:30
parent 9a04b19160
commit bcff7dce8e
13 changed files with 299 additions and 236 deletions

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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;

View File

@ -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",

View File

@ -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):

View File

@ -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");
}
}

View File

@ -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");
}
}

View File

@ -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
},
{

View File

@ -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']);
}
}

View File

@ -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
},
{

View File

@ -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', \

View File

@ -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

View File

@ -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