From 6ede4a3809847680509258d35ac1e0a21569cc76 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 2 Feb 2017 17:41:44 +0530 Subject: [PATCH] [enhance] production order from sales order --- .../doctype/sales_invoice/sales_invoice.json | 180 ++------------- .../production_planning_tool.py | 50 ++-- .../doctype/sales_order/sales_order.js | 213 ++++++++++++------ .../doctype/sales_order/sales_order.py | 41 +++- .../stock/doctype/stock_entry/stock_entry.js | 4 + 5 files changed, 234 insertions(+), 254 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index f026cb06fa..4fb3dba88b 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -6,7 +6,7 @@ "beta": 0, "creation": "2013-05-24 19:29:05", "custom": 0, - "default_print_format": "Standard", + "default_print_format": "Sample Print", "docstatus": 0, "doctype": "DocType", "document_type": "", @@ -22,13 +22,12 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "", "length": 0, "no_copy": 0, - "options": "icon-user", + "options": "fa fa-user", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, @@ -51,7 +50,6 @@ "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Title", @@ -79,7 +77,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Series", @@ -109,7 +106,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 1, "label": "Customer", @@ -140,7 +136,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Customer Name", @@ -169,7 +164,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Is POS", @@ -199,7 +193,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Is Return", @@ -227,12 +220,11 @@ "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Offline POS Name", "length": 0, - "no_copy": 1, + "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, @@ -255,7 +247,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -283,7 +274,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, "in_list_view": 0, "in_standard_filter": 0, "label": "Date", @@ -312,7 +302,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, "in_list_view": 0, "in_standard_filter": 0, "label": "Payment Due Date", @@ -341,7 +330,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, "in_list_view": 0, "in_standard_filter": 0, "label": "Company", @@ -371,7 +359,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, "in_list_view": 0, "in_standard_filter": 0, "label": "Project", @@ -401,7 +388,6 @@ "hidden": 0, "ignore_user_permissions": 1, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Amended From", @@ -432,7 +418,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Return Against Sales Invoice", @@ -462,7 +447,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Address and Contact", @@ -490,7 +474,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Customer Address", @@ -518,7 +501,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Address", @@ -545,7 +527,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Contact Person", @@ -573,7 +554,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Contact", @@ -600,7 +580,6 @@ "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Mobile No", @@ -627,7 +606,6 @@ "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Contact Email", @@ -655,7 +633,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -682,7 +659,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, "in_list_view": 0, "in_standard_filter": 0, "label": "Shipping Address Name", @@ -711,7 +687,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Shipping Address", @@ -740,7 +715,6 @@ "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, "in_list_view": 0, "in_standard_filter": 0, "label": "Customer Group", @@ -768,7 +742,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Territory", @@ -777,7 +750,7 @@ "options": "Territory", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, @@ -798,7 +771,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Currency and Price List", @@ -826,7 +798,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Currency", @@ -857,7 +828,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Exchange Rate", @@ -887,7 +857,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -914,7 +883,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Price List", @@ -944,7 +912,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Price List Currency", @@ -973,7 +940,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Price List Exchange Rate", @@ -1001,7 +967,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Ignore Pricing Rule", @@ -1028,14 +993,13 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "", "length": 0, "no_copy": 0, "oldfieldtype": "Section Break", - "options": "icon-shopping-cart", + "options": "fa fa-shopping-cart", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, @@ -1057,7 +1021,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Update Stock", @@ -1086,7 +1049,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Items", @@ -1116,13 +1078,12 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Packing List", "length": 0, "no_copy": 0, - "options": "icon-suitcase", + "options": "fa fa-suitcase", "permlevel": 0, "print_hide": 1, "print_hide_if_no_value": 0, @@ -1144,7 +1105,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Packed Items", @@ -1172,7 +1132,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Product Bundle Help", @@ -1201,7 +1160,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Time Sheet List", @@ -1229,7 +1187,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Time Sheets", @@ -1259,7 +1216,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Total Billing Amount", @@ -1287,7 +1243,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -1313,7 +1268,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Total (Company Currency)", @@ -1342,7 +1296,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Net Total (Company Currency)", @@ -1372,7 +1325,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -1398,7 +1350,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Net Total", @@ -1426,7 +1377,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Total", @@ -1455,14 +1405,13 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "", "length": 0, "no_copy": 0, "oldfieldtype": "Section Break", - "options": "icon-money", + "options": "fa fa-money", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, @@ -1484,7 +1433,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Taxes and Charges", @@ -1514,7 +1462,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -1540,7 +1487,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Shipping Rule", @@ -1569,7 +1515,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -1595,7 +1540,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Sales Taxes and Charges", @@ -1625,7 +1569,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Taxes and Charges Calculation", @@ -1653,7 +1596,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -1679,7 +1621,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Total Taxes and Charges (Company Currency)", @@ -1709,7 +1650,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -1736,7 +1676,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Total Taxes and Charges", @@ -1765,7 +1704,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Additional Discount", @@ -1794,7 +1732,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Apply Additional Discount On", @@ -1823,7 +1760,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Additional Discount Amount (Company Currency)", @@ -1852,7 +1788,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -1878,7 +1813,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Additional Discount Percentage", @@ -1906,7 +1840,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Additional Discount Amount", @@ -1934,14 +1867,13 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "", "length": 0, "no_copy": 0, "oldfieldtype": "Section Break", - "options": "icon-money", + "options": "fa fa-money", "permlevel": 0, "print_hide": 1, "print_hide_if_no_value": 0, @@ -1963,7 +1895,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, "in_list_view": 0, "in_standard_filter": 0, "label": "Grand Total (Company Currency)", @@ -1993,7 +1924,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Rounded Total (Company Currency)", @@ -2024,7 +1954,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "In Words (Company Currency)", @@ -2053,7 +1982,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -2081,7 +2009,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Grand Total", @@ -2111,7 +2038,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Rounded Total", @@ -2141,7 +2067,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "In Words", @@ -2170,7 +2095,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Total Advance", @@ -2200,7 +2124,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 1, "label": "Outstanding Amount", @@ -2231,14 +2154,13 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Advance Payments", "length": 0, "no_copy": 0, "oldfieldtype": "Section Break", - "options": "icon-money", + "options": "fa fa-money", "permlevel": 0, "print_hide": 1, "print_hide_if_no_value": 0, @@ -2260,7 +2182,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Get Advances Received", @@ -2289,7 +2210,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Advances", @@ -2321,13 +2241,12 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Payments", "length": 0, "no_copy": 0, - "options": "icon-money", + "options": "fa fa-money", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, @@ -2350,7 +2269,6 @@ "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Cash/Bank Account", @@ -2380,7 +2298,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Sales Invoice Payment", @@ -2409,7 +2326,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -2436,7 +2352,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Paid Amount (Company Currency)", @@ -2465,7 +2380,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -2493,7 +2407,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Paid Amount", @@ -2523,7 +2436,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -2550,7 +2462,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Base Change Amount (Company Currency)", @@ -2579,7 +2490,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -2606,7 +2516,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Change Amount", @@ -2635,7 +2544,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Account for Change Amount", @@ -2666,7 +2574,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Write Off", @@ -2695,7 +2602,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Write Off Amount", @@ -2723,7 +2629,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Write Off Amount (Company Currency)", @@ -2753,7 +2658,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Write Off Outstanding Amount", @@ -2781,7 +2685,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -2809,7 +2712,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Write Off Account", @@ -2838,7 +2740,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Write Off Cost Center", @@ -2867,7 +2768,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Terms", @@ -2896,7 +2796,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Terms", @@ -2926,7 +2825,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Terms and Conditions Details", @@ -2955,7 +2853,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Printing Settings", @@ -2983,7 +2880,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Letter Head", @@ -3013,7 +2909,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Print Language", @@ -3041,7 +2936,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -3068,7 +2962,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Print Heading", @@ -3099,7 +2992,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "More Information", @@ -3128,7 +3020,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Campaign", @@ -3158,7 +3049,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -3186,7 +3076,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, "in_list_view": 0, "in_standard_filter": 0, "label": "Status", @@ -3215,7 +3104,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Source", @@ -3245,14 +3133,13 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Accounting Details", "length": 0, "no_copy": 0, "oldfieldtype": "Section Break", - "options": "icon-file-text", + "options": "fa fa-file-text", "permlevel": 0, "print_hide": 1, "print_hide_if_no_value": 0, @@ -3275,7 +3162,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, "in_list_view": 0, "in_standard_filter": 0, "label": "Debit To", @@ -3305,7 +3191,6 @@ "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Party Account Currency", @@ -3336,7 +3221,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, "in_list_view": 0, "in_standard_filter": 0, "label": "Is Opening Entry", @@ -3366,7 +3250,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "C-Form Applicable", @@ -3394,7 +3277,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "C-Form No", @@ -3422,7 +3304,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -3449,7 +3330,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Posting Time", @@ -3478,7 +3358,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Remarks", @@ -3508,14 +3387,13 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Commission", "length": 0, "no_copy": 0, "oldfieldtype": "Section Break", - "options": "icon-group", + "options": "fa fa-group", "permlevel": 0, "print_hide": 1, "print_hide_if_no_value": 0, @@ -3537,7 +3415,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, "in_list_view": 0, "in_standard_filter": 0, "label": "Sales Partner", @@ -3567,7 +3444,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -3595,7 +3471,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Commission Rate (%)", @@ -3624,7 +3499,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Total Commission", @@ -3655,7 +3529,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Sales Team", @@ -3682,7 +3555,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Sales Team1", @@ -3714,13 +3586,12 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Recurring", "length": 0, "no_copy": 0, - "options": "icon-time", + "options": "fa fa-time", "permlevel": 0, "print_hide": 1, "print_hide_if_no_value": 0, @@ -3742,7 +3613,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Settings", @@ -3772,7 +3642,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Is Recurring", @@ -3801,7 +3670,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Reference Document", @@ -3831,7 +3699,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Frequency", @@ -3861,7 +3728,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Repeat on Day of Month", @@ -3890,7 +3756,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "End Date", @@ -3918,7 +3783,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Submit on creation", @@ -3948,7 +3812,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Notify by email", @@ -3978,7 +3841,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Notification Email Address", @@ -4007,7 +3869,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Recurring Print Format", @@ -4036,7 +3897,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "This Document", @@ -4066,7 +3926,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "From Date", @@ -4095,7 +3954,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "To Date", @@ -4124,7 +3982,6 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Next Date", @@ -4151,7 +4008,6 @@ "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Against Income Account", @@ -4173,7 +4029,7 @@ ], "hide_heading": 0, "hide_toolbar": 0, - "icon": "icon-file-text", + "icon": "fa fa-file-text", "idx": 181, "image_view": 0, "in_create": 0, @@ -4183,7 +4039,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-01-18 13:21:13.226318", + "modified": "2017-02-02 17:03:01.892758", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", @@ -4199,7 +4055,6 @@ "export": 0, "if_owner": 0, "import": 0, - "is_custom": 0, "permlevel": 0, "print": 1, "read": 1, @@ -4220,7 +4075,6 @@ "export": 0, "if_owner": 0, "import": 0, - "is_custom": 0, "permlevel": 0, "print": 1, "read": 1, @@ -4241,7 +4095,6 @@ "export": 0, "if_owner": 0, "import": 0, - "is_custom": 0, "permlevel": 1, "print": 0, "read": 1, @@ -4262,7 +4115,6 @@ "export": 0, "if_owner": 0, "import": 0, - "is_custom": 0, "permlevel": 1, "print": 0, "read": 1, @@ -4282,6 +4134,6 @@ "sort_order": "DESC", "timeline_field": "customer", "title_field": "title", - "track_changes": 1, + "track_changes": 0, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py index db5b66c579..4692118cad 100644 --- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py +++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py @@ -249,7 +249,7 @@ class ProductionPlanningTool(Document): "wip_warehouse" : "", "fg_warehouse" : d.warehouse, "status" : "Draft", - "project" : frappe.db.get_value("Sales Order", d.sales_order, "project") + "project" : frappe.db.get_value("Sales Order", d.sales_order, "project") } """ Club similar BOM and item for processing in case of Sales Orders """ @@ -345,53 +345,53 @@ class ProductionPlanningTool(Document): def get_subitems(self,bom_wise_item_details, bom, parent_qty, include_sublevel, only_raw, supply_subs,non_stock_item=0): items = frappe.db.sql(""" - SELECT - bom_item.item_code, + SELECT + bom_item.item_code, default_material_request_type, ifnull(%(parent_qty)s * sum(bom_item.qty/ifnull(bom.quantity, 1)), 0) as qty, - item.is_sub_contracted_item as is_sub_contracted, + item.is_sub_contracted_item as is_sub_contracted, item.default_bom as default_bom, - bom_item.description as description, - bom_item.stock_uom as stock_uom, - item.min_order_qty as min_order_qty + bom_item.description as description, + bom_item.stock_uom as stock_uom, + item.min_order_qty as min_order_qty FROM - `tabBOM Item` bom_item, - `tabBOM` bom, + `tabBOM Item` bom_item, + `tabBOM` bom, tabItem item where - bom.name = bom_item.parent - and bom.name = %(bom)s + bom.name = bom_item.parent + and bom.name = %(bom)s and bom_item.docstatus < 2 and bom_item.item_code = item.name """ + ("and item.is_stock_item = 1", "")[non_stock_item] + """ group by bom_item.item_code""", {"bom": bom, "parent_qty": parent_qty}, as_dict=1) - + for d in items: - if ((d.default_material_request_type == "Purchase" - and not (d.is_sub_contracted and only_raw and include_sublevel)) + if ((d.default_material_request_type == "Purchase" + and not (d.is_sub_contracted and only_raw and include_sublevel)) or (d.default_material_request_type == "Manufacture" and not only_raw)): if d.item_code in bom_wise_item_details: bom_wise_item_details[d.item_code].qty = bom_wise_item_details[d.item_code].qty + d.qty else: bom_wise_item_details[d.item_code] = d - + if include_sublevel: - if ((d.default_material_request_type == "Purchase" and d.is_sub_contracted and supply_subs) + if ((d.default_material_request_type == "Purchase" and d.is_sub_contracted and supply_subs) or (d.default_material_request_type == "Manufacture")): - + my_qty = 0 projected_qty = self.get_item_projected_qty(d.item_code) - + if self.create_material_requests_for_all_required_qty: my_qty = d.qty elif (bom_wise_item_details[d.item_code].qty - d.qty) < projected_qty: my_qty = bom_wise_item_details[d.item_code].qty - projected_qty else: my_qty = d.qty - + if my_qty > 0: - self.get_subitems(bom_wise_item_details, + self.get_subitems(bom_wise_item_details, d.default_bom, my_qty, include_sublevel, only_raw, supply_subs) return bom_wise_item_details @@ -408,12 +408,12 @@ class ProductionPlanningTool(Document): item_list.append([item, self.item_dict[item][0][1], self.item_dict[item][0][2], total_qty]) item_qty = frappe.db.sql("""select warehouse, indented_qty, ordered_qty, actual_qty from `tabBin` where item_code = %s""", item, as_dict=1) - + i_qty, o_qty, a_qty = 0, 0, 0 for w in item_qty: i_qty, o_qty, a_qty = i_qty + flt(w.indented_qty), o_qty + \ flt(w.ordered_qty), a_qty + flt(w.actual_qty) - + item_list.append(['', '', '', '', w.warehouse, flt(w.indented_qty), flt(w.ordered_qty), flt(w.actual_qty)]) if item_qty: @@ -485,15 +485,15 @@ class ProductionPlanningTool(Document): def get_item_projected_qty(self,item): item_projected_qty = frappe.db.sql(""" select ifnull(sum(projected_qty),0) as qty - from `tabBin` + from `tabBin` where item_code = %(item_code)s and warehouse=%(warehouse)s """, { - "item_code": item, + "item_code": item, "warehouse": self.purchase_request_for_warehouse }, as_dict=1) return item_projected_qty[0].qty - + def get_projected_qty(self): items = self.item_dict.keys() item_projected_qty = frappe.db.sql("""select item_code, sum(projected_qty) diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 8a4a47cf3a..f01e4848e3 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -4,11 +4,23 @@ {% include 'erpnext/selling/sales_common.js' %} frappe.ui.form.on("Sales Order", { + setup: function(frm) { + $.extend(frm.cscript, new erpnext.selling.SalesOrderController({frm: frm})); + }, onload: function(frm) { erpnext.queries.setup_queries(frm, "Warehouse", function() { return erpnext.queries.warehouse(frm.doc); }); + frm.set_query('project', function(doc, cdt, cdn) { + return { + query: "erpnext.controllers.queries.get_project_name", + filters: { + 'customer': doc.customer + } + } + }); + // formatter for material request item frm.set_indicator_formatter('item_code', function(doc) { return (doc.qty<=doc.delivered_qty) ? "green" : "orange" }) @@ -17,6 +29,7 @@ frappe.ui.form.on("Sales Order", { erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend({ refresh: function(doc, dt, dn) { + var me = this; this._super(); var allow_purchase = false; var allow_delivery = false; @@ -24,8 +37,8 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend( if(doc.docstatus==1) { if(doc.status != 'Closed') { - for (var i in cur_frm.doc.items) { - var item = cur_frm.doc.items[i]; + for (var i in this.frm.doc.items) { + var item = this.frm.doc.items[i]; if(item.delivered_by_supplier === 1 || item.supplier){ if(item.qty > flt(item.ordered_qty) && item.qty > flt(item.delivered_qty)) { @@ -47,55 +60,69 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend( if (this.frm.has_perm("submit")) { // close if(flt(doc.per_delivered, 2) < 100 || flt(doc.per_billed) < 100) { - cur_frm.add_custom_button(__('Close'), this.close_sales_order, __("Status")) + this.frm.add_custom_button(__('Close'), + function() { me.close_sales_order() }, __("Status")) } } // delivery note if(flt(doc.per_delivered, 2) < 100 && ["Sales", "Shopping Cart"].indexOf(doc.order_type)!==-1 && allow_delivery) { - cur_frm.add_custom_button(__('Delivery'), this.make_delivery_note, __("Make")); - cur_frm.page.set_inner_btn_group_as_primary(__("Make")); + this.frm.add_custom_button(__('Delivery'), + function() { me.make_delivery_note() }, __("Make")); + this.frm.add_custom_button(__('Production Order'), + function() { me.make_production_order() }, __("Make")); + + this.frm.page.set_inner_btn_group_as_primary(__("Make")); } // sales invoice if(flt(doc.per_billed, 2) < 100) { - cur_frm.add_custom_button(__('Invoice'), this.make_sales_invoice, __("Make")); + this.frm.add_custom_button(__('Invoice'), + function() { me.make_sales_invoice() }, __("Make")); } // material request if(!doc.order_type || ["Sales", "Shopping Cart"].indexOf(doc.order_type)!==-1 && flt(doc.per_delivered, 2) < 100) { - cur_frm.add_custom_button(__('Material Request'), this.make_material_request, __("Make")); + this.frm.add_custom_button(__('Material Request'), + function() { me.make_material_request() }, __("Make")); } // make purchase order if(flt(doc.per_delivered, 2) < 100 && allow_purchase) { - cur_frm.add_custom_button(__('Purchase Order'), cur_frm.cscript.make_purchase_order, __("Make")); + this.frm.add_custom_button(__('Purchase Order'), + function() { me.make_purchase_order() }, __("Make")); } + // payment request if(flt(doc.per_billed)==0) { - cur_frm.add_custom_button(__('Payment Request'), this.make_payment_request, __("Make")); - cur_frm.add_custom_button(__('Payment'), cur_frm.cscript.make_payment_entry, __("Make")); + this.frm.add_custom_button(__('Payment Request'), + function() { me.make_payment_request() }, __("Make")); + this.frm.add_custom_button(__('Payment'), + function() { me.make_payment_entry() }, __("Make")); } // maintenance if(flt(doc.per_delivered, 2) < 100 && ["Sales", "Shopping Cart"].indexOf(doc.order_type)===-1) { - cur_frm.add_custom_button(__('Maintenance Visit'), this.make_maintenance_visit, __("Make")); - cur_frm.add_custom_button(__('Maintenance Schedule'), this.make_maintenance_schedule, __("Make")); + this.frm.add_custom_button(__('Maintenance Visit'), + function() { me.make_maintenance_visit() }, __("Make")); + this.frm.add_custom_button(__('Maintenance Schedule'), + function() { me.make_maintenance_schedule() }, __("Make")); } - } else { if (this.frm.has_perm("submit")) { // un-close - cur_frm.add_custom_button(__('Re-open'), cur_frm.cscript['Unclose Sales Order'], __("Status")); + this.frm.add_custom_button(__('Re-open'), function() { + me.frm.cscript.update_status('Re-open', 'Draft') + }, __("Status")); } } } if (this.frm.doc.docstatus===0) { - cur_frm.add_custom_button(__('Quotation'), + this.frm.add_custom_button(__('Quotation'), function() { erpnext.utils.map_current_doc({ method: "erpnext.selling.doctype.quotation.quotation.make_sales_order", @@ -103,9 +130,9 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend( get_query_filters: { docstatus: 1, status: ["!=", "Lost"], - order_type: cur_frm.doc.order_type, - customer: cur_frm.doc.customer || undefined, - company: cur_frm.doc.company + order_type: me.frm.doc.order_type, + customer: me.frm.doc.customer || undefined, + company: me.frm.doc.company } }) }, __("Get items from")); @@ -114,6 +141,82 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend( this.order_type(doc); }, + make_production_order() { + var me = this; + this.frm.call({ + doc: this.frm.doc, + method: 'get_production_order_items', + callback: function(r) { + if(!r.message.every(function(d) { return !!d.bom })) { + frappe.msgprint({ + title: __('Production Order not created'), + message: __('No Items with Bill of Materials to Manufacture'), + indicator: 'orange' + }); + return; + } + else if(!r.message.every(function(d) { return !!d.pending_qty })) { + frappe.msgprint({ + title: __('Production Order not created'), + message: __('Production Order already created for all items with BOM'), + indicator: 'orange' + }); + return; + } else { + var fields = [ + {fieldtype:'Table', fieldname: 'items', + description: __('Select BOM and Qty for Production'), + fields: [ + {fieldtype:'Read Only', fieldname:'item_code', + label: __('Item Code'), in_list_view:1}, + {fieldtype:'Link', fieldname:'bom', options: 'BOM', + label: __('Select BOM'), in_list_view:1, get_query: function(doc) { + return {filters: {item: doc.item_code}}; + }}, + {fieldtype:'Float', fieldname:'pending_qty', + label: __('Qty'), in_list_view:1}, + ], + get_data: function() { + return r.message + } + } + ] + var d = new frappe.ui.Dialog({ + title: __('Select Items to Manufacture'), + fields: fields, + primary_action: function() { + data = d.get_values(); + me.frm.call({ + method: 'make_production_orders', + args: { + items: data, + company: me.frm.doc.company, + sales_order: me.frm.docname, + project: me.frm.project + }, + freeze: true, + callback: function(r) { + if(r.message) { + frappe.msgprint({ + message: __('Production Orders Created: {0}', + [r.message.map(function(d) { + return repl('%(name)s', {name:d}) + }).join(', ')]), + indicator: 'green' + }) + } + d.hide(); + } + }); + }, + primary_action_label: __('Make') + }); + d.show(); + } + } + }); + }, + order_type: function() { this.frm.toggle_reqd("delivery_date", this.frm.doc.order_type == "Sales"); }, @@ -125,39 +228,40 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend( make_material_request: function() { frappe.model.open_mapped_doc({ method: "erpnext.selling.doctype.sales_order.sales_order.make_material_request", - frm: cur_frm + frm: this.frm }) }, make_delivery_note: function() { frappe.model.open_mapped_doc({ method: "erpnext.selling.doctype.sales_order.sales_order.make_delivery_note", - frm: cur_frm + frm: this.frm }) }, make_sales_invoice: function() { frappe.model.open_mapped_doc({ method: "erpnext.selling.doctype.sales_order.sales_order.make_sales_invoice", - frm: cur_frm + frm: this.frm }) }, make_maintenance_schedule: function() { frappe.model.open_mapped_doc({ method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule", - frm: cur_frm + frm: this.frm }) }, make_maintenance_visit: function() { frappe.model.open_mapped_doc({ method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_visit", - frm: cur_frm + frm: this.frm }) }, make_purchase_order: function(){ + var me = this; var dialog = new frappe.ui.Dialog({ title: __("For Supplier"), fields: [ @@ -165,7 +269,7 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend( "get_query": function () { return { query:"erpnext.selling.doctype.sales_order.sales_order.get_supplier", - filters: {'parent': cur_frm.doc.name} + filters: {'parent': me.frm.doc.name} } }, "reqd": 1 }, {"fieldtype": "Button", "label": __("Make Purchase Order"), "fieldname": "make_purchase_order", "cssClass": "btn-primary"}, @@ -180,7 +284,7 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend( type: "GET", method: "erpnext.selling.doctype.sales_order.sales_order.make_purchase_order_for_drop_shipment", args: { - "source_name": cur_frm.doc.name, + "source_name": me.frm.doc.name, "for_supplier": args.supplier }, freeze: true, @@ -195,44 +299,25 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend( dialog.show(); }, close_sales_order: function(){ - cur_frm.cscript.update_status("Close", "Closed") + this.frm.cscript.update_status("Close", "Closed") + }, + update_status: function(label, status){ + var doc = this.frm.doc; + frappe.ui.form.is_saving = true; + frappe.call({ + method: "erpnext.selling.doctype.sales_order.sales_order.update_status", + args: {status: status, name: doc.name}, + callback: function(r){ + this.frm.reload_doc(); + }, + always: function() { + frappe.ui.form.is_saving = false; + } + }); + }, + on_submit: function(doc, cdt, cdn) { + if(cint(frappe.boot.notification_settings.sales_order)) { + this.frm.email_doc(frappe.boot.notification_settings.sales_order_message); + } } - }); - -// for backward compatibility: combine new and previous states -$.extend(cur_frm.cscript, new erpnext.selling.SalesOrderController({frm: cur_frm})); - -cur_frm.fields_dict['project'].get_query = function(doc, cdt, cdn) { - return { - query: "erpnext.controllers.queries.get_project_name", - filters: { - 'customer': doc.customer - } - } -} - -cur_frm.cscript.update_status = function(label, status){ - var doc = cur_frm.doc; - frappe.ui.form.is_saving = true; - frappe.call({ - method: "erpnext.selling.doctype.sales_order.sales_order.update_status", - args: {status: status, name: doc.name}, - callback: function(r){ - cur_frm.reload_doc(); - }, - always: function() { - frappe.ui.form.is_saving = false; - } - }); -} - -cur_frm.cscript['Unclose Sales Order'] = function() { - cur_frm.cscript.update_status('Re-open', 'Draft') -} - -cur_frm.cscript.on_submit = function(doc, cdt, cdn) { - if(cint(frappe.boot.notification_settings.sales_order)) { - cur_frm.email_doc(frappe.boot.notification_settings.sales_order_message); - } -}; diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index acae0e539c..fdaadd87e0 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -304,6 +304,24 @@ class SalesOrder(SellingController): self.indicator_color = "green" self.indicator_title = _("Paid") + def get_production_order_items(self): + '''Returns items with BOM that already do not have a linked production order''' + items = [] + for i in self.packed_items or self.items: + bom = frappe.get_all('BOM', dict(item=i.item_code, is_active=True), + order_by='is_default desc') + bom = bom[0].name if bom else None + items.append(dict( + item_code= i.item_code, + bom = bom, + warehouse = i.warehouse, + pending_qty= i.qty - flt(frappe.db.sql('''select sum(qty) from `tabProduction Order` + where production_item=%s and sales_order=%s''', (i.item_code, self.name))[0][0]) + )) + + return items + + def on_recurring(self, reference_doc): mcount = month_map[reference_doc.recurring_type] self.set("delivery_date", get_next_date(reference_doc.delivery_date, mcount, @@ -442,7 +460,7 @@ def make_sales_invoice(source_name, target_doc=None, ignore_permissions=False): target.amount = flt(source.amount) - flt(source.billed_amt) target.base_amount = target.amount * flt(source_parent.conversion_rate) target.qty = target.amount / flt(source.rate) if (source.rate and source.billed_amt) else source.qty - + item = frappe.db.get_value("Item", target.item_code, ["item_group", "selling_cost_center"], as_dict=1) target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center") \ or item.selling_cost_center \ @@ -652,6 +670,27 @@ def get_supplier(doctype, txt, searchfield, start, page_len, filters): 'parent': filters.get('parent') }) +@frappe.whitelist() +def make_production_orders(items, sales_order, company, project=None): + '''Make Production Orders against the given Sales Order for the given `items`''' + items = json.loads(items).get('items') + out = [] + + for i in items: + production_order = frappe.get_doc(dict( + doctype='Production Order', + production_item=i['item_code'], + bom_no=i['bom'], + qty=i['pending_qty'], + company=company, + sales_order=sales_order, + project=project, + fg_warehouse=i['warehouse'] + )).insert() + out.append(production_order) + + return [p.name for p in out] + @frappe.whitelist() def update_status(status, name): so = frappe.get_doc("Sales Order", name) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index b410802051..37f9b680bf 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -41,6 +41,10 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ } } } + + this.frm.set_indicator_formatter('item_code', + function(doc) { return (doc.qty<=doc.actual_qty) ? "green" : "orange" }) + }, onload_post_render: function() {