test + documentation
diff --git a/erpnext/docs/assets/img/stock/blanket_order.gif b/erpnext/docs/assets/img/stock/blanket_order.gif
new file mode 100644
index 0000000..2634f3c
--- /dev/null
+++ b/erpnext/docs/assets/img/stock/blanket_order.gif
Binary files differ
diff --git a/erpnext/docs/user/manual/en/stock/blanket-order.md b/erpnext/docs/user/manual/en/stock/blanket-order.md
new file mode 100644
index 0000000..808b0d2
--- /dev/null
+++ b/erpnext/docs/user/manual/en/stock/blanket-order.md
@@ -0,0 +1,17 @@
+# Blanket Order
+
+Blanket Order is a order where a party can place order which will be delivered over a period of time. This gives bussiness
+an advantage as the price of items can be better negotiated for larger quantities and determined for future orders.
+
+In ERPNext, you can create the Blanket Order as the selling or purchasing type. For selling type blanket orders, you have to select the Customer and for purchasing type blanket orders, you have to select the Supplier.
+
+Once you submit a Blanket Order, you can create the Sales Order / Purchase Order within the Blanket Order itself via clicking on the Create Order button.
+
+<img class="screenshot" alt="Blanket Order" src="{{docs_base_url}}/assets/img/stock/blanket-order.gif">
+
+> Note: If there is a valid Blanket Order for a particular Customer / Supplier, and you are creating the Sales / Purchase order then the rate of the Items will be fetched from the Blanket Order.
+
+
+For every order created against the Blanket Order, a linking will be done and total ordered quantity will be updated in the Blanket Order.
+
+You can also manually select the Blanket Order in the Sales / Purchase order.
diff --git a/erpnext/manufacturing/doctype/blanket_order/blanket_order.json b/erpnext/manufacturing/doctype/blanket_order/blanket_order.json
index b256261..e2d26f4 100644
--- a/erpnext/manufacturing/doctype/blanket_order/blanket_order.json
+++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order.json
@@ -15,6 +15,7 @@
"fields": [
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -47,130 +48,7 @@
},
{
"allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "from_date",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "From Date",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "to_date",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "To Date",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "company",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Company",
- "length": 0,
- "no_copy": 0,
- "options": "Company",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_8",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -203,6 +81,7 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -236,11 +115,13 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:doc.blanket_order_type == \"Selling\"",
+ "fetch_from": "customer.customer_name",
"fieldname": "customer_name",
"fieldtype": "Data",
"hidden": 0,
@@ -253,7 +134,7 @@
"label": "Customer Name",
"length": 0,
"no_copy": 0,
- "options": "customer.customer_name",
+ "options": "",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -269,6 +150,7 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -302,11 +184,13 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:doc.blanket_order_type == \"Purchasing\"",
+ "fetch_from": "supplier.supplier_name",
"fieldname": "supplier_name",
"fieldtype": "Data",
"hidden": 0,
@@ -319,7 +203,7 @@
"label": "Supplier Name",
"length": 0,
"no_copy": 0,
- "options": "supplier.supplier_name",
+ "options": "",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -335,6 +219,135 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "column_break_8",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "from_date",
+ "fieldtype": "Date",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "From Date",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "to_date",
+ "fieldtype": "Date",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "To Date",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "company",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Company",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Company",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -365,6 +378,7 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -397,6 +411,7 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -437,7 +452,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2018-05-29 02:51:44.752511",
+ "modified": "2018-06-04 06:36:36.933751",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Blanket Order",
diff --git a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
index 38276f7..f6ef4de 100644
--- a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
+++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
@@ -16,6 +16,7 @@
@frappe.whitelist()
def make_sales_order(source_name):
def update_item(source, target, source_parent):
+ target.qty = source.get("qty") - source.get("ordered_quantity")
item = get_item_defaults(target.item_code, source_parent.company)
if item:
target.item_name = item.get("item_name")
@@ -40,6 +41,7 @@
@frappe.whitelist()
def make_purchase_order(source_name):
def update_item(source, target, source_parent):
+ target.qty = source.get("qty") - source.get("ordered_quantity")
item = get_item_defaults(target.item_code, source_parent.company)
if item:
target.item_name = item.get("item_name")
diff --git a/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py
new file mode 100644
index 0000000..a51c5f4
--- /dev/null
+++ b/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+import frappe
+import unittest
+from frappe.utils import add_months, today
+from .blanket_order import make_sales_order, make_purchase_order
+
+class TestBlanketOrder(unittest.TestCase):
+ def test_sales_order_creation(self):
+ bo = make_blanket_order(blanket_order_type="Selling")
+
+ so = make_sales_order(bo.name)
+ so.delivery_date = today()
+ so.items[0].qty = 10
+ so.submit()
+
+ self.assertEqual(so.doctype, "Sales Order")
+ self.assertEqual(len(so.get("items")), len(bo.get("items")))
+
+ # check the rate, quantity and updation for the ordered quantity
+ self.assertEqual(so.items[0].rate, bo.items[0].rate)
+
+ bo = frappe.get_doc("Blanket Order", bo.name)
+ self.assertEqual(so.items[0].qty, bo.items[0].ordered_quantity)
+
+ # test the quantity
+ so1 = make_sales_order(bo.name)
+ self.assertEqual(so1.items[0].qty, (bo.items[0].qty-bo.items[0].ordered_quantity))
+
+
+ def test_purchase_order_creation(self):
+ bo = make_blanket_order(blanket_order_type="Purchasing")
+
+ po = make_purchase_order(bo.name)
+ po.schedule_date = today()
+ po.items[0].qty = 10
+ po.submit()
+
+ self.assertEqual(po.doctype, "Purchase Order")
+ self.assertEqual(len(po.get("items")), len(bo.get("items")))
+
+ # check the rate, quantity and updation for the ordered quantity
+ self.assertEqual(po.items[0].rate, po.items[0].rate)
+
+ bo = frappe.get_doc("Blanket Order", bo.name)
+ self.assertEqual(po.items[0].qty, bo.items[0].ordered_quantity)
+
+ # test the quantity
+ po1 = make_sales_order(bo.name)
+ self.assertEqual(po1.items[0].qty, (bo.items[0].qty-bo.items[0].ordered_quantity))
+
+
+
+def make_blanket_order(**args):
+ args = frappe._dict(args)
+ bo = frappe.new_doc("Blanket Order")
+ bo.blanket_order_type = args.blanket_order_type
+ bo.company = args.company or "_Test Company"
+
+ if args.blanket_order_type == "Selling":
+ bo.customer = args.customer or "_Test Customer"
+ else:
+ bo.supplier = args.supplier or "_Test Supplier"
+
+ bo.from_date = today()
+ bo.to_date = add_months(bo.from_date, months=12)
+
+ bo.append("items", {
+ "item_code": args.item_code or "_Test Item",
+ "qty": args.quantity or 1000,
+ "rate": args.rate or 100
+ })
+
+ bo.insert()
+ bo.submit()
+ return bo
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/blanket_order_item/blanket_order_item.json b/erpnext/manufacturing/doctype/blanket_order_item/blanket_order_item.json
index ed23283..195f57f 100644
--- a/erpnext/manufacturing/doctype/blanket_order_item/blanket_order_item.json
+++ b/erpnext/manufacturing/doctype/blanket_order_item/blanket_order_item.json
@@ -14,6 +14,7 @@
"fields": [
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -46,10 +47,12 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fetch_from": "item_code.item_name",
"fieldname": "item_name",
"fieldtype": "Data",
"hidden": 0,
@@ -62,7 +65,7 @@
"label": "Item Name",
"length": 0,
"no_copy": 0,
- "options": "item_code.item_name",
+ "options": "",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -78,6 +81,7 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -108,6 +112,7 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -139,6 +144,7 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -170,6 +176,7 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -185,7 +192,7 @@
"in_standard_filter": 0,
"label": "Ordered Quantity",
"length": 0,
- "no_copy": 0,
+ "no_copy": 1,
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -201,6 +208,7 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -231,6 +239,7 @@
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -271,7 +280,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2018-05-29 02:39:25.564967",
+ "modified": "2018-06-04 07:04:14.050836",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Blanket Order Item",