Merge pull request #19864 from nextchamp-saqib/report-col-fix

fix: column data not visible after manual selection of columns
diff --git a/.travis.yml b/.travis.yml
index 40afeee..365eb67 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -63,6 +63,7 @@
   - tar -xf /tmp/wkhtmltox.tar.xz -C /tmp
   - sudo mv /tmp/wkhtmltox/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf
   - sudo chmod o+x /usr/local/bin/wkhtmltopdf
+  - sudo apt-get install libcups2-dev
 
   - cd ~/frappe-bench
 
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index d031bc5..f40b957 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -5,7 +5,7 @@
 from erpnext.hooks import regional_overrides
 from frappe.utils import getdate
 
-__version__ = '12.1.8'
+__version__ = '12.2.0'
 
 def get_default_company(user=None):
 	'''Get default company for user'''
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/ae_uae_chart_template_standard.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/ae_uae_chart_template_standard.json
index 8856c8c..a8afb55 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/ae_uae_chart_template_standard.json
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/ae_uae_chart_template_standard.json
@@ -1,465 +1,466 @@
 {
-    "country_code": "ae", 
-    "name": "U.A.E - Chart of Accounts", 
+    "country_code": "ae",
+    "name": "U.A.E - Chart of Accounts",
     "tree": {
         "Assets": {
             "Current Assets": {
                 "Accounts Receivable": {
                     "Corporate Credit Cards": {
                         "account_type": "Receivable"
-                    }, 
+                    },
                     "Other Receivable": {
                         "Accrued Rebates Due from Suppliers": {
                             "account_type": "Receivable"
-                        }, 
+                        },
                         "Accrued Income from Suppliers": {
                             "account_type": "Receivable"
-                        }, 
+                        },
                         "Other Debtors": {
                             "account_type": "Receivable"
-                        }, 
+                        },
                         "account_type": "Receivable"
-                    }, 
+                    },
                     "Post Dated Cheques Received": {
                         "account_type": "Receivable"
-                    }, 
+                    },
                     "Staff Receivable": {
                         "account_type": "Receivable"
-                    }, 
+                    },
                     "Trade Receivable": {
                         "account_type": "Receivable"
-                    }, 
+                    },
                     "Trade in Opening Fees": {
                         "account_type": "Receivable"
-                    }, 
+                    },
                     "account_type": "Receivable"
-                }, 
+                },
                 "Cash in Hand & Banks": {
                     "Banks": {
-                        "Bank Margin On LC & LG": {}, 
-                        "Banks Blocked Deposits": {}, 
-                        "Banks Call Deposit Accounts": {}, 
+                        "Bank Margin On LC & LG": {},
+                        "Banks Blocked Deposits": {},
+                        "Banks Call Deposit Accounts": {},
                         "Banks Current Accounts": {
                             "account_type": "Bank"
-                        }, 
+                        },
                         "account_type": "Bank"
-                    }, 
+                    },
                     "Cash in Hand": {
                         "Cash in Safe": {
                             "Main Safe": {
                                 "account_type": "Cash"
-                            }, 
+                            },
                             "Main Safe - Foreign Currency": {
                                 "account_type": "Cash"
                             }
-                        }, 
+                        },
                         "Petty Cash": {
                             "Petty Cash - Administration": {
                                 "account_type": "Cash"
-                            }, 
+                            },
                             "Petty Cash - Others": {
                                 "account_type": "Cash"
                             }
-                        }, 
+                        },
                         "account_type": "Cash"
-                    }, 
+                    },
                     "Cash in Transit": {
                         "Credit Cards": {
                             "Gateway Credit Cards": {
                                 "account_type": "Bank"
-                            }, 
+                            },
                             "Manual Visa & Master Cards": {
                                 "account_type": "Bank"
-                            }, 
+                            },
                             "PayPal Account": {
                                 "account_type": "Bank"
-                            }, 
+                            },
                             "Visa & Master Credit Cards": {
                                 "account_type": "Bank"
                             }
                         }
                     }
-                }, 
+                },
                 "Inventory": {
                     "Consigned Stock": {
-                        "Handling Difference in Inventory": {
-                            "account_type": "Stock Adjustment"
-                        }, 
+                        "Handling Difference in Inventory": {},
                         "Items Delivered to Customs on temporary Base": {}
-                    }, 
+                    },
                     "Stock in Hand": {
                         "account_type": "Stock"
                     }
-                }, 
+                },
                 "Preliminary and Preoperating Expenses": {
                     "Preoperating Expenses": {}
-                }, 
+                },
                 "Prepayments & Deposits": {
                     "Deposits": {
-                        "Deposit - Office Rent": {}, 
-                        "Deposit Others": {}, 
-                        "Deposit to Immigration (Visa)": {}, 
+                        "Deposit - Office Rent": {},
+                        "Deposit Others": {},
+                        "Deposit to Immigration (Visa)": {},
                         "Deposits - Customs": {}
-                    }, 
+                    },
                     "Prepaid Taxes": {
-                        "Sales Taxes Receivables": {}, 
+                        "Sales Taxes Receivables": {},
                         "Withholding Tax Receivables": {}
-                    }, 
+                    },
                     "Prepayments": {
-                        "Other Prepayments": {}, 
-                        "PrePaid Advertisement Expenses": {}, 
-                        "Prepaid Bank Guarantee": {}, 
-                        "Prepaid Consultancy Fees": {}, 
-                        "Prepaid Employees Housing": {}, 
-                        "Prepaid Finance charge for Loans": {}, 
-                        "Prepaid Legal Fees": {}, 
-                        "Prepaid License Fees": {}, 
-                        "Prepaid Life Insurance": {}, 
-                        "Prepaid Maintenance": {}, 
-                        "Prepaid Medical Insurance": {}, 
-                        "Prepaid Office Rent": {}, 
-                        "Prepaid Other Insurance": {}, 
-                        "Prepaid Schooling Fees": {}, 
-                        "Prepaid Site Hosting Fees": {}, 
+                        "Other Prepayments": {},
+                        "PrePaid Advertisement Expenses": {},
+                        "Prepaid Bank Guarantee": {},
+                        "Prepaid Consultancy Fees": {},
+                        "Prepaid Employees Housing": {},
+                        "Prepaid Finance charge for Loans": {},
+                        "Prepaid Legal Fees": {},
+                        "Prepaid License Fees": {},
+                        "Prepaid Life Insurance": {},
+                        "Prepaid Maintenance": {},
+                        "Prepaid Medical Insurance": {},
+                        "Prepaid Office Rent": {},
+                        "Prepaid Other Insurance": {},
+                        "Prepaid Schooling Fees": {},
+                        "Prepaid Site Hosting Fees": {},
                         "Prepaid Sponsorship Fees": {}
                     }
                 }
-            }, 
+            },
             "Long Term Assets": {
                 "Fixed Assets": {
                     "Accumulated Depreciation": {
                         "Acc. Depreciation of Motor Vehicles": {
                             "account_type": "Accumulated Depreciation"
-                        }, 
+                        },
                         "Acc. Deprn.Computer Hardware & Software": {
                             "account_type": "Accumulated Depreciation"
-                        }, 
+                        },
                         "Acc.Deprn.of Furniture & Office Equipment": {
                             "account_type": "Accumulated Depreciation"
-                        }, 
+                        },
                         "Amortisation on Leasehold Improvement": {
                             "account_type": "Accumulated Depreciation"
-                        }, 
+                        },
                         "account_type": "Accumulated Depreciation"
-                    }, 
+                    },
                     "Fixed Assets (Cost Price)": {
                         "Computer Hardware & Software": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "Furniture and Equipment": {
                             "account_type": "Fixed Asset"
-                        }, 
-                        "Leasehold Improvement": {}, 
+                        },
+                        "Leasehold Improvement": {},
                         "Motor Vehicles": {
                             "account_type": "Fixed Asset"
-                        }, 
-                        "Work In Progress": {}, 
+                        },
+                        "Work In Progress": {},
                         "account_type": "Fixed Asset"
                     }
-                }, 
+                },
                 "Intangible Assets": {
-                    "Computer Card Renewal": {}, 
-                    "Disposal of Outlets": {}, 
+                    "Computer Card Renewal": {},
+                    "Disposal of Outlets": {},
                     "Registration of Trademarks": {}
-                }, 
-                "Intercompany Accounts": {}, 
+                },
+                "Intercompany Accounts": {},
                 "Investments": {
                     "Investments in Subsidiaries": {}
                 }
-            }, 
+            },
             "root_type": "Asset"
-        }, 
+        },
         "Closing And Temporary Accounts": {
             "Closing Accounts": {
                 "Closing Account": {}
-            }, 
+            },
             "root_type": "Liability"
-        }, 
+        },
         "Expenses": {
             "Commercial Expenses": {
-                "Consultancy Fees": {}, 
+                "Consultancy Fees": {},
                 "Provision for Doubtful Debts": {}
-            }, 
+            },
             "Cost of Sale": {
                 "Cost Of Goods Sold": {
-                    "Cost Of Goods Sold I/C Sales": {}, 
+                    "Cost Of Goods Sold I/C Sales": {},
                     "Cost of Goods Sold in Trading": {
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "account_type": "Cost of Goods Sold"
-                }, 
+                },
                 "Expenses Included In Valuation": {
                     "account_type": "Expenses Included In Valuation"
+                },
+                "Stock Adjustment": {
+                    "account_type": "Stock Adjustment"
                 }
-            }, 
+            },
             "Depreciation": {
                 "Depreciation & Amortization": {
-                    "Amortization on Leasehold Improvement": {}, 
+                    "Amortization on Leasehold Improvement": {},
                     "Depreciation Of Computer Hard & Soft": {
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "Depreciation Of Furniture & Office Equipment\n\t\t\t": {
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "Depreciation Of Motor Vehicles": {
                         "account_type": "Depreciation"
                     }
                 }
-            }, 
+            },
             "Direct Expenses": {
                 "Financial Charges": {
-                    "Air Miles Card Charges": {}, 
-                    "Amex Credit Cards Charges": {}, 
-                    "Bank Finance & Loan Charges": {}, 
-                    "Credit Card Charges": {}, 
-                    "Credit Card Swipe Charges": {}, 
+                    "Air Miles Card Charges": {},
+                    "Amex Credit Cards Charges": {},
+                    "Bank Finance & Loan Charges": {},
+                    "Credit Card Charges": {},
+                    "Credit Card Swipe Charges": {},
                     "PayPal Charges": {}
                 }
-            }, 
+            },
             "MISC Charges": {
                 "Other Charges": {
                     "Capital Loss": {
-                        "Disposal of Business Branch": {}, 
-                        "Loss On Fixed Assets Disposal": {}, 
+                        "Disposal of Business Branch": {},
+                        "Loss On Fixed Assets Disposal": {},
                         "Loss on Difference on Exchange": {}
-                    }, 
+                    },
                     "Other Non Operating Exp": {
                         "Other Non Operating Expenses": {}
-                    }, 
+                    },
                     "Previous Year Adjustments": {
                         "Previous Year Adjustments Account": {}
-                    }, 
+                    },
                     "Royalty Fees": {
                         "Royalty to Parent Co.": {}
-                    }, 
+                    },
                     "Tax / Zakat Expenses": {
                         "Income Tax": {
                             "account_type": "Tax"
-                        }, 
-                        "Zakat": {}, 
+                        },
+                        "Zakat": {},
                         "account_type": "Tax"
                     }
                 }
-            }, 
+            },
             "Share Resources": {
                 "Share Resource Expenses Account": {}
-            }, 
+            },
             "Store Operating Expenses": {
                 "Selling, General & Admin Expenses": {
                     "Advertising Expenses": {
                         "Other - Advertising Expenses": {}
-                    }, 
+                    },
                     "Bank & Finance Charges": {
                         "Other Bank Charges": {}
-                    }, 
+                    },
                     "Communications": {
-                        "Courier": {}, 
-                        "Others - Communication": {}, 
-                        "Telephone": {}, 
+                        "Courier": {},
+                        "Others - Communication": {},
+                        "Telephone": {},
                         "Web Site Hosting Fees": {}
-                    }, 
+                    },
                     "Office & Various Expenses": {
-                        "Cleaning": {}, 
-                        "Conveyance Expenses": {}, 
-                        "Gifts & Donations": {}, 
-                        "Insurance": {}, 
-                        "Kitchen and Buffet Expenses": {}, 
-                        "Maintenance": {}, 
-                        "Others - Office Various Expenses": {}, 
-                        "Security & Guard": {}, 
-                        "Stationary From Suppliers": {}, 
-                        "Stationary Out Of Stock": {}, 
-                        "Subscriptions": {}, 
-                        "Training": {}, 
+                        "Cleaning": {},
+                        "Conveyance Expenses": {},
+                        "Gifts & Donations": {},
+                        "Insurance": {},
+                        "Kitchen and Buffet Expenses": {},
+                        "Maintenance": {},
+                        "Others - Office Various Expenses": {},
+                        "Security & Guard": {},
+                        "Stationary From Suppliers": {},
+                        "Stationary Out Of Stock": {},
+                        "Subscriptions": {},
+                        "Training": {},
                         "Vehicle Expenses": {}
-                    }, 
+                    },
                     "Personnel Cost": {
-                        "Basic Salary": {}, 
-                        "End Of Service Indemnity": {}, 
-                        "Housing Allowance": {}, 
-                        "Leave Salary": {}, 
-                        "Leave Ticket": {}, 
-                        "Life Insurance": {}, 
-                        "Medical Insurance": {}, 
-                        "Personnel Cost Others": {}, 
-                        "Sales Commission": {}, 
-                        "Staff School Allowances": {}, 
-                        "Transportation Allowance": {}, 
-                        "Uniform": {}, 
+                        "Basic Salary": {},
+                        "End Of Service Indemnity": {},
+                        "Housing Allowance": {},
+                        "Leave Salary": {},
+                        "Leave Ticket": {},
+                        "Life Insurance": {},
+                        "Medical Insurance": {},
+                        "Personnel Cost Others": {},
+                        "Sales Commission": {},
+                        "Staff School Allowances": {},
+                        "Transportation Allowance": {},
+                        "Uniform": {},
                         "Visa Expenses": {}
-                    }, 
+                    },
                     "Professional & Legal Fees": {
-                        "Audit Fees": {}, 
-                        "Legal fees": {}, 
-                        "Others - Professional Fees": {}, 
-                        "Sponsorship Fees": {}, 
+                        "Audit Fees": {},
+                        "Legal fees": {},
+                        "Others - Professional Fees": {},
+                        "Sponsorship Fees": {},
                         "Trade License Fees": {}
-                    }, 
+                    },
                     "Provision & Write Off": {
-                        "Amortisation of Preoperating Expenses": {}, 
-                        "Cash Shortage": {}, 
-                        "Others - Provision & Write off": {}, 
-                        "Write Off Inventory": {}, 
+                        "Amortisation of Preoperating Expenses": {},
+                        "Cash Shortage": {},
+                        "Others - Provision & Write off": {},
+                        "Write Off Inventory": {},
                         "Write Off Receivables & Payables": {}
-                    }, 
+                    },
                     "Rent Expenses": {
-                        "Office Rent": {}, 
+                        "Office Rent": {},
                         "Warehouse Rent": {}
-                    }, 
+                    },
                     "Travel Expenses": {
-                        "Air tickets": {}, 
-                        "Hotel": {}, 
-                        "Meals": {}, 
-                        "Others": {}, 
+                        "Air tickets": {},
+                        "Hotel": {},
+                        "Meals": {},
+                        "Others": {},
                         "Per Diem": {}
-                    }, 
+                    },
                     "Utilities": {
-                        "Other Utility Cahrges": {}, 
+                        "Other Utility Cahrges": {},
                         "Water & Electricity": {}
                     }
                 }
-            }, 
+            },
             "root_type": "Expense"
-        }, 
+        },
         "Liabilities": {
             "Current Liabilities": {
                 "Accounts Payable": {
                     "Payables": {
                         "Advance Payable to Suppliers": {
                             "account_type": "Payable"
-                        }, 
+                        },
                         "Consigned Payable": {
                             "account_type": "Payable"
-                        }, 
+                        },
                         "Other Payable": {
                             "account_type": "Payable"
-                        }, 
+                        },
                         "Post Dated Cheques Paid": {
                             "account_type": "Payable"
-                        }, 
-                        "Staff Payable": {}, 
+                        },
+                        "Staff Payable": {},
                         "Suppliers Price Protection": {
                             "account_type": "Payable"
-                        }, 
+                        },
                         "Trade Payable": {
                             "account_type": "Payable"
-                        }, 
+                        },
                         "account_type": "Payable"
                     }
-                }, 
+                },
                 "Accruals & Provisions": {
                     "Accruals": {
                         "Accrued Personnel Cost": {
-                            "Accrued - Commissions": {}, 
-                            "Accrued - Leave Salary": {}, 
-                            "Accrued - Leave Tickets": {}, 
-                            "Accrued - Salaries": {}, 
-                            "Accrued Other Personnel Cost": {}, 
-                            "Accrued Salaries Increment": {}, 
+                            "Accrued - Commissions": {},
+                            "Accrued - Leave Salary": {},
+                            "Accrued - Leave Tickets": {},
+                            "Accrued - Salaries": {},
+                            "Accrued Other Personnel Cost": {},
+                            "Accrued Salaries Increment": {},
                             "Accrued-Staff Bonus": {}
                         }
-                    }, 
+                    },
                     "Accrued Expenses": {
                         "Accrued Other Expenses": {
-                            "Accrued - Audit Fees": {}, 
-                            "Accrued - Office Rent": {}, 
-                            "Accrued - Sponsorship": {}, 
-                            "Accrued - Telephone": {}, 
-                            "Accrued - Utilities": {}, 
+                            "Accrued - Audit Fees": {},
+                            "Accrued - Office Rent": {},
+                            "Accrued - Sponsorship": {},
+                            "Accrued - Telephone": {},
+                            "Accrued - Utilities": {},
                             "Accrued Others": {}
                         }
-                    }, 
+                    },
                     "Other Current Liabilities": {
-                        "Accrued Dubai Customs": {}, 
-                        "Deferred income": {}, 
+                        "Accrued Dubai Customs": {},
+                        "Deferred income": {},
                         "Shipping & Handling": {}
-                    }, 
+                    },
                     "Provisions": {
                         "Tax Payables": {
-                            "Income Tax Payable": {}, 
-                            "Sales Tax Payable": {}, 
+                            "Income Tax Payable": {},
+                            "Sales Tax Payable": {},
                             "Withholding Tax Payable": {}
                         }
-                    }, 
+                    },
                     "Short Term Loan": {}
-                }, 
+                },
                 "Duties and Taxes": {
-                    "account_type": "Tax", 
+                    "account_type": "Tax",
                     "is_group": 1
-                }, 
+                },
                 "Reservations & Credit Notes": {
                     "Credit Notes": {
-                        "Credit Notes to Customers": {}, 
+                        "Credit Notes to Customers": {},
                         "Reservations": {}
                     }
-                }, 
+                },
                 "Stock Liabilities": {
                     "Stock Received But Not Billed": {
                         "account_type": "Stock Received But Not Billed"
                     }
-                }, 
+                },
                 "Unearned Income": {}
-            }, 
+            },
             "Long Term Liabilities": {
                 "Long Term Loans & Provisions": {}
-            }, 
+            },
             "root_type": "Liability"
-        }, 
+        },
         "Revenue": {
             "Direct Revenue": {
                 "Other Direct Revenue": {
                     "Other Revenue - Operating": {
-                        "Advertising Income": {}, 
-                        "Branding Income": {}, 
-                        "Early Setmt Margin from Suppliers": {}, 
-                        "Marketing Rebate from Suppliers": {}, 
-                        "Rebate from Suppliers": {}, 
-                        "Service Income": {}, 
+                        "Advertising Income": {},
+                        "Branding Income": {},
+                        "Early Setmt Margin from Suppliers": {},
+                        "Marketing Rebate from Suppliers": {},
+                        "Rebate from Suppliers": {},
+                        "Service Income": {},
                         "Space Rental Income": {}
                     }
                 }
-            }, 
+            },
             "Indirect Revenue": {
                 "Other Indirect Revenue": {
-                    "Capital Gain": {}, 
-                    "Excess In Till": {}, 
-                    "Gain On Difference Of Exchange": {}, 
-                    "Management Consultancy Fees": {}, 
+                    "Capital Gain": {},
+                    "Excess In Till": {},
+                    "Gain On Difference Of Exchange": {},
+                    "Management Consultancy Fees": {},
                     "Other Income": {}
-                }, 
+                },
                 "Other Revenue - Non Operating": {
-                    "Interest Revenue": {}, 
-                    "Interest from FD": {}, 
-                    "Products Listing Fees from Suppliers": {}, 
+                    "Interest Revenue": {},
+                    "Interest from FD": {},
+                    "Products Listing Fees from Suppliers": {},
                     "Trade Opening Fees from suppliers": {}
                 }
-            }, 
+            },
             "Sales": {
                 "Sales from Other Regions": {
                     "Sales from Other Region": {}
-                }, 
+                },
                 "Sales of same region": {
-                    "Management Consultancy Fees 1": {}, 
-                    "Sales Account": {}, 
+                    "Management Consultancy Fees 1": {},
+                    "Sales Account": {},
                     "Sales of I/C": {}
                 }
-            }, 
+            },
             "root_type": "Income"
-        }, 
+        },
         "Share Holder Equity": {
             "Capital": {
-                "Contributed Capital": {}, 
-                "Share Capital": {}, 
-                "Shareholders Current A/c": {}, 
-                "Sub Ordinated Loan": {}, 
+                "Contributed Capital": {},
+                "Share Capital": {},
+                "Shareholders Current A/c": {},
+                "Sub Ordinated Loan": {},
                 "Treasury Stocks": {}
-            }, 
+            },
             "Retained Earnings": {
-                "Current Year Results": {}, 
-                "Dividends Paid": {}, 
+                "Current Year Results": {},
+                "Dividends Paid": {},
                 "Previous Years Results": {}
-            }, 
-            "account_type": "Equity", 
+            },
+            "account_type": "Equity",
             "root_type": "Equity"
         }
     }
diff --git a/erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py b/erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py
index 9bf5887..34070b0 100644
--- a/erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py
+++ b/erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py
@@ -185,7 +185,8 @@
 		return _("Please identify/create Account (Ledger) for type - {0}").format(' , '.join(missing))
 
 	account_types_for_group = ["Bank", "Cash", "Stock"]
-	account_groups = [accounts[d]["account_type"] for d in accounts if accounts[d]['is_group'] not in ('', 1)]
+	# fix logic bug
+	account_groups = [accounts[d]["account_type"] for d in accounts if accounts[d]['is_group'] == 1]
 
 	missing = list(set(account_types_for_group) - set(account_groups))
 	if missing:
diff --git a/erpnext/accounts/doctype/cost_center/cost_center.py b/erpnext/accounts/doctype/cost_center/cost_center.py
index 584e11c..0294e78 100644
--- a/erpnext/accounts/doctype/cost_center/cost_center.py
+++ b/erpnext/accounts/doctype/cost_center/cost_center.py
@@ -18,6 +18,7 @@
 
 	def validate(self):
 		self.validate_mandatory()
+		self.validate_parent_cost_center()
 
 	def validate_mandatory(self):
 		if self.cost_center_name != self.company and not self.parent_cost_center:
@@ -25,6 +26,12 @@
 		elif self.cost_center_name == self.company and self.parent_cost_center:
 			frappe.throw(_("Root cannot have a parent cost center"))
 
+	def validate_parent_cost_center(self):
+		if self.parent_cost_center:
+			if not frappe.db.get_value('Cost Center', self.parent_cost_center, 'is_group'):
+				frappe.throw(_("{0} is not a group node. Please select a group node as parent cost center").format(
+					frappe.bold(self.parent_cost_center)))
+
 	def convert_group_to_ledger(self):
 		if self.check_if_child_exists():
 			frappe.throw(_("Cannot convert Cost Center to ledger as it has child nodes"))
diff --git a/erpnext/accounts/doctype/cost_center/test_cost_center.py b/erpnext/accounts/doctype/cost_center/test_cost_center.py
index c4fad75..8f23d90 100644
--- a/erpnext/accounts/doctype/cost_center/test_cost_center.py
+++ b/erpnext/accounts/doctype/cost_center/test_cost_center.py
@@ -1,12 +1,26 @@
 # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 # License: GNU General Public License v3. See license.txt
 from __future__ import unicode_literals
-
-
+import unittest
 import frappe
+
 test_records = frappe.get_test_records('Cost Center')
 
+class TestCostCenter(unittest.TestCase):
+	def test_cost_center_creation_against_child_node(self):
 
+		if not frappe.db.get_value('Cost Center', {'name': '_Test Cost Center 2 - _TC'}):
+			frappe.get_doc(test_records[1]).insert()
+
+		cost_center = frappe.get_doc({
+			'doctype': 'Cost Center',
+			'cost_center_name': '_Test Cost Center 3',
+			'parent_cost_center': '_Test Cost Center 2 - _TC',
+			'is_group': 0,
+			'company': '_Test Company'
+		})
+
+		self.assertRaises(frappe.ValidationError, cost_center.save)
 
 def create_cost_center(**args):
 	args = frappe._dict(args)
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json
index acfc660..9979377 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.json
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json
@@ -332,6 +332,7 @@
    "label": "Reference"
   },
   {
+   "depends_on": "eval:doc.docstatus==0",
    "fieldname": "get_outstanding_invoice",
    "fieldtype": "Button",
    "label": "Get Outstanding Invoice"
@@ -575,7 +576,7 @@
   }
  ],
  "is_submittable": 1,
- "modified": "2019-11-06 12:59:43.151721",
+ "modified": "2019-12-08 13:02:30.016610",
  "modified_by": "Administrator",
  "module": "Accounts",
  "name": "Payment Entry",
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index bf7e833..9530fc9 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -931,9 +931,9 @@
 			grand_total = doc.rounded_total or doc.grand_total
 		outstanding_amount = doc.outstanding_amount
 	elif dt in ("Expense Claim"):
-		grand_total = doc.total_sanctioned_amount
-		outstanding_amount = doc.total_sanctioned_amount \
-			- doc.total_amount_reimbursed - flt(doc.total_advance_amount)
+		grand_total = doc.total_sanctioned_amount + doc.total_taxes_and_charges
+		outstanding_amount = doc.grand_total \
+			- doc.total_amount_reimbursed
 	elif dt == "Employee Advance":
 		grand_total = doc.advance_amount
 		outstanding_amount = flt(doc.advance_amount) - flt(doc.paid_amount)
diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py
index eda59ab..6133b1c 100644
--- a/erpnext/accounts/doctype/payment_request/payment_request.py
+++ b/erpnext/accounts/doctype/payment_request/payment_request.py
@@ -350,13 +350,13 @@
 	if dt in ["Sales Order", "Purchase Order"]:
 		grand_total = flt(ref_doc.grand_total) - flt(ref_doc.advance_paid)
 
-	if dt in ["Sales Invoice", "Purchase Invoice"]:
+	elif dt in ["Sales Invoice", "Purchase Invoice"]:
 		if ref_doc.party_account_currency == ref_doc.currency:
 			grand_total = flt(ref_doc.outstanding_amount)
 		else:
 			grand_total = flt(ref_doc.outstanding_amount) / ref_doc.conversion_rate
 
-	if dt == "Fees":
+	elif dt == "Fees":
 		grand_total = ref_doc.outstanding_amount
 
 	if grand_total > 0 :
diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
index 430dce7..e871d98 100644
--- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
+++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
@@ -34,8 +34,7 @@
 
 	def validate_duplicate_apply_on(self):
 		field = apply_on_dict.get(self.apply_on)
-		values = [d.get(frappe.scrub(self.apply_on)) for d in self.get(field)]
-
+		values = [d.get(frappe.scrub(self.apply_on)) for d in self.get(field) if field]
 		if len(values) != len(set(values)):
 			frappe.throw(_("Duplicate {0} found in the table").format(self.apply_on))
 
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
index e4e2c7b..d7e64cf 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -330,23 +330,6 @@
 			frm: cur_frm
 		})
 	},
-
-	item_code: function(frm, cdt, cdn) {
-		var row = locals[cdt][cdn];
-		if(row.item_code) {
-			frappe.call({
-				method: "erpnext.assets.doctype.asset_category.asset_category.get_asset_category_account",
-				args: {
-					"item": row.item_code,
-					"fieldname": "fixed_asset_account",
-					"company": frm.doc.company
-				},
-				callback: function(r, rt) {
-					frappe.model.set_value(cdt, cdn, "expense_account", r.message);
-				}
-			})
-		}
-	}
 });
 
 cur_frm.script_manager.make(erpnext.accounts.PurchaseInvoice);
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 5c53d26..7b2061a 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -237,7 +237,7 @@
 					item.expense_account = warehouse_account[item.warehouse]["account"]
 				else:
 					item.expense_account = stock_not_billed_account
-			elif item.is_fixed_asset and not is_cwip_accounting_enabled(self.company, asset_category):
+			elif item.is_fixed_asset and not is_cwip_accounting_enabled(asset_category):
 				item.expense_account = get_asset_category_account('fixed_asset_account', item=item.item_code,
 					company = self.company)
 			elif item.is_fixed_asset and item.pr_detail:
@@ -357,7 +357,7 @@
 			return
 		if not gl_entries:
 			gl_entries = self.get_gl_entries()
-			
+
 		if gl_entries:
 			update_outstanding = "No" if (cint(self.is_paid) or self.write_off_account) else "Yes"
 
@@ -408,7 +408,7 @@
 		for item in self.get("items"):
 			if item.item_code and item.is_fixed_asset:
 				asset_category = frappe.get_cached_value("Item", item.item_code, "asset_category")
-				if is_cwip_accounting_enabled(self.company, asset_category):
+				if is_cwip_accounting_enabled(asset_category):
 					return 1
 		return 0
 
@@ -452,6 +452,10 @@
 				fields = ["voucher_detail_no", "stock_value_difference"], filters={'voucher_no': self.name}):
 				voucher_wise_stock_value.setdefault(d.voucher_detail_no, d.stock_value_difference)
 
+		valuation_tax_accounts = [d.account_head for d in self.get("taxes")
+			if d.category in ('Valuation', 'Total and Valuation')
+			and flt(d.base_tax_amount_after_discount_amount)]
+
 		for item in self.get("items"):
 			if flt(item.base_net_amount):
 				account_currency = get_account_currency(item.expense_account)
@@ -500,11 +504,10 @@
 							"credit": flt(item.rm_supp_cost)
 						}, warehouse_account[self.supplier_warehouse]["account_currency"], item=item))
 
-				elif not item.is_fixed_asset or (item.is_fixed_asset and not is_cwip_accounting_enabled(self.company,
-					asset_category)):
+				elif not item.is_fixed_asset or (item.is_fixed_asset and not is_cwip_accounting_enabled(asset_category)):
 					expense_account = (item.expense_account
 						if (not item.enable_deferred_expense or self.is_return) else item.deferred_expense_account)
-					
+
 					if not item.is_fixed_asset:
 						amount = flt(item.base_net_amount, item.precision("base_net_amount"))
 					else:
@@ -517,7 +520,7 @@
 							"cost_center": item.cost_center,
 							"project": item.project
 						}, account_currency, item=item))
-					
+
 					# If asset is bought through this document and not linked to PR
 					if self.update_stock and item.landed_cost_voucher_amount:
 						expenses_included_in_asset_valuation = self.get_company_default("expenses_included_in_asset_valuation")
@@ -539,9 +542,9 @@
 							"debit": flt(item.landed_cost_voucher_amount),
 							"project": item.project
 						}, item=item))
-						
+
 						# update gross amount of asset bought through this document
-						assets = frappe.db.get_all('Asset', 
+						assets = frappe.db.get_all('Asset',
 							filters={ 'purchase_invoice': self.name, 'item_code': item.item_code }
 						)
 						for asset in assets:
@@ -551,10 +554,10 @@
 			if self.auto_accounting_for_stock and self.is_opening == "No" and \
 				item.item_code in stock_items and item.item_tax_amount:
 					# Post reverse entry for Stock-Received-But-Not-Billed if it is booked in Purchase Receipt
-					if item.purchase_receipt:
+					if item.purchase_receipt and valuation_tax_accounts:
 						negative_expense_booked_in_pr = frappe.db.sql("""select name from `tabGL Entry`
-							where voucher_type='Purchase Receipt' and voucher_no=%s and account=%s""",
-							(item.purchase_receipt, self.expenses_included_in_valuation))
+							where voucher_type='Purchase Receipt' and voucher_no=%s and account in %s""",
+							(item.purchase_receipt, valuation_tax_accounts))
 
 						if not negative_expense_booked_in_pr:
 							gl_entries.append(
@@ -633,7 +636,7 @@
 								if asset_eiiav_currency == self.company_currency else
 									item.item_tax_amount / self.conversion_rate)
 						}, item=item))
-					
+
 					# When update stock is checked
 					# Assets are bought through this document then it will be linked to this document
 					if self.update_stock:
@@ -655,9 +658,9 @@
 								"debit": flt(item.landed_cost_voucher_amount),
 								"project": item.project
 							}, item=item))
-						
+
 						# update gross amount of assets bought through this document
-						assets = frappe.db.get_all('Asset', 
+						assets = frappe.db.get_all('Asset',
 							filters={ 'purchase_invoice': self.name, 'item_code': item.item_code }
 						)
 						for asset in assets:
@@ -827,7 +830,11 @@
 			)
 
 	def make_gle_for_rounding_adjustment(self, gl_entries):
-		if self.rounding_adjustment:
+		# if rounding adjustment in small and conversion rate is also small then
+		# base_rounding_adjustment may become zero due to small precision
+		# eg: rounding_adjustment = 0.01 and exchange rate = 0.05 and precision of base_rounding_adjustment is 2
+		#	then base_rounding_adjustment becomes zero and error is thrown in GL Entry
+		if self.rounding_adjustment and self.base_rounding_adjustment:
 			round_off_account, round_off_cost_center = \
 				get_round_off_account_and_cost_center(self.company)
 
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index 85b1166..e41ad42 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -204,7 +204,7 @@
 		pi.insert()
 		pi.submit()
 
-		self.check_gle_for_pi_against_pr(pi.name)
+		self.check_gle_for_pi(pi.name)
 
 	def check_gle_for_pi(self, pi):
 		gl_entries = frappe.db.sql("""select account, sum(debit) as debit, sum(credit) as credit
@@ -225,26 +225,6 @@
 			self.assertEqual(expected_values[gle.account][1], gle.debit)
 			self.assertEqual(expected_values[gle.account][2], gle.credit)
 
-	def check_gle_for_pi_against_pr(self, pi):
-		gl_entries = frappe.db.sql("""select account, sum(debit) as debit, sum(credit) as credit
-			from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
-			group by account""", pi, as_dict=1)
-
-		self.assertTrue(gl_entries)
-
-		expected_values = dict((d[0], d) for d in [
-			["Creditors - TCP1", 0, 720],
-			["Stock Received But Not Billed - TCP1", 750.0, 0],
-			["_Test Account Shipping Charges - TCP1", 100.0, 100.0],
-			["_Test Account VAT - TCP1", 120.0, 0],
-			["_Test Account Customs Duty - TCP1", 0, 150]
-		])
-
-		for i, gle in enumerate(gl_entries):
-			self.assertEqual(expected_values[gle.account][0], gle.account)
-			self.assertEqual(expected_values[gle.account][1], gle.debit)
-			self.assertEqual(expected_values[gle.account][2], gle.credit)
-
 	def test_purchase_invoice_change_naming_series(self):
 		pi = frappe.copy_doc(test_records[1])
 		pi.insert()
diff --git a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
index dc3a1be..acb0398 100644
--- a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
+++ b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
@@ -1,4 +1,5 @@
 {
+ "actions": [],
  "autoname": "hash",
  "creation": "2013-05-22 12:43:10",
  "doctype": "DocType",
@@ -117,6 +118,7 @@
   },
   {
    "fetch_from": "item_code.item_name",
+   "fetch_if_empty": 1,
    "fieldname": "item_name",
    "fieldtype": "Data",
    "in_global_search": 1,
@@ -192,7 +194,6 @@
    "fieldtype": "Column Break"
   },
   {
-   "fetch_from": "item_code.stock_uom",
    "fieldname": "uom",
    "fieldtype": "Link",
    "label": "UOM",
@@ -507,7 +508,8 @@
    "depends_on": "enable_deferred_expense",
    "fieldname": "service_stop_date",
    "fieldtype": "Date",
-   "label": "Service Stop Date"
+   "label": "Service Stop Date",
+   "no_copy": 1
   },
   {
    "default": "0",
@@ -523,13 +525,15 @@
    "depends_on": "enable_deferred_expense",
    "fieldname": "service_start_date",
    "fieldtype": "Date",
-   "label": "Service Start Date"
+   "label": "Service Start Date",
+   "no_copy": 1
   },
   {
    "depends_on": "enable_deferred_expense",
    "fieldname": "service_end_date",
    "fieldtype": "Date",
-   "label": "Service End Date"
+   "label": "Service End Date",
+   "no_copy": 1
   },
   {
    "fieldname": "reference",
@@ -766,7 +770,8 @@
  ],
  "idx": 1,
  "istable": 1,
- "modified": "2019-11-03 13:43:23.782877",
+ "links": [],
+ "modified": "2019-12-04 12:23:17.046413",
  "modified_by": "Administrator",
  "module": "Accounts",
  "name": "Purchase Invoice Item",
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index 3c85210..2ea74f6 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -789,22 +789,21 @@
 					method: "frappe.client.get_value",
 					args:{
 						doctype: "Patient",
-						filters: {"name": frm.doc.patient},
+						filters: {
+							"name": frm.doc.patient
+						},
 						fieldname: "customer"
 					},
-					callback:function(patient_customer) {
-						if(patient_customer){
-							frm.set_value("customer", patient_customer.message.customer);
-							frm.refresh_fields();
+					callback:function(r) {
+						if(r && r.message.customer){
+							frm.set_value("customer", r.message.customer);
 						}
 					}
 				});
 			}
-			else{
-					frm.set_value("customer", '');
-			}
 		}
 	},
+
 	refresh: function(frm) {
 		if (frappe.boot.active_domains.includes("Healthcare")){
 			frm.set_df_property("patient", "hidden", 0);
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 3d96d48..0f4d445 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -135,7 +135,7 @@
 
 		if self.redeem_loyalty_points and self.loyalty_program and self.loyalty_points:
 			validate_loyalty_points(self, self.loyalty_points)
-	
+
 	def validate_fixed_asset(self):
 		for d in self.get("items"):
 			if d.is_fixed_asset and d.meta.get_field("asset") and d.asset:
@@ -535,9 +535,7 @@
 		for i in dic:
 			if frappe.db.get_single_value('Selling Settings', dic[i][0]) == 'Yes':
 				for d in self.get('items'):
-					is_stock_item = frappe.get_cached_value('Item', d.item_code, 'is_stock_item')
-					if  (d.item_code and is_stock_item == 1\
-						and not d.get(i.lower().replace(' ','_')) and not self.get(dic[i][1])):
+					if (d.item_code and not d.get(i.lower().replace(' ','_')) and not self.get(dic[i][1])):
 						msgprint(_("{0} is mandatory for Item {1}").format(i,d.item_code), raise_exception=1)
 
 
@@ -953,7 +951,7 @@
 			)
 
 	def make_gle_for_rounding_adjustment(self, gl_entries):
-		if flt(self.rounding_adjustment, self.precision("rounding_adjustment")):
+		if flt(self.rounding_adjustment, self.precision("rounding_adjustment")) and self.base_rounding_adjustment:
 			round_off_account, round_off_cost_center = \
 				get_round_off_account_and_cost_center(self.company)
 
@@ -1048,13 +1046,18 @@
 				continue
 
 			for serial_no in item.serial_no.split("\n"):
-				sales_invoice, item_code = frappe.db.get_value("Serial No", serial_no,
-					["sales_invoice", "item_code"])
-				if sales_invoice and item_code == item.item_code and self.name != sales_invoice:
-					sales_invoice_company = frappe.db.get_value("Sales Invoice", sales_invoice, "company")
+				serial_no_details = frappe.db.get_value("Serial No", serial_no,
+					["sales_invoice", "item_code"], as_dict=1)
+
+				if not serial_no_details:
+					continue
+
+				if serial_no_details.sales_invoice and serial_no_details.item_code == item.item_code \
+					and self.name != serial_no_details.sales_invoice:
+					sales_invoice_company = frappe.db.get_value("Sales Invoice", serial_no_details.sales_invoice, "company")
 					if sales_invoice_company == self.company:
 						frappe.throw(_("Serial Number: {0} is already referenced in Sales Invoice: {1}"
-							.format(serial_no, sales_invoice)))
+							.format(serial_no, serial_no_details.sales_invoice)))
 
 	def update_project(self):
 		if self.project:
diff --git a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
index 779ac4f..b2294e4 100644
--- a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
+++ b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
@@ -1,4 +1,5 @@
 {
+ "actions": [],
  "autoname": "hash",
  "creation": "2013-06-04 11:02:19",
  "doctype": "DocType",
@@ -484,7 +485,8 @@
    "depends_on": "enable_deferred_revenue",
    "fieldname": "service_stop_date",
    "fieldtype": "Date",
-   "label": "Service Stop Date"
+   "label": "Service Stop Date",
+   "no_copy": 1
   },
   {
    "default": "0",
@@ -500,13 +502,15 @@
    "depends_on": "enable_deferred_revenue",
    "fieldname": "service_start_date",
    "fieldtype": "Date",
-   "label": "Service Start Date"
+   "label": "Service Start Date",
+   "no_copy": 1
   },
   {
    "depends_on": "enable_deferred_revenue",
    "fieldname": "service_end_date",
    "fieldtype": "Date",
-   "label": "Service End Date"
+   "label": "Service End Date",
+   "no_copy": 1
   },
   {
    "collapsible": 1,
@@ -783,7 +787,8 @@
  ],
  "idx": 1,
  "istable": 1,
- "modified": "2019-07-16 16:36:46.527606",
+ "links": [],
+ "modified": "2019-12-04 12:22:38.517710",
  "modified_by": "Administrator",
  "module": "Accounts",
  "name": "Sales Invoice Item",
diff --git a/erpnext/accounts/doctype/share_transfer/share_transfer.py b/erpnext/accounts/doctype/share_transfer/share_transfer.py
index e95c694..65f248e 100644
--- a/erpnext/accounts/doctype/share_transfer/share_transfer.py
+++ b/erpnext/accounts/doctype/share_transfer/share_transfer.py
@@ -13,9 +13,9 @@
 class ShareDontExists(ValidationError): pass
 
 class ShareTransfer(Document):
-	def before_submit(self):
+	def on_submit(self):
 		if self.transfer_type == 'Issue':
-			shareholder = self.get_shareholder_doc(self.company)
+			shareholder = self.get_company_shareholder()
 			shareholder.append('share_balance', {
 				'share_type': self.share_type,
 				'from_no': self.from_no,
@@ -28,7 +28,7 @@
 			})
 			shareholder.save()
 
-			doc = frappe.get_doc('Shareholder', self.to_shareholder)
+			doc = self.get_shareholder_doc(self.to_shareholder)
 			doc.append('share_balance', {
 				'share_type': self.share_type,
 				'from_no': self.from_no,
@@ -41,11 +41,11 @@
 
 		elif self.transfer_type == 'Purchase':
 			self.remove_shares(self.from_shareholder)
-			self.remove_shares(self.get_shareholder_doc(self.company).name)
+			self.remove_shares(self.get_company_shareholder().name)
 
 		elif self.transfer_type == 'Transfer':
 			self.remove_shares(self.from_shareholder)
-			doc = frappe.get_doc('Shareholder', self.to_shareholder)
+			doc = self.get_shareholder_doc(self.to_shareholder)
 			doc.append('share_balance', {
 				'share_type': self.share_type,
 				'from_no': self.from_no,
@@ -56,143 +56,127 @@
 			})
 			doc.save()
 
+	def on_cancel(self):
+		if self.transfer_type == 'Issue':
+			compnay_shareholder = self.get_company_shareholder()
+			self.remove_shares(compnay_shareholder.name)
+			self.remove_shares(self.to_shareholder)
+
+		elif self.transfer_type == 'Purchase':
+			compnay_shareholder = self.get_company_shareholder()
+			from_shareholder = self.get_shareholder_doc(self.from_shareholder)
+
+			from_shareholder.append('share_balance', {
+				'share_type': self.share_type,
+				'from_no': self.from_no,
+				'to_no': self.to_no,
+				'rate': self.rate,
+				'amount': self.amount,
+				'no_of_shares': self.no_of_shares
+			})
+
+			from_shareholder.save()
+
+			compnay_shareholder.append('share_balance', {
+				'share_type': self.share_type,
+				'from_no': self.from_no,
+				'to_no': self.to_no,
+				'rate': self.rate,
+				'amount': self.amount,
+				'no_of_shares': self.no_of_shares
+			})
+
+			compnay_shareholder.save()
+
+		elif self.transfer_type == 'Transfer':
+			self.remove_shares(self.to_shareholder)
+			from_shareholder = self.get_shareholder_doc(self.from_shareholder)
+			from_shareholder.append('share_balance', {
+				'share_type': self.share_type,
+				'from_no': self.from_no,
+				'to_no': self.to_no,
+				'rate': self.rate,
+				'amount': self.amount,
+				'no_of_shares': self.no_of_shares
+			})
+			from_shareholder.save()
+
 	def validate(self):
+		self.get_company_shareholder()
 		self.basic_validations()
 		self.folio_no_validation()
+
 		if self.transfer_type == 'Issue':
-			if not self.get_shareholder_doc(self.company):
-				shareholder = frappe.get_doc({
-					'doctype': 'Shareholder',
-					'title': self.company,
-					'company': self.company,
-					'is_company': 1
-				})
-				shareholder.insert()
-			# validate share doesnt exist in company
-			ret_val = self.share_exists(self.get_shareholder_doc(self.company).name)
-			if ret_val != False:
+			# validate share doesn't exist in company
+			ret_val = self.share_exists(self.get_company_shareholder().name)
+			if ret_val in ('Complete', 'Partial'):
 				frappe.throw(_('The shares already exist'), frappe.DuplicateEntryError)
 		else:
 			# validate share exists with from_shareholder
 			ret_val = self.share_exists(self.from_shareholder)
-			if ret_val != True:
+			if ret_val in ('Outside', 'Partial'):
 				frappe.throw(_("The shares don't exist with the {0}")
 					.format(self.from_shareholder), ShareDontExists)
 
 	def basic_validations(self):
 		if self.transfer_type == 'Purchase':
 			self.to_shareholder = ''
-			if self.from_shareholder is None or self.from_shareholder is '':
+			if not self.from_shareholder:
 				frappe.throw(_('The field From Shareholder cannot be blank'))
-			if self.from_folio_no is None or self.from_folio_no is '':
+			if not self.from_folio_no:
 				self.to_folio_no = self.autoname_folio(self.to_shareholder)
-			if self.asset_account is None:
+			if not self.asset_account:
 				frappe.throw(_('The field Asset Account cannot be blank'))
 		elif (self.transfer_type == 'Issue'):
 			self.from_shareholder = ''
-			if self.to_shareholder is None or self.to_shareholder == '':
+			if not self.to_shareholder:
 				frappe.throw(_('The field To Shareholder cannot be blank'))
-			if self.to_folio_no is None or self.to_folio_no is '':
+			if not self.to_folio_no:
 				self.to_folio_no = self.autoname_folio(self.to_shareholder)
-			if self.asset_account is None:
+			if not self.asset_account:
 				frappe.throw(_('The field Asset Account cannot be blank'))
 		else:
-			if self.from_shareholder is None or self.to_shareholder is None:
+			if not self.from_shareholder or not self.to_shareholder:
 				frappe.throw(_('The fields From Shareholder and To Shareholder cannot be blank'))
-			if self.to_folio_no is None or self.to_folio_no is '':
+			if not self.to_folio_no:
 				self.to_folio_no = self.autoname_folio(self.to_shareholder)
-		if self.equity_or_liability_account is None:
+		if not self.equity_or_liability_account:
 				frappe.throw(_('The field Equity/Liability Account cannot be blank'))
 		if self.from_shareholder == self.to_shareholder:
 			frappe.throw(_('The seller and the buyer cannot be the same'))
 		if self.no_of_shares != self.to_no - self.from_no + 1:
 			frappe.throw(_('The number of shares and the share numbers are inconsistent'))
-		if self.amount is None:
+		if not self.amount:
 			self.amount = self.rate * self.no_of_shares
 		if self.amount != self.rate * self.no_of_shares:
 			frappe.throw(_('There are inconsistencies between the rate, no of shares and the amount calculated'))
 
 	def share_exists(self, shareholder):
-		# return True if exits,
-		# False if completely doesn't exist,
-		# 'partially exists' if partailly doesn't exist
-		ret_val = self.recursive_share_check(shareholder, self.share_type,
-			query = {
-				'from_no': self.from_no,
-				'to_no': self.to_no
-			}
-		)
-		if all(boolean == True for boolean in ret_val):
-			return True
-		elif True in ret_val:
-			return 'partially exists'
-		else:
-			return False
-
-	def recursive_share_check(self, shareholder, share_type, query):
-		# query = {'from_no': share_starting_no, 'to_no': share_ending_no}
-		# Recursive check if a given part of shares is held by the shareholder
-		# return a list containing True and False
-		# Eg. [True, False, True]
-		# All True  implies its completely inside
-		# All False implies its completely outside
-		# A   mix   implies its partially  inside/outside
-		does_share_exist = []
-		doc = frappe.get_doc('Shareholder', shareholder)
+		doc = self.get_shareholder_doc(shareholder)
 		for entry in doc.share_balance:
-			if entry.share_type != share_type or \
-				entry.from_no > query['to_no'] or \
-				entry.to_no < query['from_no']:
+			if entry.share_type != self.share_type or \
+				entry.from_no > self.to_no or \
+				entry.to_no < self.from_no:
 				continue # since query lies outside bounds
-			elif entry.from_no <= query['from_no'] and entry.to_no >= query['to_no']:
-				return [True] # absolute truth!
-			elif entry.from_no >= query['from_no'] and entry.to_no <= query['to_no']:
-				# split and check
-				does_share_exist.extend(self.recursive_share_check(shareholder,
-					share_type,
-					{
-						'from_no': query['from_no'],
-						'to_no': entry.from_no - 1
-					}
-				))
-				does_share_exist.append(True)
-				does_share_exist.extend(self.recursive_share_check(shareholder,
-					share_type,
-					{
-						'from_no': entry.to_no + 1,
-						'to_no': query['to_no']
-					}
-				))
-			elif query['from_no'] <= entry.from_no <= query['to_no'] and entry.to_no >= query['to_no']:
-				does_share_exist.extend(self.recursive_share_check(shareholder,
-					share_type,
-					{
-						'from_no': query['from_no'],
-						'to_no': entry.from_no - 1
-					}
-				))
-			elif query['from_no'] <= entry.to_no <= query['to_no'] and entry.from_no <= query['from_no']:
-				does_share_exist.extend(self.recursive_share_check(shareholder,
-					share_type,
-					{
-						'from_no': entry.to_no + 1,
-						'to_no': query['to_no']
-					}
-				))
+			elif entry.from_no <= self.from_no and entry.to_no >= self.to_no: #both inside
+				return 'Complete' # absolute truth!
+			elif entry.from_no <= self.from_no <= self.to_no:
+				return 'Partial'
+			elif entry.from_no <= self.to_no <= entry.to_no:
+				return 'Partial'
 
-		does_share_exist.append(False)
-		return does_share_exist
+		return 'Outside'
 
 	def folio_no_validation(self):
 		shareholders = ['from_shareholder', 'to_shareholder']
 		shareholders = [shareholder for shareholder in shareholders if self.get(shareholder) is not '']
 		for shareholder in shareholders:
-			doc = frappe.get_doc('Shareholder', self.get(shareholder))
+			doc = self.get_shareholder_doc(self.get(shareholder))
 			if doc.company != self.company:
 				frappe.throw(_('The shareholder does not belong to this company'))
-			if doc.folio_no is '' or doc.folio_no is None:
+			if not doc.folio_no:
 				doc.folio_no = self.from_folio_no \
-					if (shareholder == 'from_shareholder') else self.to_folio_no;
+					if (shareholder == 'from_shareholder') else self.to_folio_no
 				doc.save()
 			else:
 				if doc.folio_no and doc.folio_no != (self.from_folio_no if (shareholder == 'from_shareholder') else self.to_folio_no):
@@ -200,24 +184,14 @@
 
 	def autoname_folio(self, shareholder, is_company=False):
 		if is_company:
-			doc = self.get_shareholder_doc(shareholder)
+			doc = self.get_company_shareholder()
 		else:
-			doc = frappe.get_doc('Shareholder' , shareholder)
+			doc = self.get_shareholder_doc(shareholder)
 		doc.folio_no = make_autoname('FN.#####')
 		doc.save()
 		return doc.folio_no
 
 	def remove_shares(self, shareholder):
-		self.iterative_share_removal(shareholder, self.share_type,
-			{
-				'from_no': self.from_no,
-				'to_no'  : self.to_no
-			},
-			rate = self.rate,
-			amount = self.amount
-		)
-
-	def iterative_share_removal(self, shareholder, share_type, query, rate, amount):
 		# query = {'from_no': share_starting_no, 'to_no': share_ending_no}
 		# Shares exist for sure
 		# Iterate over all entries and modify entry if in entry
@@ -227,31 +201,31 @@
 
 		for entry in current_entries:
 			# use spaceage logic here
-			if entry.share_type != share_type or \
-				entry.from_no > query['to_no'] or \
-				entry.to_no < query['from_no']:
+			if entry.share_type != self.share_type or \
+				entry.from_no > self.to_no or \
+				entry.to_no < self.from_no:
 				new_entries.append(entry)
 				continue # since query lies outside bounds
-			elif entry.from_no <= query['from_no'] and entry.to_no >= query['to_no']:
+			elif entry.from_no <= self.from_no and entry.to_no >= self.to_no:
 				#split
-				if entry.from_no == query['from_no']:
-					if entry.to_no == query['to_no']:
+				if entry.from_no == self.from_no:
+					if entry.to_no == self.to_no:
 						pass #nothing to append
 					else:
-						new_entries.append(self.return_share_balance_entry(query['to_no']+1, entry.to_no, entry.rate))
+						new_entries.append(self.return_share_balance_entry(self.to_no+1, entry.to_no, entry.rate))
 				else:
-					if entry.to_no == query['to_no']:
-						new_entries.append(self.return_share_balance_entry(entry.from_no, query['from_no']-1, entry.rate))
+					if entry.to_no == self.to_no:
+						new_entries.append(self.return_share_balance_entry(entry.from_no, self.from_no-1, entry.rate))
 					else:
-						new_entries.append(self.return_share_balance_entry(entry.from_no, query['from_no']-1, entry.rate))
-						new_entries.append(self.return_share_balance_entry(query['to_no']+1, entry.to_no, entry.rate))
-			elif entry.from_no >= query['from_no'] and entry.to_no <= query['to_no']:
+						new_entries.append(self.return_share_balance_entry(entry.from_no, self.from_no-1, entry.rate))
+						new_entries.append(self.return_share_balance_entry(self.to_no+1, entry.to_no, entry.rate))
+			elif entry.from_no >= self.from_no and entry.to_no <= self.to_no:
 				# split and check
 				pass #nothing to append
-			elif query['from_no'] <= entry.from_no <= query['to_no'] and entry.to_no >= query['to_no']:
-				new_entries.append(self.return_share_balance_entry(query['to_no']+1, entry.to_no, entry.rate))
-			elif query['from_no'] <= entry.to_no <= query['to_no'] and entry.from_no <= query['from_no']:
-				new_entries.append(self.return_share_balance_entry(entry.from_no, query['from_no']-1, entry.rate))
+			elif self.from_no <= entry.from_no <= self.to_no and entry.to_no >= self.to_no:
+				new_entries.append(self.return_share_balance_entry(self.to_no+1, entry.to_no, entry.rate))
+			elif self.from_no <= entry.to_no <= self.to_no and entry.from_no <= self.from_no:
+				new_entries.append(self.return_share_balance_entry(entry.from_no, self.from_no-1, entry.rate))
 			else:
 				new_entries.append(entry)
 
@@ -272,16 +246,34 @@
 		}
 
 	def get_shareholder_doc(self, shareholder):
-		# Get Shareholder doc based on the Shareholder title
-		doc = frappe.get_list('Shareholder',
-			filters = [
-				('Shareholder', 'title', '=', shareholder)
-			]
-		)
-		if len(doc) == 1:
-			return frappe.get_doc('Shareholder', doc[0]['name'])
-		else: #It will necessarily by 0 indicating it doesn't exist
-			return False
+		# Get Shareholder doc based on the Shareholder name
+		if shareholder:
+			query_filters = {'name': shareholder}
+
+		name = frappe.db.get_value('Shareholder', {'name': shareholder}, 'name')
+
+		return frappe.get_doc('Shareholder', name)
+
+	def get_company_shareholder(self):
+		# Get company doc or create one if not present
+		company_shareholder = frappe.db.get_value('Shareholder',
+			{
+				'company': self.company,
+				'is_company': 1
+			}, 'name')
+
+		if company_shareholder:
+			return frappe.get_doc('Shareholder', company_shareholder)
+		else:
+			shareholder = frappe.get_doc({
+					'doctype': 'Shareholder',
+					'title': self.company,
+					'company': self.company,
+					'is_company': 1
+				})
+			shareholder.insert()
+
+			return shareholder
 
 @frappe.whitelist()
 def make_jv_entry( company, account, amount, payment_account,\
diff --git a/erpnext/accounts/doctype/share_transfer/test_share_transfer.py b/erpnext/accounts/doctype/share_transfer/test_share_transfer.py
index 910dfd0..2ff9b02 100644
--- a/erpnext/accounts/doctype/share_transfer/test_share_transfer.py
+++ b/erpnext/accounts/doctype/share_transfer/test_share_transfer.py
@@ -15,73 +15,73 @@
 		frappe.db.sql("delete from `tabShare Balance`")
 		share_transfers = [
 			{
-				"doctype"					 : "Share Transfer",
-				"transfer_type"				 : "Issue",
-				"date"						 : "2018-01-01",
-				"to_shareholder"			 : "SH-00001",
-				"share_type"				 : "Equity",
-				"from_no"					 : 1,
-				"to_no"						 : 500,
-				"no_of_shares"				 : 500,
-				"rate"						 : 10,
-				"company"					 : "_Test Company",
-				"asset_account"				 : "Cash - _TC",
+				"doctype": "Share Transfer",
+				"transfer_type": "Issue",
+				"date": "2018-01-01",
+				"to_shareholder": "SH-00001",
+				"share_type": "Equity",
+				"from_no": 1,
+				"to_no": 500,
+				"no_of_shares": 500,
+				"rate": 10,
+				"company": "_Test Company",
+				"asset_account": "Cash - _TC",
 				"equity_or_liability_account": "Creditors - _TC"
 			},
 			{
-				"doctype"					 : "Share Transfer",
-				"transfer_type"				 : "Transfer",
-				"date"						 : "2018-01-02",
-				"from_shareholder"			 : "SH-00001",
-				"to_shareholder"			 : "SH-00002",
-				"share_type"				 : "Equity",
-				"from_no"					 : 101,
-				"to_no"						 : 200,
-				"no_of_shares"				 : 100,
-				"rate"						 : 15,
-				"company"					 : "_Test Company",
+				"doctype": "Share Transfer",
+				"transfer_type": "Transfer",
+				"date": "2018-01-02",
+				"from_shareholder": "SH-00001",
+				"to_shareholder": "SH-00002",
+				"share_type": "Equity",
+				"from_no": 101,
+				"to_no": 200,
+				"no_of_shares": 100,
+				"rate": 15,
+				"company": "_Test Company",
 				"equity_or_liability_account": "Creditors - _TC"
 			},
 			{
-				"doctype"					 : "Share Transfer",
-				"transfer_type"				 : "Transfer",
-				"date"						 : "2018-01-03",
-				"from_shareholder"			 : "SH-00001",
-				"to_shareholder"			 : "SH-00003",
-				"share_type"				 : "Equity",
-				"from_no"					 : 201,
-				"to_no"						 : 500,
-				"no_of_shares"				 : 300,
-				"rate"						 : 20,
-				"company"					 : "_Test Company",
+				"doctype": "Share Transfer",
+				"transfer_type": "Transfer",
+				"date": "2018-01-03",
+				"from_shareholder": "SH-00001",
+				"to_shareholder": "SH-00003",
+				"share_type": "Equity",
+				"from_no": 201,
+				"to_no": 500,
+				"no_of_shares": 300,
+				"rate": 20,
+				"company": "_Test Company",
 				"equity_or_liability_account": "Creditors - _TC"
 			},
 			{
-				"doctype"					 : "Share Transfer",
-				"transfer_type"				 : "Transfer",
-				"date"						 : "2018-01-04",
-				"from_shareholder"			 : "SH-00003",
-				"to_shareholder"			 : "SH-00002",
-				"share_type"				 : "Equity",
-				"from_no"					 : 201,
-				"to_no"						 : 400,
-				"no_of_shares"				 : 200,
-				"rate"						 : 15,
-				"company"					 : "_Test Company",
+				"doctype": "Share Transfer",
+				"transfer_type": "Transfer",
+				"date": "2018-01-04",
+				"from_shareholder": "SH-00003",
+				"to_shareholder": "SH-00002",
+				"share_type": "Equity",
+				"from_no": 201,
+				"to_no": 400,
+				"no_of_shares": 200,
+				"rate": 15,
+				"company": "_Test Company",
 				"equity_or_liability_account": "Creditors - _TC"
 			},
 			{
-				"doctype"					 : "Share Transfer",
-				"transfer_type"				 : "Purchase",
-				"date"						 : "2018-01-05",
-				"from_shareholder"			 : "SH-00003",
-				"share_type"				 : "Equity",
-				"from_no"					 : 401,
-				"to_no"						 : 500,
-				"no_of_shares"				 : 100,
-				"rate"						 : 25,
-				"company"					 : "_Test Company",
-				"asset_account"				 : "Cash - _TC",
+				"doctype": "Share Transfer",
+				"transfer_type": "Purchase",
+				"date": "2018-01-05",
+				"from_shareholder": "SH-00003",
+				"share_type": "Equity",
+				"from_no": 401,
+				"to_no": 500,
+				"no_of_shares": 100,
+				"rate": 25,
+				"company": "_Test Company",
+				"asset_account": "Cash - _TC",
 				"equity_or_liability_account": "Creditors - _TC"
 			}
 		]
@@ -91,33 +91,33 @@
 
 	def test_invalid_share_transfer(self):
 		doc = frappe.get_doc({
-			"doctype"					 : "Share Transfer",
-			"transfer_type"				 : "Transfer",
-			"date"						 : "2018-01-05",
-			"from_shareholder"			 : "SH-00003",
-			"to_shareholder"			 : "SH-00002",
-			"share_type"				 : "Equity",
-			"from_no"					 : 1,
-			"to_no"						 : 100,
-			"no_of_shares"				 : 100,
-			"rate"						 : 15,
-			"company"					 : "_Test Company",
+			"doctype": "Share Transfer",
+			"transfer_type": "Transfer",
+			"date": "2018-01-05",
+			"from_shareholder": "SH-00003",
+			"to_shareholder": "SH-00002",
+			"share_type": "Equity",
+			"from_no": 1,
+			"to_no": 100,
+			"no_of_shares": 100,
+			"rate": 15,
+			"company": "_Test Company",
 			"equity_or_liability_account": "Creditors - _TC"
 		})
 		self.assertRaises(ShareDontExists, doc.insert)
 
 		doc = frappe.get_doc({
-			"doctype"					 : "Share Transfer",
-			"transfer_type"				 : "Purchase",
-			"date"						 : "2018-01-02",
-			"from_shareholder"			 : "SH-00001",
-			"share_type"				 : "Equity",
-			"from_no"					 : 1,
-			"to_no"						 : 200,
-			"no_of_shares"				 : 200,
-			"rate"						 : 15,
-			"company"					 : "_Test Company",
-			"asset_account"				 : "Cash - _TC",
+			"doctype": "Share Transfer",
+			"transfer_type": "Purchase",
+			"date": "2018-01-02",
+			"from_shareholder": "SH-00001",
+			"share_type": "Equity",
+			"from_no": 1,
+			"to_no": 200,
+			"no_of_shares": 200,
+			"rate": 15,
+			"company": "_Test Company",
+			"asset_account": "Cash - _TC",
 			"equity_or_liability_account": "Creditors - _TC"
 		})
 		self.assertRaises(ShareDontExists, doc.insert)
diff --git a/erpnext/accounts/doctype/shareholder/shareholder.json b/erpnext/accounts/doctype/shareholder/shareholder.json
index 873a3e7..e94aea9 100644
--- a/erpnext/accounts/doctype/shareholder/shareholder.json
+++ b/erpnext/accounts/doctype/shareholder/shareholder.json
@@ -1,587 +1,163 @@
 {
- "allow_copy": 0, 
- "allow_guest_to_view": 0, 
- "allow_import": 0, 
- "allow_rename": 0, 
- "autoname": "naming_series:", 
- "beta": 0, 
- "creation": "2017-12-25 16:50:53.878430", 
- "custom": 0, 
- "description": "", 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "", 
- "editable_grid": 1, 
- "engine": "InnoDB", 
+ "autoname": "naming_series:",
+ "creation": "2017-12-25 16:50:53.878430",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "title",
+  "column_break_2",
+  "naming_series",
+  "section_break_2",
+  "folio_no",
+  "column_break_4",
+  "company",
+  "is_company",
+  "address_contacts",
+  "address_html",
+  "column_break_9",
+  "contact_html",
+  "section_break_3",
+  "share_balance",
+  "contact_list"
+ ],
  "fields": [
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "title", 
-   "fieldtype": "Data", 
-   "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": "Title", 
-   "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
-  }, 
+   "fieldname": "title",
+   "fieldtype": "Data",
+   "label": "Title",
+   "reqd": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "column_break_2", 
-   "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
-  }, 
+   "fieldname": "column_break_2",
+   "fieldtype": "Column Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "default": "", 
-   "fieldname": "naming_series", 
-   "fieldtype": "Select", 
-   "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": "", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "ACC-SH-.YYYY.-", 
-   "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
-  }, 
+   "fieldname": "naming_series",
+   "fieldtype": "Select",
+   "options": "ACC-SH-.YYYY.-"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "section_break_2", 
-   "fieldtype": "Section 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
-  }, 
+   "fieldname": "section_break_2",
+   "fieldtype": "Section Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "folio_no", 
-   "fieldtype": "Data", 
-   "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": "Folio no.", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
+   "fieldname": "folio_no",
+   "fieldtype": "Data",
+   "label": "Folio no.",
+   "read_only": 1,
    "unique": 1
-  }, 
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "column_break_4", 
-   "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
-  }, 
+   "fieldname": "column_break_4",
+   "fieldtype": "Column Break"
+  },
   {
-   "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": 1, 
-   "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": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "company",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Company",
+   "options": "Company",
+   "reqd": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "is_company", 
-   "fieldtype": "Check", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Is Company", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "default": "0",
+   "fieldname": "is_company",
+   "fieldtype": "Check",
+   "hidden": 1,
+   "label": "Is Company",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "address_contacts", 
-   "fieldtype": "Section 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, 
-   "label": "Address and Contacts", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "fa fa-map-marker", 
-   "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
-  }, 
+   "fieldname": "address_contacts",
+   "fieldtype": "Section Break",
+   "label": "Address and Contacts",
+   "options": "fa fa-map-marker"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "address_html", 
-   "fieldtype": "HTML", 
-   "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": "Address HTML", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "address_html",
+   "fieldtype": "HTML",
+   "label": "Address HTML",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "column_break_9", 
-   "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
-  }, 
+   "fieldname": "column_break_9",
+   "fieldtype": "Column Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "contact_html", 
-   "fieldtype": "HTML", 
-   "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": "Contact HTML", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "contact_html",
+   "fieldtype": "HTML",
+   "label": "Contact HTML",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "section_break_3", 
-   "fieldtype": "Section 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, 
-   "label": "Share Balance", 
-   "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
-  }, 
+   "fieldname": "section_break_3",
+   "fieldtype": "Section Break",
+   "label": "Share Balance"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "share_balance", 
-   "fieldtype": "Table", 
-   "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": "Share Balance", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Share Balance", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "share_balance",
+   "fieldtype": "Table",
+   "label": "Share Balance",
+   "options": "Share Balance",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "Hidden list maintaining the list of contacts linked to Shareholder", 
-   "fieldname": "contact_list", 
-   "fieldtype": "Code", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Contact List", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
+   "description": "Hidden list maintaining the list of contacts linked to Shareholder",
+   "fieldname": "contact_list",
+   "fieldtype": "Code",
+   "hidden": 1,
+   "label": "Contact List",
+   "read_only": 1
   }
- ], 
- "has_web_view": 0, 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "idx": 0, 
- "image_view": 0, 
- "in_create": 0, 
- "is_submittable": 0, 
- "issingle": 0, 
- "istable": 0, 
- "max_attachments": 0, 
- "modified": "2018-09-18 14:14:24.953014", 
- "modified_by": "Administrator", 
- "module": "Accounts", 
- "name": "Shareholder", 
- "name_case": "Title Case", 
- "owner": "Administrator", 
+ ],
+ "modified": "2019-11-17 23:24:11.395882",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Shareholder",
+ "name_case": "Title Case",
+ "owner": "Administrator",
  "permissions": [
   {
-   "amend": 0, 
-   "cancel": 0, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 1, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "System Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 0, 
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "System Manager",
+   "share": 1,
    "write": 1
-  }, 
+  },
   {
-   "amend": 0, 
-   "cancel": 0, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 1, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Accounts Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 0, 
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Accounts Manager",
+   "share": 1,
    "write": 1
-  }, 
+  },
   {
-   "amend": 0, 
-   "cancel": 0, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 1, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Accounts User", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 0, 
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Accounts User",
+   "share": 1,
    "write": 1
   }
- ], 
- "quick_entry": 0, 
- "read_only": 0, 
- "read_only_onload": 0, 
- "search_fields": "folio_no", 
- "show_name_in_global_search": 0, 
- "sort_field": "modified", 
- "sort_order": "DESC", 
- "title_field": "title", 
- "track_changes": 1, 
- "track_seen": 0, 
- "track_views": 0
+ ],
+ "search_fields": "folio_no",
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "title_field": "title",
+ "track_changes": 1
 }
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
index a20f5c0..8c4efbe 100644
--- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
+++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
@@ -70,7 +70,7 @@
 
 	def get_shipping_amount_from_rules(self, value):
 		for condition in self.get("conditions"):
-			if not condition.to_value or (flt(condition.from_value) <= value <= flt(condition.to_value)):
+			if not condition.to_value or (flt(condition.from_value) <= flt(value) <= flt(condition.to_value)):
 				return condition.shipping_amount
 
 		return 0.0
diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py
index 38f283c..feb598a 100644
--- a/erpnext/accounts/general_ledger.py
+++ b/erpnext/accounts/general_ledger.py
@@ -162,24 +162,37 @@
 					frappe.throw(_("Account: {0} can only be updated via Stock Transactions")
 						.format(account), StockAccountInvalidTransaction)
 
-			elif account_bal != stock_bal:
-				error_reason = _("Account Balance ({0}) and Stock Value ({1}) is out of sync for account {2} and it's linked warehouses.").format(
-					account_bal, stock_bal, frappe.bold(account))
-				error_resolution = _("Please create adjustment Journal Entry for amount {0} ").format(frappe.bold(stock_bal - account_bal))
-				button_text = _("Make Adjustment Entry")
+			# This has been comment for a temporary, will add this code again on release of immutable ledger
+			# elif account_bal != stock_bal:
+			# 	precision = get_field_precision(frappe.get_meta("GL Entry").get_field("debit"),
+			# 		currency=frappe.get_cached_value('Company',  gl_map[0].company,  "default_currency"))
 
-				frappe.throw("""{0}<br></br>{1}<br></br>
-					<div style="text-align:right;">
-					<button class="btn btn-primary" onclick="frappe.new_doc('Journal Entry')">{2}</button>
-					</div>""".format(error_reason, error_resolution, button_text),
-					StockValueAndAccountBalanceOutOfSync, title=_('Account Balance Out Of Sync'))
+			# 	diff = flt(stock_bal - account_bal, precision)
+			# 	error_reason = _("Stock Value ({0}) and Account Balance ({1}) are out of sync for account {2} and it's linked warehouses.").format(
+			# 		stock_bal, account_bal, frappe.bold(account))
+			# 	error_resolution = _("Please create adjustment Journal Entry for amount {0} ").format(frappe.bold(diff))
+			# 	stock_adjustment_account = frappe.db.get_value("Company",gl_map[0].company,"stock_adjustment_account")
+
+			# 	db_or_cr_warehouse_account =('credit_in_account_currency' if diff < 0 else 'debit_in_account_currency')
+			# 	db_or_cr_stock_adjustment_account = ('debit_in_account_currency' if diff < 0 else 'credit_in_account_currency')
+
+			# 	journal_entry_args = {
+			# 	'accounts':[
+			# 		{'account': account, db_or_cr_warehouse_account : abs(diff)},
+			# 		{'account': stock_adjustment_account, db_or_cr_stock_adjustment_account : abs(diff) }]
+			# 	}
+
+			# 	frappe.msgprint(msg="""{0}<br></br>{1}<br></br>""".format(error_reason, error_resolution),
+			# 		raise_exception=StockValueAndAccountBalanceOutOfSync,
+			# 		title=_('Values Out Of Sync'),
+			# 		primary_action={
+			# 			'label': _('Make Journal Entry'),
+			# 			'client_action': 'erpnext.route_to_adjustment_jv',
+			# 			'args': journal_entry_args
+			# 		})
 
 def validate_cwip_accounts(gl_map):
-	cwip_enabled = cint(frappe.get_cached_value("Company",
-		gl_map[0].company, "enable_cwip_accounting"))
-
-	if not cwip_enabled:
-		cwip_enabled = any([cint(ac.enable_cwip_accounting) for ac in frappe.db.get_all("Asset Category","enable_cwip_accounting")])
+	cwip_enabled = any([cint(ac.enable_cwip_accounting) for ac in frappe.db.get_all("Asset Category","enable_cwip_accounting")])
 
 	if cwip_enabled and gl_map[0].voucher_type == "Journal Entry":
 			cwip_accounts = [d[0] for d in frappe.db.sql("""select name from tabAccount
diff --git a/erpnext/accounts/report/accounts_payable/accounts_payable.js b/erpnext/accounts/report/accounts_payable/accounts_payable.js
index 8eb670de..b1f427c 100644
--- a/erpnext/accounts/report/accounts_payable/accounts_payable.js
+++ b/erpnext/accounts/report/accounts_payable/accounts_payable.js
@@ -101,6 +101,11 @@
 			"options": "Supplier Group"
 		},
 		{
+			"fieldname":"based_on_payment_terms",
+			"label": __("Based On Payment Terms"),
+			"fieldtype": "Check",
+		},
+		{
 			"fieldname":"tax_id",
 			"label": __("Tax Id"),
 			"fieldtype": "Data",
diff --git a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js
index 5f0fdc9..4a9f1b0 100644
--- a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js
+++ b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js
@@ -88,6 +88,11 @@
 			"label": __("Supplier Group"),
 			"fieldtype": "Link",
 			"options": "Supplier Group"
+		},
+		{
+			"fieldname":"based_on_payment_terms",
+			"label": __("Based On Payment Terms"),
+			"fieldtype": "Check",
 		}
 	],
 
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index 14906f2..2c53f6e 100755
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -60,6 +60,7 @@
 
 	def get_data(self):
 		self.get_gl_entries()
+		self.get_sales_invoices_or_customers_based_on_sales_person()
 		self.voucher_balance = OrderedDict()
 		self.init_voucher_balance() # invoiced, paid, credit_note, outstanding
 
@@ -103,12 +104,18 @@
 
 	def get_invoices(self, gle):
 		if gle.voucher_type in ('Sales Invoice', 'Purchase Invoice'):
-			self.invoices.add(gle.voucher_no)
+			if self.filters.get("sales_person"):
+				if gle.voucher_no in self.sales_person_records.get("Sales Invoice", []) \
+					or gle.party in self.sales_person_records.get("Customer", []):
+						self.invoices.add(gle.voucher_no)
+			else:
+				self.invoices.add(gle.voucher_no)
 
 	def update_voucher_balance(self, gle):
 		# get the row where this balance needs to be updated
 		# if its a payment, it will return the linked invoice or will be considered as advance
 		row = self.get_voucher_balance(gle)
+		if not row: return
 		# gle_balance will be the total "debit - credit" for receivable type reports and
 		# and vice-versa for payable type reports
 		gle_balance = self.get_gle_balance(gle)
@@ -129,8 +136,13 @@
 				row.paid -= gle_balance
 
 	def get_voucher_balance(self, gle):
-		voucher_balance = None
+		if self.filters.get("sales_person"):
+			against_voucher = gle.against_voucher or gle.voucher_no
+			if not (gle.party in self.sales_person_records.get("Customer", []) or \
+				against_voucher in self.sales_person_records.get("Sales Invoice", [])):
+					return
 
+		voucher_balance = None
 		if gle.against_voucher:
 			# find invoice
 			against_voucher = gle.against_voucher
@@ -318,7 +330,7 @@
 			self.append_payment_term(row, d, term)
 
 	def append_payment_term(self, row, d, term):
-		if self.filters.get("customer") and d.currency == d.party_account_currency:
+		if (self.filters.get("customer") or self.filters.get("supplier")) and d.currency == d.party_account_currency:
 			invoiced = d.payment_amount
 		else:
 			invoiced = flt(flt(d.payment_amount) * flt(d.conversion_rate), self.currency_precision)
@@ -512,6 +524,22 @@
 			order by posting_date, party"""
 			.format(select_fields, conditions), values, as_dict=True)
 
+	def get_sales_invoices_or_customers_based_on_sales_person(self):
+		if self.filters.get("sales_person"):
+			lft, rgt = frappe.db.get_value("Sales Person",
+				self.filters.get("sales_person"), ["lft", "rgt"])
+
+			records = frappe.db.sql("""
+				select distinct parent, parenttype
+				from `tabSales Team` steam
+				where parenttype in ('Customer', 'Sales Invoice')
+					and exists(select name from `tabSales Person` where lft >= %s and rgt <= %s and name = steam.sales_person)
+			""", (lft, rgt), as_dict=1)
+
+			self.sales_person_records = frappe._dict()
+			for d in records:
+				self.sales_person_records.setdefault(d.parenttype, set()).add(d.parent)
+
 	def prepare_conditions(self):
 		conditions = [""]
 		values = [self.party_type, self.filters.report_date]
@@ -564,16 +592,6 @@
 			conditions.append("party in (select name from tabCustomer where default_sales_partner=%s)")
 			values.append(self.filters.get("sales_partner"))
 
-		if self.filters.get("sales_person"):
-			lft, rgt = frappe.db.get_value("Sales Person",
-				self.filters.get("sales_person"), ["lft", "rgt"])
-
-			conditions.append("""exists(select name from `tabSales Team` steam where
-				steam.sales_person in (select name from `tabSales Person` where lft >= {0} and rgt <= {1})
-				and ((steam.parent = voucher_no and steam.parenttype = voucher_type)
-					or (steam.parent = against_voucher and steam.parenttype = against_voucher_type)
-					or (steam.parent = party and steam.parenttype = 'Customer')))""".format(lft, rgt))
-
 	def add_supplier_filters(self, conditions, values):
 		if self.filters.get("supplier_group"):
 			conditions.append("""party in (select name from tabSupplier
diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js
index 0120608..d54824b 100644
--- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js
+++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js
@@ -106,6 +106,11 @@
 			"label": __("Sales Person"),
 			"fieldtype": "Link",
 			"options": "Sales Person"
+		},
+		{
+			"fieldname":"based_on_payment_terms",
+			"label": __("Based On Payment Terms"),
+			"fieldtype": "Check",
 		}
 	],
 
diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
index 8955830..b607c0f 100644
--- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
+++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
@@ -36,7 +36,7 @@
 			self.filters.report_date) or {}
 
 		for party, party_dict in iteritems(self.party_total):
-			if party_dict.outstanding <= 0:
+			if party_dict.outstanding == 0:
 				continue
 
 			row = frappe._dict()
diff --git a/erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py b/erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py
index bd2c34b..3e47906 100644
--- a/erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py
+++ b/erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py
@@ -18,14 +18,17 @@
 	return columns, data
 
 def get_data(filters, show_party_name):
-	party_name_field = "{0}_name".format(frappe.scrub(filters.get('party_type')))
+	if filters.get('party_type') in ('Customer', 'Supplier', 'Employee', 'Member'):
+		party_name_field = "{0}_name".format(frappe.scrub(filters.get('party_type')))
 	if filters.get('party_type') == 'Student':
 		party_name_field = 'first_name'
 	elif filters.get('party_type') == 'Shareholder':
 		party_name_field = 'title'
+	else:
+		party_name_field = 'name'
 
 	party_filters = {"name": filters.get("party")} if filters.get("party") else {}
-	parties = frappe.get_all(filters.get("party_type"), fields = ["name", party_name_field], 
+	parties = frappe.get_all(filters.get("party_type"), fields = ["name", party_name_field],
 		filters = party_filters, order_by="name")
 	company_currency = frappe.get_cached_value('Company',  filters.company,  "default_currency")
 	opening_balances = get_opening_balances(filters)
@@ -70,7 +73,7 @@
 		# totals
 		for col in total_row:
 			total_row[col] += row.get(col)
-		
+
 		row.update({
 			"currency": company_currency
 		})
@@ -78,7 +81,7 @@
 		has_value = False
 		if (opening_debit or opening_credit or debit or credit or closing_debit or closing_credit):
 			has_value  =True
-		
+
 		if cint(filters.show_zero_values) or has_value:
 			data.append(row)
 
@@ -94,9 +97,9 @@
 
 def get_opening_balances(filters):
 	gle = frappe.db.sql("""
-		select party, sum(debit) as opening_debit, sum(credit) as opening_credit 
+		select party, sum(debit) as opening_debit, sum(credit) as opening_credit
 		from `tabGL Entry`
-		where company=%(company)s 
+		where company=%(company)s
 			and ifnull(party_type, '') = %(party_type)s and ifnull(party, '') != ''
 			and (posting_date < %(from_date)s or ifnull(is_opening, 'No') = 'Yes')
 		group by party""", {
@@ -114,11 +117,11 @@
 
 def get_balances_within_period(filters):
 	gle = frappe.db.sql("""
-		select party, sum(debit) as debit, sum(credit) as credit 
+		select party, sum(debit) as debit, sum(credit) as credit
 		from `tabGL Entry`
-		where company=%(company)s 
+		where company=%(company)s
 			and ifnull(party_type, '') = %(party_type)s and ifnull(party, '') != ''
-			and posting_date >= %(from_date)s and posting_date <= %(to_date)s 
+			and posting_date >= %(from_date)s and posting_date <= %(to_date)s
 			and ifnull(is_opening, 'No') = 'No'
 		group by party""", {
 			"company": filters.company,
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index 382a89b..89c8467 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -569,7 +569,7 @@
 
 	warehouse_account = get_warehouse_account_map(company)
 
-	account_balance = get_balance_on(account, posting_date, in_account_currency=False)
+	account_balance = get_balance_on(account, posting_date, in_account_currency=False, ignore_account_permission=True)
 
 	related_warehouses = [wh for wh, wh_details in warehouse_account.items()
 		if wh_details.account == account and not wh_details.is_group]
@@ -630,7 +630,7 @@
 			'select name from `tabPurchase Invoice` where release_date IS NOT NULL and release_date > CURDATE()',
 			as_dict=1
 		)
-		held_invoices = [d['name'] for d in held_invoices]
+		held_invoices = set([d['name'] for d in held_invoices])
 
 	return held_invoices
 
@@ -639,14 +639,19 @@
 	outstanding_invoices = []
 	precision = frappe.get_precision("Sales Invoice", "outstanding_amount") or 2
 
-	if erpnext.get_party_account_type(party_type) == 'Receivable':
+	if account:
+		root_type = frappe.get_cached_value("Account", account, "root_type")
+		party_account_type = "Receivable" if root_type == "Asset" else "Payable"
+	else:
+		party_account_type = erpnext.get_party_account_type(party_type)
+
+	if party_account_type == 'Receivable':
 		dr_or_cr = "debit_in_account_currency - credit_in_account_currency"
 		payment_dr_or_cr = "credit_in_account_currency - debit_in_account_currency"
 	else:
 		dr_or_cr = "credit_in_account_currency - debit_in_account_currency"
 		payment_dr_or_cr = "debit_in_account_currency - credit_in_account_currency"
 
-	invoice = 'Sales Invoice' if erpnext.get_party_account_type(party_type) == 'Receivable' else 'Purchase Invoice'
 	held_invoices = get_held_invoices(party_type, party)
 
 	invoice_list = frappe.db.sql("""
@@ -665,7 +670,6 @@
 		group by voucher_type, voucher_no
 		order by posting_date, name""".format(
 			dr_or_cr=dr_or_cr,
-			invoice = invoice,
 			condition=condition or ""
 		), {
 			"party_type": party_type,
diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js
index f0889bf..6b3f2c7 100644
--- a/erpnext/assets/doctype/asset/asset.js
+++ b/erpnext/assets/doctype/asset/asset.js
@@ -42,6 +42,24 @@
 	},
 
 	setup: function(frm) {
+		frm.make_methods = {
+			'Asset Movement': () => {
+				frappe.call({
+				method: "erpnext.assets.doctype.asset.asset.make_asset_movement",
+				freeze: true,
+				args:{
+					"assets": [{ name: cur_frm.doc.name }]
+				},
+				callback: function (r) {
+					if (r.message) {
+						var doc = frappe.model.sync(r.message)[0];
+						frappe.set_route("Form", doc.doctype, doc.name);
+					}
+				}
+			});
+			},
+		}
+
 		frm.set_query("purchase_receipt", (doc) => {
 			return {
 				query: "erpnext.controllers.queries.get_purchase_receipts",
@@ -487,92 +505,19 @@
 	})
 };
 
-erpnext.asset.transfer_asset = function(frm) {
-	var dialog = new frappe.ui.Dialog({
-		title: __("Transfer Asset"),
-		fields: [
-			{
-				"label": __("Target Location"),
-				"fieldname": "target_location",
-				"fieldtype": "Link",
-				"options": "Location",
-				"get_query": function () {
-					return {
-						filters: [
-							["Location", "is_group", "=", 0]
-						]
-					}
-				},
-				"reqd": 1
-			},
-			{
-				"label": __("Select Serial No"),
-				"fieldname": "serial_nos",
-				"fieldtype": "Link",
-				"options": "Serial No",
-				"get_query": function () {
-					return {
-						filters: {
-							'asset': frm.doc.name
-						}
-					}
-				},
-				"onchange": function() {
-					let val = this.get_value();
-					if (val) {
-						let serial_nos = dialog.get_value("serial_no") || val;
-						if (serial_nos) {
-							serial_nos = serial_nos.split('\n');
-							serial_nos.push(val);
-
-							const unique_sn = serial_nos.filter(function(elem, index, self) {
-							    return index === self.indexOf(elem);
-							});
-
-							dialog.set_value("serial_no", unique_sn.join('\n'));
-							dialog.set_value("serial_nos", "");
-						}
-					}
-				}
-			},
-			{
-				"label": __("Serial No"),
-				"fieldname": "serial_no",
-				"read_only": 1,
-				"fieldtype": "Small Text"
-			},
-			{
-				"label": __("Date"),
-				"fieldname": "transfer_date",
-				"fieldtype": "Datetime",
-				"reqd": 1,
-				"default": frappe.datetime.now_datetime()
+erpnext.asset.transfer_asset = function() {
+	frappe.call({
+		method: "erpnext.assets.doctype.asset.asset.make_asset_movement",
+		freeze: true,
+		args:{
+			"assets": [{ name: cur_frm.doc.name }],
+			"purpose": "Transfer"
+		},
+		callback: function (r) {
+			if (r.message) {
+				var doc = frappe.model.sync(r.message)[0];
+				frappe.set_route("Form", doc.doctype, doc.name);
 			}
-		]
+		}
 	});
-
-	dialog.set_primary_action(__("Transfer"), function() {
-		var args = dialog.get_values();
-		if(!args) return;
-		dialog.hide();
-		return frappe.call({
-			type: "GET",
-			method: "erpnext.assets.doctype.asset.asset.transfer_asset",
-			args: {
-				args: {
-					"asset": frm.doc.name,
-					"transaction_date": args.transfer_date,
-					"source_location": frm.doc.location,
-					"target_location": args.target_location,
-					"serial_no": args.serial_no,
-					"company": frm.doc.company
-				}
-			},
-			freeze: true,
-			callback: function(r) {
-				cur_frm.reload_doc();
-			}
-		})
-	});
-	dialog.show();
 };
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index 9415eed..d32f834 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -31,10 +31,9 @@
 		self.validate_in_use_date()
 		self.set_status()
 		self.make_asset_movement()
-		if not self.booked_fixed_asset and is_cwip_accounting_enabled(self.company,
-			self.asset_category):
+		if not self.booked_fixed_asset and is_cwip_accounting_enabled(self.asset_category):
 			self.make_gl_entries()
-		
+
 	def before_cancel(self):
 		self.cancel_auto_gen_movement()
 
@@ -44,7 +43,7 @@
 		self.set_status()
 		delete_gl_entries(voucher_type='Asset', voucher_no=self.name)
 		self.db_set('booked_fixed_asset', 0)
-	
+
 	def validate_asset_and_reference(self):
 		if self.purchase_invoice or self.purchase_receipt:
 			reference_doc = 'Purchase Invoice' if self.purchase_invoice else 'Purchase Receipt'
@@ -52,8 +51,8 @@
 			reference_doc = frappe.get_doc(reference_doc, reference_name)
 			if reference_doc.get('company') != self.company:
 				frappe.throw(_("Company of asset {0} and purchase document {1} doesn't matches.").format(self.name, reference_doc.get('name')))
-		
-		
+
+
 		if self.is_existing_asset and self.purchase_invoice:
 			frappe.throw(_("Purchase Invoice cannot be made against an existing asset {0}").format(self.name))
 
@@ -99,7 +98,7 @@
 		if not flt(self.gross_purchase_amount):
 			frappe.throw(_("Gross Purchase Amount is mandatory"), frappe.MandatoryError)
 
-		if is_cwip_accounting_enabled(self.company, self.asset_category):
+		if is_cwip_accounting_enabled(self.asset_category):
 			if not self.is_existing_asset and not (self.purchase_receipt or self.purchase_invoice):
 				frappe.throw(_("Please create purchase receipt or purchase invoice for the item {0}").
 					format(self.item_code))
@@ -126,15 +125,17 @@
 			frappe.throw(_("Available-for-use Date should be after purchase date"))
 
 	def cancel_auto_gen_movement(self):
-		reference_docname = self.purchase_invoice or self.purchase_receipt
-		movement = frappe.db.get_all('Asset Movement', filters={ 'reference_name': reference_docname, 'docstatus': 1 })
-		if len(movement) > 1:
+		movements = frappe.db.sql(
+			"""SELECT asm.name, asm.docstatus
+			FROM `tabAsset Movement` asm, `tabAsset Movement Item` asm_item
+			WHERE asm_item.parent=asm.name and asm_item.asset=%s and asm.docstatus=1""", self.name, as_dict=1)
+		if len(movements) > 1:
 			frappe.throw(_('Asset has multiple Asset Movement Entries which has to be \
 				cancelled manually to cancel this asset.'))
-		movement = frappe.get_doc('Asset Movement', movement[0].get('name'))
+		movement = frappe.get_doc('Asset Movement', movements[0].get('name'))
 		movement.flags.ignore_validate = True
 		movement.cancel()
-		
+
 	def make_asset_movement(self):
 		reference_doctype = 'Purchase Receipt' if self.purchase_receipt else 'Purchase Invoice'
 		reference_docname = self.purchase_receipt or self.purchase_invoice
@@ -203,7 +204,7 @@
 				if has_pro_rata and n==0:
 					depreciation_amount, days, months = get_pro_rata_amt(d, depreciation_amount,
 						self.available_for_use_date, d.depreciation_start_date)
-					
+
 					# For first depr schedule date will be the start date
 					# so monthly schedule date is calculated by removing month difference between use date and start date
 					monthly_schedule_date = add_months(d.depreciation_start_date, - months + 1)
@@ -261,7 +262,7 @@
 							else:
 								date = add_months(monthly_schedule_date, r)
 								amount = depreciation_amount / month_range
-							
+
 							self.append("schedules", {
 								"schedule_date": date,
 								"depreciation_amount": amount,
@@ -295,7 +296,9 @@
 				.format(row.idx))
 
 		if not row.depreciation_start_date:
-			frappe.throw(_("Row {0}: Depreciation Start Date is required").format(row.idx))
+			if not self.available_for_use_date:
+				frappe.throw(_("Row {0}: Depreciation Start Date is required").format(row.idx))
+			row.depreciation_start_date = self.available_for_use_date
 
 		if not self.is_existing_asset:
 			self.opening_accumulated_depreciation = 0
@@ -514,15 +517,18 @@
 			asset.set_status('Out of Order')
 
 def make_post_gl_entry():
-	if not is_cwip_accounting_enabled(self.company, self.asset_category):
-		return
 
-	assets = frappe.db.sql_list(""" select name from `tabAsset`
-		where ifnull(booked_fixed_asset, 0) = 0 and available_for_use_date = %s""", nowdate())
+	asset_categories = frappe.db.get_all('Asset Category', fields = ['name', 'enable_cwip_accounting'])
 
-	for asset in assets:
-		doc = frappe.get_doc('Asset', asset)
-		doc.make_gl_entries()
+	for asset_category in asset_categories:
+		if cint(asset_category.enable_cwip_accounting):
+			assets = frappe.db.sql_list(""" select name from `tabAsset`
+				where asset_category = %s and ifnull(booked_fixed_asset, 0) = 0
+				and available_for_use_date = %s""", (asset_category.name, nowdate()))
+
+			for asset in assets:
+				doc = frappe.get_doc('Asset', asset)
+				doc.make_gl_entries()
 
 def get_asset_naming_series():
 	meta = frappe.get_meta('Asset')
@@ -646,34 +652,21 @@
 	return je
 
 @frappe.whitelist()
-def make_asset_movement(assets):
+def make_asset_movement(assets, purpose=None):
 	import json
 	from six import string_types
-	
+
 	if isinstance(assets, string_types):
 		assets = json.loads(assets)
-	
+
 	if len(assets) == 0:
 		frappe.throw(_('Atleast one asset has to be selected.'))
 
 	asset_movement = frappe.new_doc("Asset Movement")
 	asset_movement.quantity = len(assets)
-	prev_reference_docname = ''
-
 	for asset in assets:
 		asset = frappe.get_doc('Asset', asset.get('name'))
-		# get PR/PI linked with asset
-		reference_docname = asset.get('purchase_receipt') if asset.get('purchase_receipt') \
-				else asset.get('purchase_invoice')
-		# checks if all the assets are linked with a single PR/PI
-		if prev_reference_docname == '':
-			prev_reference_docname = reference_docname
-		elif prev_reference_docname != reference_docname:
-			frappe.throw(_('Assets selected should belong to same reference document.'))
-
 		asset_movement.company = asset.get('company')
-		asset_movement.reference_doctype = 'Purchase Receipt' if asset.get('purchase_receipt') else 'Purchase Invoice'
-		asset_movement.reference_name = prev_reference_docname
 		asset_movement.append("assets", {
 			'asset': asset.get('name'),
 			'source_location': asset.get('location'),
@@ -683,12 +676,7 @@
 	if asset_movement.get('assets'):
 		return asset_movement.as_dict()
 
-def is_cwip_accounting_enabled(company, asset_category=None):
-	enable_cwip_in_company = cint(frappe.db.get_value("Company", company, "enable_cwip_accounting"))
-
-	if enable_cwip_in_company or not asset_category:
-		return enable_cwip_in_company
-
+def is_cwip_accounting_enabled(asset_category):
 	return cint(frappe.db.get_value("Asset Category", asset_category, "enable_cwip_accounting"))
 
 def get_pro_rata_amt(row, depreciation_amount, from_date, to_date):
diff --git a/erpnext/assets/doctype/asset/asset_list.js b/erpnext/assets/doctype/asset/asset_list.js
index 46cde6e..02f39e0 100644
--- a/erpnext/assets/doctype/asset/asset_list.js
+++ b/erpnext/assets/doctype/asset/asset_list.js
@@ -37,6 +37,7 @@
 			const assets = me.get_checked_items();
 			frappe.call({
 				method: "erpnext.assets.doctype.asset.asset.make_asset_movement",
+				freeze: true,
 				args:{
 					"assets": assets
 				},
diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py
index 53fd6d3..a56440d 100644
--- a/erpnext/assets/doctype/asset/test_asset.py
+++ b/erpnext/assets/doctype/asset/test_asset.py
@@ -69,508 +69,508 @@
 		self.assertFalse(frappe.db.get_value("GL Entry",
 			{"voucher_type": "Purchase Invoice", "voucher_no": pi.name}))
 
-	# def test_is_fixed_asset_set(self):
-	# 	asset = create_asset(is_existing_asset = 1)
-	# 	doc = frappe.new_doc('Purchase Invoice')
-	# 	doc.supplier = '_Test Supplier'
-	# 	doc.append('items', {
-	# 		'item_code': 'Macbook Pro',
-	# 		'qty': 1,
-	# 		'asset': asset.name
-	# 	})
+	def test_is_fixed_asset_set(self):
+		asset = create_asset(is_existing_asset = 1)
+		doc = frappe.new_doc('Purchase Invoice')
+		doc.supplier = '_Test Supplier'
+		doc.append('items', {
+			'item_code': 'Macbook Pro',
+			'qty': 1,
+			'asset': asset.name
+		})
 
-	# 	doc.set_missing_values()
-	# 	self.assertEquals(doc.items[0].is_fixed_asset, 1)
+		doc.set_missing_values()
+		self.assertEquals(doc.items[0].is_fixed_asset, 1)
 
 
-	# def test_schedule_for_straight_line_method(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_schedule_for_straight_line_method(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.0, location="Test Location")
 
-	# 	asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-	# 	asset = frappe.get_doc('Asset', asset_name)
-	# 	asset.calculate_depreciation = 1
-	# 	asset.available_for_use_date = '2030-01-01'
-	# 	asset.purchase_date = '2030-01-01'
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
+		asset = frappe.get_doc('Asset', asset_name)
+		asset.calculate_depreciation = 1
+		asset.available_for_use_date = '2030-01-01'
+		asset.purchase_date = '2030-01-01'
 
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 12,
-	# 		"depreciation_start_date": "2030-12-31"
-	# 	})
-	# 	asset.save()
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": "2030-12-31"
+		})
+		asset.save()
 
-	# 	self.assertEqual(asset.status, "Draft")
-	# 	expected_schedules = [
-	# 		["2030-12-31", 30000.00, 30000.00],
-	# 		["2031-12-31", 30000.00, 60000.00],
-	# 		["2032-12-31", 30000.00, 90000.00]
-	# 	]
+		self.assertEqual(asset.status, "Draft")
+		expected_schedules = [
+			["2030-12-31", 30000.00, 30000.00],
+			["2031-12-31", 30000.00, 60000.00],
+			["2032-12-31", 30000.00, 90000.00]
+		]
 
-	# 	schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
-	# 		for d in asset.get("schedules")]
+		schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
+			for d in asset.get("schedules")]
 
-	# 	self.assertEqual(schedules, expected_schedules)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_schedule_for_straight_line_method_for_existing_asset(self):
-	# 	create_asset(is_existing_asset=1)
-	# 	asset = frappe.get_doc("Asset", {"asset_name": "Macbook Pro 1"})
-	# 	asset.calculate_depreciation = 1
-	# 	asset.number_of_depreciations_booked = 1
-	# 	asset.opening_accumulated_depreciation = 40000
-	# 	asset.available_for_use_date = "2030-06-06"
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 12,
-	# 		"depreciation_start_date": "2030-12-31"
-	# 	})
-	# 	asset.insert()
-	# 	self.assertEqual(asset.status, "Draft")
-	# 	asset.save()
-	# 	expected_schedules = [
-	# 		["2030-12-31", 14246.58, 54246.58],
-	# 		["2031-12-31", 25000.00, 79246.58],
-	# 		["2032-06-06", 10753.42, 90000.00]
-	# 	]
-	# 	schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), d.accumulated_depreciation_amount]
-	# 		for d in asset.get("schedules")]
+	def test_schedule_for_straight_line_method_for_existing_asset(self):
+		create_asset(is_existing_asset=1)
+		asset = frappe.get_doc("Asset", {"asset_name": "Macbook Pro 1"})
+		asset.calculate_depreciation = 1
+		asset.number_of_depreciations_booked = 1
+		asset.opening_accumulated_depreciation = 40000
+		asset.available_for_use_date = "2030-06-06"
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": "2030-12-31"
+		})
+		asset.insert()
+		self.assertEqual(asset.status, "Draft")
+		asset.save()
+		expected_schedules = [
+			["2030-12-31", 14246.58, 54246.58],
+			["2031-12-31", 25000.00, 79246.58],
+			["2032-06-06", 10753.42, 90000.00]
+		]
+		schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), d.accumulated_depreciation_amount]
+			for d in asset.get("schedules")]
 
-	# 	self.assertEqual(schedules, expected_schedules)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_schedule_for_double_declining_method(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_schedule_for_double_declining_method(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.0, location="Test Location")
 
-	# 	asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-	# 	asset = frappe.get_doc('Asset', asset_name)
-	# 	asset.calculate_depreciation = 1
-	# 	asset.available_for_use_date = '2030-01-01'
-	# 	asset.purchase_date = '2030-01-01'
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Double Declining Balance",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 12,
-	# 		"depreciation_start_date": '2030-12-31'
-	# 	})
-	# 	asset.insert()
-	# 	self.assertEqual(asset.status, "Draft")
-	# 	asset.save()
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
+		asset = frappe.get_doc('Asset', asset_name)
+		asset.calculate_depreciation = 1
+		asset.available_for_use_date = '2030-01-01'
+		asset.purchase_date = '2030-01-01'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Double Declining Balance",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": '2030-12-31'
+		})
+		asset.insert()
+		self.assertEqual(asset.status, "Draft")
+		asset.save()
 
-	# 	expected_schedules = [
-	# 		['2030-12-31', 66667.00, 66667.00],
-	# 		['2031-12-31', 22222.11, 88889.11],
-	# 		['2032-12-31', 1110.89, 90000.0]
-	# 	]
+		expected_schedules = [
+			['2030-12-31', 66667.00, 66667.00],
+			['2031-12-31', 22222.11, 88889.11],
+			['2032-12-31', 1110.89, 90000.0]
+		]
 
-	# 	schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
-	# 		for d in asset.get("schedules")]
+		schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
+			for d in asset.get("schedules")]
 
-	# 	self.assertEqual(schedules, expected_schedules)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_schedule_for_double_declining_method_for_existing_asset(self):
-	# 	create_asset(is_existing_asset = 1)
-	# 	asset = frappe.get_doc("Asset", {"asset_name": "Macbook Pro 1"})
-	# 	asset.calculate_depreciation = 1
-	# 	asset.is_existing_asset = 1
-	# 	asset.number_of_depreciations_booked = 1
-	# 	asset.opening_accumulated_depreciation = 50000
-	# 	asset.available_for_use_date = '2030-01-01'
-	# 	asset.purchase_date = '2029-11-30'
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Double Declining Balance",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 12,
-	# 		"depreciation_start_date": "2030-12-31"
-	# 	})
-	# 	asset.insert()
-	# 	self.assertEqual(asset.status, "Draft")
+	def test_schedule_for_double_declining_method_for_existing_asset(self):
+		create_asset(is_existing_asset = 1)
+		asset = frappe.get_doc("Asset", {"asset_name": "Macbook Pro 1"})
+		asset.calculate_depreciation = 1
+		asset.is_existing_asset = 1
+		asset.number_of_depreciations_booked = 1
+		asset.opening_accumulated_depreciation = 50000
+		asset.available_for_use_date = '2030-01-01'
+		asset.purchase_date = '2029-11-30'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Double Declining Balance",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": "2030-12-31"
+		})
+		asset.insert()
+		self.assertEqual(asset.status, "Draft")
 
-	# 	expected_schedules = [
-	# 		["2030-12-31", 33333.50, 83333.50],
-	# 		["2031-12-31", 6666.50, 90000.0]
-	# 	]
+		expected_schedules = [
+			["2030-12-31", 33333.50, 83333.50],
+			["2031-12-31", 6666.50, 90000.0]
+		]
 
-	# 	schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
-	# 		for d in asset.get("schedules")]
+		schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
+			for d in asset.get("schedules")]
 
-	# 	self.assertEqual(schedules, expected_schedules)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_schedule_for_prorated_straight_line_method(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_schedule_for_prorated_straight_line_method(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.0, location="Test Location")
 
-	# 	asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-	# 	asset = frappe.get_doc('Asset', asset_name)
-	# 	asset.calculate_depreciation = 1
-	# 	asset.purchase_date = '2030-01-30'
-	# 	asset.is_existing_asset = 0
-	# 	asset.available_for_use_date = "2030-01-30"
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 12,
-	# 		"depreciation_start_date": "2030-12-31"
-	# 	})
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
+		asset = frappe.get_doc('Asset', asset_name)
+		asset.calculate_depreciation = 1
+		asset.purchase_date = '2030-01-30'
+		asset.is_existing_asset = 0
+		asset.available_for_use_date = "2030-01-30"
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": "2030-12-31"
+		})
 
-	# 	asset.insert()
-	# 	asset.save()
+		asset.insert()
+		asset.save()
 
-	# 	expected_schedules = [
-	# 		["2030-12-31", 27534.25, 27534.25],
-	# 		["2031-12-31", 30000.0, 57534.25],
-	# 		["2032-12-31", 30000.0, 87534.25],
-	# 		["2033-01-30", 2465.75, 90000.0]
-	# 	]
+		expected_schedules = [
+			["2030-12-31", 27534.25, 27534.25],
+			["2031-12-31", 30000.0, 57534.25],
+			["2032-12-31", 30000.0, 87534.25],
+			["2033-01-30", 2465.75, 90000.0]
+		]
 
-	# 	schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
-	# 		for d in asset.get("schedules")]
+		schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
+			for d in asset.get("schedules")]
 
-	# 	self.assertEqual(schedules, expected_schedules)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_depreciation(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_depreciation(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.0, location="Test Location")
 
-	# 	asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-	# 	asset = frappe.get_doc('Asset', asset_name)
-	# 	asset.calculate_depreciation = 1
-	# 	asset.purchase_date = '2020-01-30'
-	# 	asset.available_for_use_date = "2020-01-30"
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 10,
-	# 		"depreciation_start_date": "2020-12-31"
-	# 	})
-	# 	asset.insert()
-	# 	asset.submit()
-	# 	asset.load_from_db()
-	# 	self.assertEqual(asset.status, "Submitted")
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
+		asset = frappe.get_doc('Asset', asset_name)
+		asset.calculate_depreciation = 1
+		asset.purchase_date = '2020-01-30'
+		asset.available_for_use_date = "2020-01-30"
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 10,
+			"depreciation_start_date": "2020-12-31"
+		})
+		asset.insert()
+		asset.submit()
+		asset.load_from_db()
+		self.assertEqual(asset.status, "Submitted")
 
-	# 	frappe.db.set_value("Company", "_Test Company", "series_for_depreciation_entry", "DEPR-")
-	# 	post_depreciation_entries(date="2021-01-01")
-	# 	asset.load_from_db()
+		frappe.db.set_value("Company", "_Test Company", "series_for_depreciation_entry", "DEPR-")
+		post_depreciation_entries(date="2021-01-01")
+		asset.load_from_db()
 
-	# 	# check depreciation entry series
-	# 	self.assertEqual(asset.get("schedules")[0].journal_entry[:4], "DEPR")
+		# check depreciation entry series
+		self.assertEqual(asset.get("schedules")[0].journal_entry[:4], "DEPR")
 
-	# 	expected_gle = (
-	# 		("_Test Accumulated Depreciations - _TC", 0.0, 30000.0),
-	# 		("_Test Depreciations - _TC", 30000.0, 0.0)
-	# 	)
+		expected_gle = (
+			("_Test Accumulated Depreciations - _TC", 0.0, 30000.0),
+			("_Test Depreciations - _TC", 30000.0, 0.0)
+		)
 
-	# 	gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-	# 		where against_voucher_type='Asset' and against_voucher = %s
-	# 		order by account""", asset.name)
+		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+			where against_voucher_type='Asset' and against_voucher = %s
+			order by account""", asset.name)
 
-	# 	self.assertEqual(gle, expected_gle)
-	# 	self.assertEqual(asset.get("value_after_depreciation"), 0)
+		self.assertEqual(gle, expected_gle)
+		self.assertEqual(asset.get("value_after_depreciation"), 0)
 
-	# def test_depreciation_entry_for_wdv_without_pro_rata(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=8000.0, location="Test Location")
+	def test_depreciation_entry_for_wdv_without_pro_rata(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=8000.0, location="Test Location")
 
-	# 	asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-	# 	asset = frappe.get_doc('Asset', asset_name)
-	# 	asset.calculate_depreciation = 1
-	# 	asset.available_for_use_date = '2030-01-01'
-	# 	asset.purchase_date = '2030-01-01'
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 1000,
-	# 		"depreciation_method": "Written Down Value",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 12,
-	# 		"depreciation_start_date": "2030-12-31"
-	# 	})
-	# 	asset.save(ignore_permissions=True)
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
+		asset = frappe.get_doc('Asset', asset_name)
+		asset.calculate_depreciation = 1
+		asset.available_for_use_date = '2030-01-01'
+		asset.purchase_date = '2030-01-01'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 1000,
+			"depreciation_method": "Written Down Value",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": "2030-12-31"
+		})
+		asset.save(ignore_permissions=True)
 
-	# 	self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0)
+		self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0)
 
-	# 	expected_schedules = [
-	# 		["2030-12-31", 4000.00, 4000.00],
-	# 		["2031-12-31", 2000.00, 6000.00],
-	# 		["2032-12-31", 1000.00, 7000.0],
-	# 	]
+		expected_schedules = [
+			["2030-12-31", 4000.00, 4000.00],
+			["2031-12-31", 2000.00, 6000.00],
+			["2032-12-31", 1000.00, 7000.0],
+		]
 
-	# 	schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
-	# 		for d in asset.get("schedules")]
+		schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
+			for d in asset.get("schedules")]
 
-	# 	self.assertEqual(schedules, expected_schedules)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_pro_rata_depreciation_entry_for_wdv(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=8000.0, location="Test Location")
+	def test_pro_rata_depreciation_entry_for_wdv(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=8000.0, location="Test Location")
 
-	# 	asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-	# 	asset = frappe.get_doc('Asset', asset_name)
-	# 	asset.calculate_depreciation = 1
-	# 	asset.available_for_use_date = '2030-06-06'
-	# 	asset.purchase_date = '2030-01-01'
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 1000,
-	# 		"depreciation_method": "Written Down Value",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 12,
-	# 		"depreciation_start_date": "2030-12-31"
-	# 	})
-	# 	asset.save(ignore_permissions=True)
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
+		asset = frappe.get_doc('Asset', asset_name)
+		asset.calculate_depreciation = 1
+		asset.available_for_use_date = '2030-06-06'
+		asset.purchase_date = '2030-01-01'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 1000,
+			"depreciation_method": "Written Down Value",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": "2030-12-31"
+		})
+		asset.save(ignore_permissions=True)
 
-	# 	self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0)
+		self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0)
 
-	# 	expected_schedules = [
-	# 		["2030-12-31", 2279.45, 2279.45],
-	# 		["2031-12-31", 2860.28, 5139.73],
-	# 		["2032-12-31", 1430.14, 6569.87],
-	# 		["2033-06-06", 430.13, 7000.0],
-	# 	]
+		expected_schedules = [
+			["2030-12-31", 2279.45, 2279.45],
+			["2031-12-31", 2860.28, 5139.73],
+			["2032-12-31", 1430.14, 6569.87],
+			["2033-06-06", 430.13, 7000.0],
+		]
 
-	# 	schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
-	# 		for d in asset.get("schedules")]
+		schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
+			for d in asset.get("schedules")]
 
-	# 	self.assertEqual(schedules, expected_schedules)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_depreciation_entry_cancellation(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_depreciation_entry_cancellation(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.0, location="Test Location")
 
-	# 	asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-	# 	asset = frappe.get_doc('Asset', asset_name)
-	# 	asset.calculate_depreciation = 1
-	# 	asset.available_for_use_date = '2020-06-06'
-	# 	asset.purchase_date = '2020-06-06'
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 10,
-	# 		"depreciation_start_date": "2020-12-31"
-	# 	})
-	# 	asset.insert()
-	# 	asset.submit()
-	# 	post_depreciation_entries(date="2021-01-01")
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
+		asset = frappe.get_doc('Asset', asset_name)
+		asset.calculate_depreciation = 1
+		asset.available_for_use_date = '2020-06-06'
+		asset.purchase_date = '2020-06-06'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 10,
+			"depreciation_start_date": "2020-12-31"
+		})
+		asset.insert()
+		asset.submit()
+		post_depreciation_entries(date="2021-01-01")
 
-	# 	asset.load_from_db()
+		asset.load_from_db()
 
-	# 	# cancel depreciation entry
-	# 	depr_entry = asset.get("schedules")[0].journal_entry
-	# 	self.assertTrue(depr_entry)
-	# 	frappe.get_doc("Journal Entry", depr_entry).cancel()
+		# cancel depreciation entry
+		depr_entry = asset.get("schedules")[0].journal_entry
+		self.assertTrue(depr_entry)
+		frappe.get_doc("Journal Entry", depr_entry).cancel()
 
-	# 	asset.load_from_db()
-	# 	depr_entry = asset.get("schedules")[0].journal_entry
-	# 	self.assertFalse(depr_entry)
+		asset.load_from_db()
+		depr_entry = asset.get("schedules")[0].journal_entry
+		self.assertFalse(depr_entry)
 
-	# def test_scrap_asset(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_scrap_asset(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.0, location="Test Location")
 
-	# 	asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-	# 	asset = frappe.get_doc('Asset', asset_name)
-	# 	asset.calculate_depreciation = 1
-	# 	asset.available_for_use_date = nowdate()
-	# 	asset.purchase_date = nowdate()
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 10,
-	# 		"depreciation_start_date": nowdate()
-	# 	})
-	# 	asset.insert()
-	# 	asset.submit()
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
+		asset = frappe.get_doc('Asset', asset_name)
+		asset.calculate_depreciation = 1
+		asset.available_for_use_date = nowdate()
+		asset.purchase_date = nowdate()
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 10,
+			"depreciation_start_date": nowdate()
+		})
+		asset.insert()
+		asset.submit()
 
-	# 	post_depreciation_entries(date=add_months(nowdate(), 10))
+		post_depreciation_entries(date=add_months(nowdate(), 10))
 
-	# 	scrap_asset(asset.name)
+		scrap_asset(asset.name)
 
-	# 	asset.load_from_db()
-	# 	self.assertEqual(asset.status, "Scrapped")
-	# 	self.assertTrue(asset.journal_entry_for_scrap)
+		asset.load_from_db()
+		self.assertEqual(asset.status, "Scrapped")
+		self.assertTrue(asset.journal_entry_for_scrap)
 
-	# 	expected_gle = (
-	# 		("_Test Accumulated Depreciations - _TC", 30000.0, 0.0),
-	# 		("_Test Fixed Asset - _TC", 0.0, 100000.0),
-	# 		("_Test Gain/Loss on Asset Disposal - _TC", 70000.0, 0.0)
-	# 	)
+		expected_gle = (
+			("_Test Accumulated Depreciations - _TC", 30000.0, 0.0),
+			("_Test Fixed Asset - _TC", 0.0, 100000.0),
+			("_Test Gain/Loss on Asset Disposal - _TC", 70000.0, 0.0)
+		)
 
-	# 	gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-	# 		where voucher_type='Journal Entry' and voucher_no = %s
-	# 		order by account""", asset.journal_entry_for_scrap)
-	# 	self.assertEqual(gle, expected_gle)
+		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+			where voucher_type='Journal Entry' and voucher_no = %s
+			order by account""", asset.journal_entry_for_scrap)
+		self.assertEqual(gle, expected_gle)
 
-	# 	restore_asset(asset.name)
+		restore_asset(asset.name)
 
-	# 	asset.load_from_db()
-	# 	self.assertFalse(asset.journal_entry_for_scrap)
-	# 	self.assertEqual(asset.status, "Partially Depreciated")
+		asset.load_from_db()
+		self.assertFalse(asset.journal_entry_for_scrap)
+		self.assertEqual(asset.status, "Partially Depreciated")
 
-	# def test_asset_sale(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_asset_sale(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.0, location="Test Location")
 
-	# 	asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-	# 	asset = frappe.get_doc('Asset', asset_name)
-	# 	asset.calculate_depreciation = 1
-	# 	asset.available_for_use_date = '2020-06-06'
-	# 	asset.purchase_date = '2020-06-06'
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 10,
-	# 		"depreciation_start_date": "2020-12-31"
-	# 	})
-	# 	asset.insert()
-	# 	asset.submit()
-	# 	post_depreciation_entries(date="2021-01-01")
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
+		asset = frappe.get_doc('Asset', asset_name)
+		asset.calculate_depreciation = 1
+		asset.available_for_use_date = '2020-06-06'
+		asset.purchase_date = '2020-06-06'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 10,
+			"depreciation_start_date": "2020-12-31"
+		})
+		asset.insert()
+		asset.submit()
+		post_depreciation_entries(date="2021-01-01")
 
-	# 	si = make_sales_invoice(asset=asset.name, item_code="Macbook Pro", company="_Test Company")
-	# 	si.customer = "_Test Customer"
-	# 	si.due_date = nowdate()
-	# 	si.get("items")[0].rate = 25000
-	# 	si.insert()
-	# 	si.submit()
+		si = make_sales_invoice(asset=asset.name, item_code="Macbook Pro", company="_Test Company")
+		si.customer = "_Test Customer"
+		si.due_date = nowdate()
+		si.get("items")[0].rate = 25000
+		si.insert()
+		si.submit()
 
-	# 	self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold")
+		self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold")
 
-	# 	expected_gle = (
-	# 		("_Test Accumulated Depreciations - _TC", 20392.16, 0.0),
-	# 		("_Test Fixed Asset - _TC", 0.0, 100000.0),
-	# 		("_Test Gain/Loss on Asset Disposal - _TC", 54607.84, 0.0),
-	# 		("Debtors - _TC", 25000.0, 0.0)
-	# 	)
+		expected_gle = (
+			("_Test Accumulated Depreciations - _TC", 20392.16, 0.0),
+			("_Test Fixed Asset - _TC", 0.0, 100000.0),
+			("_Test Gain/Loss on Asset Disposal - _TC", 54607.84, 0.0),
+			("Debtors - _TC", 25000.0, 0.0)
+		)
 
-	# 	gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-	# 		where voucher_type='Sales Invoice' and voucher_no = %s
-	# 		order by account""", si.name)
+		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+			where voucher_type='Sales Invoice' and voucher_no = %s
+			order by account""", si.name)
 
-	# 	self.assertEqual(gle, expected_gle)
+		self.assertEqual(gle, expected_gle)
 
-	# 	si.cancel()
-	# 	self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Partially Depreciated")
+		si.cancel()
+		self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Partially Depreciated")
 
-	# def test_asset_expected_value_after_useful_life(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_asset_expected_value_after_useful_life(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.0, location="Test Location")
 
-	# 	asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-	# 	asset = frappe.get_doc('Asset', asset_name)
-	# 	asset.calculate_depreciation = 1
-	# 	asset.available_for_use_date = '2020-06-06'
-	# 	asset.purchase_date = '2020-06-06'
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 10,
-	# 		"depreciation_start_date": "2020-06-06"
-	# 	})
-	# 	asset.insert()
-	# 	accumulated_depreciation_after_full_schedule = \
-	# 		max([d.accumulated_depreciation_amount for d in asset.get("schedules")])
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
+		asset = frappe.get_doc('Asset', asset_name)
+		asset.calculate_depreciation = 1
+		asset.available_for_use_date = '2020-06-06'
+		asset.purchase_date = '2020-06-06'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 10,
+			"depreciation_start_date": "2020-06-06"
+		})
+		asset.insert()
+		accumulated_depreciation_after_full_schedule = \
+			max([d.accumulated_depreciation_amount for d in asset.get("schedules")])
 
-	# 	asset_value_after_full_schedule = (flt(asset.gross_purchase_amount) -
-	# 		flt(accumulated_depreciation_after_full_schedule))
+		asset_value_after_full_schedule = (flt(asset.gross_purchase_amount) -
+			flt(accumulated_depreciation_after_full_schedule))
 
-	# 	self.assertTrue(asset.finance_books[0].expected_value_after_useful_life >= asset_value_after_full_schedule)
+		self.assertTrue(asset.finance_books[0].expected_value_after_useful_life >= asset_value_after_full_schedule)
 
-	# def test_cwip_accounting(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=5000, do_not_submit=True, location="Test Location")
+	def test_cwip_accounting(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=5000, do_not_submit=True, location="Test Location")
 
-	# 	pr.set('taxes', [{
-	# 		'category': 'Total',
-	# 		'add_deduct_tax': 'Add',
-	# 		'charge_type': 'On Net Total',
-	# 		'account_head': '_Test Account Service Tax - _TC',
-	# 		'description': '_Test Account Service Tax',
-	# 		'cost_center': 'Main - _TC',
-	# 		'rate': 5.0
-	# 	}, {
-	# 		'category': 'Valuation and Total',
-	# 		'add_deduct_tax': 'Add',
-	# 		'charge_type': 'On Net Total',
-	# 		'account_head': '_Test Account Shipping Charges - _TC',
-	# 		'description': '_Test Account Shipping Charges',
-	# 		'cost_center': 'Main - _TC',
-	# 		'rate': 5.0
-	# 	}])
+		pr.set('taxes', [{
+			'category': 'Total',
+			'add_deduct_tax': 'Add',
+			'charge_type': 'On Net Total',
+			'account_head': '_Test Account Service Tax - _TC',
+			'description': '_Test Account Service Tax',
+			'cost_center': 'Main - _TC',
+			'rate': 5.0
+		}, {
+			'category': 'Valuation and Total',
+			'add_deduct_tax': 'Add',
+			'charge_type': 'On Net Total',
+			'account_head': '_Test Account Shipping Charges - _TC',
+			'description': '_Test Account Shipping Charges',
+			'cost_center': 'Main - _TC',
+			'rate': 5.0
+		}])
 
-	# 	pr.submit()
+		pr.submit()
 
-	# 	expected_gle = (
-	# 		("Asset Received But Not Billed - _TC", 0.0, 5250.0),
-	# 		("CWIP Account - _TC", 5250.0, 0.0)
-	# 	)
+		expected_gle = (
+			("Asset Received But Not Billed - _TC", 0.0, 5250.0),
+			("CWIP Account - _TC", 5250.0, 0.0)
+		)
 
-	# 	pr_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-	# 		where voucher_type='Purchase Receipt' and voucher_no = %s
-	# 		order by account""", pr.name)
+		pr_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+			where voucher_type='Purchase Receipt' and voucher_no = %s
+			order by account""", pr.name)
 
-	# 	self.assertEqual(pr_gle, expected_gle)
+		self.assertEqual(pr_gle, expected_gle)
 
-	# 	pi = make_invoice(pr.name)
-	# 	pi.submit()
+		pi = make_invoice(pr.name)
+		pi.submit()
 
-	# 	expected_gle = (
-	# 		("_Test Account Service Tax - _TC", 250.0, 0.0),
-	# 		("_Test Account Shipping Charges - _TC", 250.0, 0.0),
-	# 		("Asset Received But Not Billed - _TC", 5250.0, 0.0),
-	# 		("Creditors - _TC", 0.0, 5500.0),
-	# 		("Expenses Included In Asset Valuation - _TC", 0.0, 250.0),
-	# 	)
+		expected_gle = (
+			("_Test Account Service Tax - _TC", 250.0, 0.0),
+			("_Test Account Shipping Charges - _TC", 250.0, 0.0),
+			("Asset Received But Not Billed - _TC", 5250.0, 0.0),
+			("Creditors - _TC", 0.0, 5500.0),
+			("Expenses Included In Asset Valuation - _TC", 0.0, 250.0),
+		)
 
-	# 	pi_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-	# 		where voucher_type='Purchase Invoice' and voucher_no = %s
-	# 		order by account""", pi.name)
+		pi_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+			where voucher_type='Purchase Invoice' and voucher_no = %s
+			order by account""", pi.name)
 
-	# 	self.assertEqual(pi_gle, expected_gle)
+		self.assertEqual(pi_gle, expected_gle)
 
-	# 	asset = frappe.db.get_value('Asset',
-	# 		{'purchase_receipt': pr.name, 'docstatus': 0}, 'name')
+		asset = frappe.db.get_value('Asset',
+			{'purchase_receipt': pr.name, 'docstatus': 0}, 'name')
 
-	# 	asset_doc = frappe.get_doc('Asset', asset)
+		asset_doc = frappe.get_doc('Asset', asset)
 
-	# 	month_end_date = get_last_day(nowdate())
-	# 	asset_doc.available_for_use_date = nowdate() if nowdate() != month_end_date else add_days(nowdate(), -15)
-	# 	self.assertEqual(asset_doc.gross_purchase_amount, 5250.0)
+		month_end_date = get_last_day(nowdate())
+		asset_doc.available_for_use_date = nowdate() if nowdate() != month_end_date else add_days(nowdate(), -15)
+		self.assertEqual(asset_doc.gross_purchase_amount, 5250.0)
 
-	# 	asset_doc.append("finance_books", {
-	# 		"expected_value_after_useful_life": 200,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 10,
-	# 		"depreciation_start_date": month_end_date
-	# 	})
-	# 	asset_doc.submit()
+		asset_doc.append("finance_books", {
+			"expected_value_after_useful_life": 200,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 10,
+			"depreciation_start_date": month_end_date
+		})
+		asset_doc.submit()
 
-	# 	expected_gle = (
-	# 		("_Test Fixed Asset - _TC", 5250.0, 0.0),
-	# 		("CWIP Account - _TC", 0.0, 5250.0)
-	# 	)
+		expected_gle = (
+			("_Test Fixed Asset - _TC", 5250.0, 0.0),
+			("CWIP Account - _TC", 0.0, 5250.0)
+		)
 
-	# 	gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-	# 		where voucher_type='Asset' and voucher_no = %s
-	# 		order by account""", asset_doc.name)
+		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+			where voucher_type='Asset' and voucher_no = %s
+			order by account""", asset_doc.name)
 
 
-	# 	self.assertEqual(gle, expected_gle)
+		self.assertEqual(gle, expected_gle)
 
-	# def test_expense_head(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=2, rate=200000.0, location="Test Location")
+	def test_expense_head(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=2, rate=200000.0, location="Test Location")
 
-	# 	doc = make_invoice(pr.name)
+		doc = make_invoice(pr.name)
 
-	# 	self.assertEquals('Asset Received But Not Billed - _TC', doc.items[0].expense_account)
+		self.assertEquals('Asset Received But Not Billed - _TC', doc.items[0].expense_account)
 
 def create_asset_data():
 	if not frappe.db.exists("Asset Category", "Computers"):
diff --git a/erpnext/assets/doctype/asset_category/asset_category.py b/erpnext/assets/doctype/asset_category/asset_category.py
index 14f3922..fc08841 100644
--- a/erpnext/assets/doctype/asset_category/asset_category.py
+++ b/erpnext/assets/doctype/asset_category/asset_category.py
@@ -11,7 +11,6 @@
 class AssetCategory(Document):
 	def validate(self):
 		self.validate_finance_books()
-		self.validate_enable_cwip_accounting()
 
 	def validate_finance_books(self):
 		for d in self.finance_books:
@@ -19,15 +18,6 @@
 				if cint(d.get(frappe.scrub(field)))<1:
 					frappe.throw(_("Row {0}: {1} must be greater than 0").format(d.idx, field), frappe.MandatoryError)
 
-	def validate_enable_cwip_accounting(self):
-		if self.enable_cwip_accounting :
-			for d in self.accounts:
-				cwip = frappe.db.get_value("Company",d.company_name,"enable_cwip_accounting")
-				if cwip:
-					frappe.throw(_
-						("CWIP is enabled globally in Company {1}. To enable it in Asset Category, first disable it in {1} ").format(
-							frappe.bold(d.idx), frappe.bold(d.company_name)))
-
 @frappe.whitelist()
 def get_asset_category_account(fieldname, item=None, asset=None, account=None, asset_category = None, company = None):
 	if item and frappe.db.get_value("Item", item, "is_fixed_asset"):
@@ -39,7 +29,8 @@
 				account=None
 
 		if not account:
-			asset_category, company = frappe.db.get_value("Asset", asset, ["asset_category", "company"])
+			asset_details = frappe.db.get_value("Asset", asset, ["asset_category", "company"])
+			asset_category, company = asset_details or [None, None]
 
 	account = frappe.db.get_value("Asset Category Account",
 		filters={"parent": asset_category, "company_name": company}, fieldname=fieldname)
diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.js b/erpnext/assets/doctype/asset_movement/asset_movement.js
index a71212e..06d8879 100644
--- a/erpnext/assets/doctype/asset_movement/asset_movement.js
+++ b/erpnext/assets/doctype/asset_movement/asset_movement.js
@@ -31,6 +31,13 @@
 					name: ["in", ["Purchase Receipt", "Purchase Invoice"]]
 				}
 			};
+		}),
+		frm.set_query("asset", "assets", () => {
+			return {
+				filters: {
+					status: ["not in", ["Draft"]]
+				}
+			}
 		})
 	},
 
@@ -76,50 +83,6 @@
 			});
 		});
 		frm.refresh_field('assets');
-	},
-
-	reference_name: function(frm) {
-		if (frm.doc.reference_name && frm.doc.reference_doctype) {
-			const reference_doctype = frm.doc.reference_doctype === 'Purchase Invoice' ? 'purchase_invoice' : 'purchase_receipt';
-			// On selection of reference name,
-			// sets query to display assets linked to that reference doc
-			frm.set_query('asset', 'assets', function() {
-				return {
-					filters: {
-						[reference_doctype] : frm.doc.reference_name
-					}
-				};
-			});
-
-			// fetches linked asset & adds to the assets table
-			frappe.db.get_list('Asset', {
-				fields: ['name', 'location', 'custodian'],
-				filters: {
-					[reference_doctype] : frm.doc.reference_name
-				}
-			}).then((docs) => {
-				if (docs.length == 0) {
-					frappe.msgprint(frappe._(`Please select ${frm.doc.reference_doctype} which has assets.`));
-					frm.doc.reference_name = '';
-					frm.refresh_field('reference_name');
-					return;
-				}
-				frm.doc.assets = [];
-				docs.forEach(doc => {
-					frm.add_child('assets', {
-						asset: doc.name,
-						source_location: doc.location,
-						from_employee: doc.custodian
-					});
-					frm.refresh_field('assets');
-				})
-			}).catch((err) => {
-				console.log(err); // eslint-disable-line
-			});
-		} else {
-			// if reference is deleted then remove query
-			frm.set_query('asset', 'assets', () => ({ filters: {} }));
-		}
 	}
 });
 
@@ -132,7 +95,7 @@
 				if(asset_doc.location) frappe.model.set_value(cdt, cdn, 'source_location', asset_doc.location);
 				if(asset_doc.custodian) frappe.model.set_value(cdt, cdn, 'from_employee', asset_doc.custodian);
 			}).catch((err) => {
-				console.log(err);
+				console.log(err); // eslint-disable-line
 			});
 		}
 	}
diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.json b/erpnext/assets/doctype/asset_movement/asset_movement.json
index 19af81d..3472ab5 100644
--- a/erpnext/assets/doctype/asset_movement/asset_movement.json
+++ b/erpnext/assets/doctype/asset_movement/asset_movement.json
@@ -9,12 +9,12 @@
   "purpose",
   "column_break_4",
   "transaction_date",
+  "section_break_10",
+  "assets",
   "reference",
   "reference_doctype",
   "column_break_9",
   "reference_name",
-  "section_break_10",
-  "assets",
   "amended_from"
  ],
  "fields": [
@@ -47,6 +47,7 @@
    "fieldtype": "Column Break"
   },
   {
+   "collapsible": 1,
    "fieldname": "reference",
    "fieldtype": "Section Break",
    "label": "Reference"
@@ -54,18 +55,16 @@
   {
    "fieldname": "reference_doctype",
    "fieldtype": "Link",
-   "label": "Reference DocType",
+   "label": "Reference Document Type",
    "no_copy": 1,
-   "options": "DocType",
-   "reqd": 1
+   "options": "DocType"
   },
   {
    "fieldname": "reference_name",
    "fieldtype": "Dynamic Link",
-   "label": "Reference Name",
+   "label": "Reference Document Name",
    "no_copy": 1,
-   "options": "reference_doctype",
-   "reqd": 1
+   "options": "reference_doctype"
   },
   {
    "fieldname": "amended_from",
@@ -93,7 +92,7 @@
   }
  ],
  "is_submittable": 1,
- "modified": "2019-11-13 15:37:48.870147",
+ "modified": "2019-11-23 13:28:47.256935",
  "modified_by": "Administrator",
  "module": "Assets",
  "name": "Asset Movement",
diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.py b/erpnext/assets/doctype/asset_movement/asset_movement.py
index 714845d..4e1822b 100644
--- a/erpnext/assets/doctype/asset_movement/asset_movement.py
+++ b/erpnext/assets/doctype/asset_movement/asset_movement.py
@@ -22,7 +22,7 @@
 			if company != self.company:
 				frappe.throw(_("Asset {0} does not belong to company {1}").format(d.asset, self.company))
 
-			if not(d.source_location or d.target_location or d.from_employee or d.to_employee):
+			if not (d.source_location or d.target_location or d.from_employee or d.to_employee):
 				frappe.throw(_("Either location or employee must be required"))
 
 	def validate_location(self):
diff --git a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json
index a25b4ce..3236e72 100644
--- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json
+++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json
@@ -60,7 +60,8 @@
   {
    "fieldname": "date",
    "fieldtype": "Date",
-   "label": "Date"
+   "label": "Date",
+   "reqd": 1
   },
   {
    "fieldname": "current_asset_value",
@@ -110,7 +111,7 @@
   }
  ],
  "is_submittable": 1,
- "modified": "2019-05-26 09:46:23.613412",
+ "modified": "2019-11-22 14:09:25.800375",
  "modified_by": "Administrator",
  "module": "Assets",
  "name": "Asset Value Adjustment",
diff --git a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
index 56425a0..155597e 100644
--- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
+++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
@@ -5,12 +5,13 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
-from frappe.utils import flt, getdate, cint, date_diff
+from frappe.utils import flt, getdate, cint, date_diff, formatdate
 from erpnext.assets.doctype.asset.depreciation import get_depreciation_accounts
 from frappe.model.document import Document
 
 class AssetValueAdjustment(Document):
 	def validate(self):
+		self.validate_date()
 		self.set_difference_amount()
 		self.set_current_asset_value()
 
@@ -23,6 +24,12 @@
 			frappe.throw(_("Cancel the journal entry {0} first").format(self.journal_entry))
 
 		self.reschedule_depreciations(self.current_asset_value)
+	
+	def validate_date(self):
+		asset_purchase_date = frappe.db.get_value('Asset', self.asset, 'purchase_date')
+		if getdate(self.date) < getdate(asset_purchase_date):
+			frappe.throw(_("Asset Value Adjustment cannot be posted before Asset's purchase date <b>{0}</b>.")
+				.format(formatdate(asset_purchase_date)), title="Incorrect Date")
 
 	def set_difference_amount(self):
 		self.difference_amount = flt(self.current_asset_value - self.new_asset_value)
diff --git a/erpnext/assets/report/fixed_asset_register/fixed_asset_register.js b/erpnext/assets/report/fixed_asset_register/fixed_asset_register.js
index 426caaa..8c737d0 100644
--- a/erpnext/assets/report/fixed_asset_register/fixed_asset_register.js
+++ b/erpnext/assets/report/fixed_asset_register/fixed_asset_register.js
@@ -26,5 +26,11 @@
 			fieldtype: "Link",
 			options: "Finance Book"
 		},
+		{
+			fieldname:"date",
+			label: __("Date"),
+			fieldtype: "Date",
+			default: frappe.datetime.get_today()
+		},
 	]
 };
diff --git a/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py b/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py
index f395499..57b68b4 100644
--- a/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py
+++ b/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py
@@ -4,7 +4,7 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
-from frappe.utils import cstr
+from frappe.utils import cstr, today, flt
 
 def execute(filters=None):
 	filters = frappe._dict(filters or {})
@@ -86,8 +86,8 @@
 			"width": 90
 		},
 		{
-			"label": _("Current Value"),
-			"fieldname": "current_value",
+			"label": _("Asset Value"),
+			"fieldname": "asset_value",
 			"options": "Currency",
 			"width": 90
 		},
@@ -114,7 +114,7 @@
 	data = []
 
 	conditions = get_conditions(filters)
-	current_value_map = get_finance_book_value_map(filters.finance_book)
+	depreciation_amount_map = get_finance_book_value_map(filters.date, filters.finance_book)
 	pr_supplier_map = get_purchase_receipt_supplier_map()
 	pi_supplier_map = get_purchase_invoice_supplier_map()
 
@@ -125,7 +125,9 @@
 			"available_for_use_date", "status", "purchase_invoice"])
 
 	for asset in assets_record:
-		if current_value_map.get(asset.name) is not None:
+		asset_value = asset.gross_purchase_amount - flt(asset.opening_accumulated_depreciation) \
+			- flt(depreciation_amount_map.get(asset.name))
+		if asset_value:
 			row = {
 				"asset_id": asset.name,
 				"asset_name": asset.asset_name,
@@ -138,19 +140,24 @@
 				"location": asset.location,
 				"asset_category": asset.asset_category,
 				"purchase_date": asset.purchase_date,
-				"current_value": current_value_map.get(asset.name)
+				"asset_value": asset_value
 			}
 			data.append(row)
 
 	return data
 
-def get_finance_book_value_map(finance_book=''):
+def get_finance_book_value_map(date, finance_book=''):
+	if not date:
+		date = today()
 	return frappe._dict(frappe.db.sql(''' Select
-		parent, value_after_depreciation
-		FROM `tabAsset Finance Book`
+		parent, SUM(depreciation_amount)
+		FROM `tabDepreciation Schedule`
 		WHERE
-			parentfield='finance_books'
-			AND ifnull(finance_book, '')=%s''', cstr(finance_book)))
+			parentfield='schedules'
+			AND schedule_date<=%s
+			AND journal_entry IS NOT NULL
+			AND ifnull(finance_book, '')=%s
+		GROUP BY parent''', (date, cstr(finance_book))))
 
 def get_purchase_receipt_supplier_map():
 	return frappe._dict(frappe.db.sql(''' Select
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js
index c5fa98d..7b5e5c5 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.js
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.js
@@ -18,6 +18,7 @@
 			return {
 				filters: {
 					"company": frm.doc.company,
+					"name": ['!=', frm.doc.supplier_warehouse],
 					"is_group": 0
 				}
 			}
@@ -283,6 +284,8 @@
 			})
 		}
 
+		me.dialog.get_field('sub_con_rm_items').check_all_rows()
+
 		me.dialog.show()
 		this.dialog.set_primary_action(__('Transfer'), function() {
 			me.values = me.dialog.get_values();
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index 845ff74..f62df20 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -313,7 +313,7 @@
 
 	last_purchase_details =  get_last_purchase_details(item_code, name)
 	if last_purchase_details:
-		last_purchase_rate = (last_purchase_details['base_rate'] * (flt(conversion_factor) or 1.0)) / conversion_rate
+		last_purchase_rate = (last_purchase_details['base_net_rate'] * (flt(conversion_factor) or 1.0)) / conversion_rate
 		return last_purchase_rate
 	else:
 		item_last_purchase_rate = frappe.get_cached_value("Item", item_code, "last_purchase_rate")
diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py
index 4506db6..08f5d8b 100644
--- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py
@@ -17,6 +17,8 @@
 from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
 from erpnext.controllers.accounts_controller import update_child_qty_rate
 from erpnext.controllers.status_updater import OverAllowanceError
+from erpnext.manufacturing.doctype.blanket_order.test_blanket_order import make_blanket_order
+
 
 class TestPurchaseOrder(unittest.TestCase):
 	def test_make_purchase_receipt(self):
@@ -519,47 +521,62 @@
 	def test_backflush_based_on_stock_entry(self):
 		item_code = "_Test Subcontracted FG Item 1"
 		make_subcontracted_item(item_code)
+		make_item('Sub Contracted Raw Material 1', {
+			'is_stock_item': 1,
+			'is_sub_contracted_item': 1
+		})
 
 		update_backflush_based_on("Material Transferred for Subcontract")
-		po = create_purchase_order(item_code=item_code, qty=1,
+
+		order_qty = 5
+		po = create_purchase_order(item_code=item_code, qty=order_qty,
 			is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC")
 
-		make_stock_entry(target="_Test Warehouse - _TC", qty=10, basic_rate=100)
 		make_stock_entry(target="_Test Warehouse - _TC",
 			item_code="_Test Item Home Desktop 100", qty=10, basic_rate=100)
 		make_stock_entry(target="_Test Warehouse - _TC",
 			item_code = "Test Extra Item 1", qty=100, basic_rate=100)
 		make_stock_entry(target="_Test Warehouse - _TC",
 			item_code = "Test Extra Item 2", qty=10, basic_rate=100)
+		make_stock_entry(target="_Test Warehouse - _TC",
+			item_code = "Sub Contracted Raw Material 1", qty=10, basic_rate=100)
 
-		rm_item = [
-			{"item_code":item_code,"rm_item_code":"_Test Item","item_name":"_Test Item",
-				"qty":1,"warehouse":"_Test Warehouse - _TC","rate":100,"amount":100,"stock_uom":"Nos"},
+		rm_items = [
+			{"item_code":item_code,"rm_item_code":"Sub Contracted Raw Material 1","item_name":"_Test Item",
+				"qty":10,"warehouse":"_Test Warehouse - _TC", "stock_uom":"Nos"},
 			{"item_code":item_code,"rm_item_code":"_Test Item Home Desktop 100","item_name":"_Test Item Home Desktop 100",
-				"qty":2,"warehouse":"_Test Warehouse - _TC","rate":100,"amount":200,"stock_uom":"Nos"},
+				"qty":20,"warehouse":"_Test Warehouse - _TC", "stock_uom":"Nos"},
 			{"item_code":item_code,"rm_item_code":"Test Extra Item 1","item_name":"Test Extra Item 1",
-				"qty":1,"warehouse":"_Test Warehouse - _TC","rate":100,"amount":200,"stock_uom":"Nos"}]
+				"qty":10,"warehouse":"_Test Warehouse - _TC", "stock_uom":"Nos"},
+			{'item_code': item_code, 'rm_item_code': 'Test Extra Item 2', 'stock_uom':'Nos',
+				'qty': 10, 'warehouse': '_Test Warehouse - _TC', 'item_name':'Test Extra Item 2'}]
 
-		rm_item_string = json.dumps(rm_item)
+		rm_item_string = json.dumps(rm_items)
 		se = frappe.get_doc(make_subcontract_transfer_entry(po.name, rm_item_string))
-		se.append('items', {
-			'item_code': "Test Extra Item 2",
-			"qty": 1,
-			"rate": 100,
-			"s_warehouse": "_Test Warehouse - _TC",
-			"t_warehouse": "_Test Warehouse 1 - _TC"
-		})
-		se.set_missing_values()
 		se.submit()
 
 		pr = make_purchase_receipt(po.name)
+
+		received_qty = 2
+		# partial receipt
+		pr.get('items')[0].qty = received_qty
 		pr.save()
 		pr.submit()
 
-		se_items = sorted([d.item_code for d in se.get('items')])
-		supplied_items = sorted([d.rm_item_code for d in pr.get('supplied_items')])
+		transferred_items = sorted([d.item_code for d in se.get('items') if se.purchase_order == po.name])
+		issued_items = sorted([d.rm_item_code for d in pr.get('supplied_items')])
 
-		self.assertEquals(se_items, supplied_items)
+		self.assertEquals(transferred_items, issued_items)
+		self.assertEquals(pr.get('items')[0].rm_supp_cost, 2000)
+
+
+		transferred_rm_map = frappe._dict()
+		for item in rm_items:
+			transferred_rm_map[item.get('rm_item_code')] = item
+
+		for item in pr.get('supplied_items'):
+			self.assertEqual(item.get('required_qty'), (transferred_rm_map[item.get('rm_item_code')].get('qty') / order_qty) * received_qty)
+
 		update_backflush_based_on("BOM")
 
 	def test_advance_payment_entry_unlink_against_purchase_order(self):
@@ -605,6 +622,27 @@
 		po.save()
 		self.assertEqual(po.schedule_date, add_days(nowdate(), 2))
 
+	
+	def test_po_optional_blanket_order(self):
+		"""
+			Expected result: Blanket order Ordered Quantity should only be affected on Purchase Order with against_blanket_order = 1.
+			Second Purchase Order should not add on to Blanket Orders Ordered Quantity.
+		"""
+
+		bo = make_blanket_order(blanket_order_type = "Purchasing", quantity = 10, rate = 10)
+
+		po = create_purchase_order(item_code= "_Test Item", qty = 5, against_blanket_order = 1)
+		po_doc = frappe.get_doc('Purchase Order', po.get('name'))
+		# To test if the PO has a Blanket Order
+		self.assertTrue(po_doc.items[0].blanket_order)
+
+		po = create_purchase_order(item_code= "_Test Item", qty = 5, against_blanket_order = 0)
+		po_doc = frappe.get_doc('Purchase Order', po.get('name'))
+		# To test if the PO does NOT have a Blanket Order
+		self.assertEqual(po_doc.items[0].blanket_order, None)
+
+
+
 
 def make_pr_against_po(po, received_qty=0):
 	pr = make_purchase_receipt(po)
@@ -678,7 +716,8 @@
 		"qty": args.qty or 10,
 		"rate": args.rate or 500,
 		"schedule_date": add_days(nowdate(), 1),
-		"include_exploded_items": args.get('include_exploded_items', 1)
+		"include_exploded_items": args.get('include_exploded_items', 1),
+		"against_blanket_order": args.against_blanket_order
 	})
 	if not args.do_not_save:
 		po.insert()
diff --git a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
index c409c1f..6768dfa 100644
--- a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
+++ b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
@@ -1,4 +1,5 @@
 {
+ "actions": [],
  "autoname": "hash",
  "creation": "2013-05-24 19:29:06",
  "doctype": "DocType",
@@ -67,6 +68,7 @@
   "supplier_quotation",
   "supplier_quotation_item",
   "col_break5",
+  "against_blanket_order",
   "blanket_order",
   "blanket_order_rate",
   "item_group",
@@ -511,6 +513,7 @@
    "read_only": 1
   },
   {
+   "depends_on": "eval:doc.against_blanket_order",
    "fieldname": "blanket_order",
    "fieldtype": "Link",
    "label": "Blanket Order",
@@ -518,6 +521,7 @@
    "options": "Blanket Order"
   },
   {
+   "depends_on": "eval:doc.against_blanket_order",
    "fieldname": "blanket_order_rate",
    "fieldtype": "Currency",
    "label": "Blanket Order Rate",
@@ -703,6 +707,12 @@
   },
   {
    "default": "0",
+   "fieldname": "against_blanket_order",
+   "fieldtype": "Check",
+   "label": "Against Blanket Order"
+  },
+  {
+   "default": "0",
    "fetch_from": "item_code.is_fixed_asset",
    "fieldname": "is_fixed_asset",
    "fieldtype": "Check",
@@ -712,7 +722,8 @@
  ],
  "idx": 1,
  "istable": 1,
- "modified": "2019-11-07 17:19:12.090355",
+ "links": [],
+ "modified": "2019-12-06 13:17:12.142799",
  "modified_by": "Administrator",
  "module": "Buying",
  "name": "Purchase Order Item",
diff --git a/erpnext/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.json b/erpnext/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.json
index 2e0fc94..6f2fbe5 100644
--- a/erpnext/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.json
+++ b/erpnext/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.json
@@ -1,537 +1,168 @@
 {
- "allow_copy": 0, 
- "allow_events_in_timeline": 0, 
- "allow_guest_to_view": 0, 
- "allow_import": 0, 
- "allow_rename": 0, 
- "beta": 0, 
- "creation": "2013-02-22 01:27:42", 
- "custom": 0, 
- "docstatus": 0, 
- "doctype": "DocType", 
- "editable_grid": 1, 
- "engine": "InnoDB", 
+ "creation": "2013-02-22 01:27:42",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "main_item_code",
+  "rm_item_code",
+  "description",
+  "batch_no",
+  "serial_no",
+  "col_break1",
+  "required_qty",
+  "consumed_qty",
+  "stock_uom",
+  "rate",
+  "amount",
+  "conversion_factor",
+  "current_stock",
+  "reference_name",
+  "bom_detail_no"
+ ],
  "fields": [
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "main_item_code", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Item Code", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "main_item_code", 
-   "oldfieldtype": "Data", 
-   "options": "Item", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "main_item_code",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Item Code",
+   "oldfieldname": "main_item_code",
+   "oldfieldtype": "Data",
+   "options": "Item",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "rm_item_code", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Raw Material Item Code", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "rm_item_code", 
-   "oldfieldtype": "Data", 
-   "options": "Item", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "rm_item_code",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Raw Material Item Code",
+   "oldfieldname": "rm_item_code",
+   "oldfieldtype": "Data",
+   "options": "Item",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "description", 
-   "fieldtype": "Text Editor", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 1, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Description", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "description", 
-   "oldfieldtype": "Data", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "print_width": "300px", 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0, 
+   "fieldname": "description",
+   "fieldtype": "Text Editor",
+   "in_global_search": 1,
+   "in_list_view": 1,
+   "label": "Description",
+   "oldfieldname": "description",
+   "oldfieldtype": "Data",
+   "print_width": "300px",
+   "read_only": 1,
    "width": "300px"
-  }, 
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "batch_no", 
-   "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": "Batch No", 
-   "length": 0, 
-   "no_copy": 1, 
-   "options": "Batch", 
-   "permlevel": 0, 
-   "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
-  }, 
+   "fieldname": "batch_no",
+   "fieldtype": "Link",
+   "label": "Batch No",
+   "no_copy": 1,
+   "options": "Batch"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "serial_no", 
-   "fieldtype": "Text", 
-   "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": "Serial No", 
-   "length": 0, 
-   "no_copy": 1, 
-   "permlevel": 0, 
-   "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
-  }, 
+   "fieldname": "serial_no",
+   "fieldtype": "Text",
+   "label": "Serial No",
+   "no_copy": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "col_break1", 
-   "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, 
-   "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
-  }, 
+   "fieldname": "col_break1",
+   "fieldtype": "Column Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "required_qty", 
-   "fieldtype": "Float", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Required Qty", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "required_qty", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "required_qty",
+   "fieldtype": "Float",
+   "in_list_view": 1,
+   "label": "Required Qty",
+   "oldfieldname": "required_qty",
+   "oldfieldtype": "Currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "consumed_qty", 
-   "fieldtype": "Float", 
-   "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": "Consumed Qty", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "consumed_qty", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "consumed_qty",
+   "fieldtype": "Float",
+   "label": "Consumed Qty",
+   "oldfieldname": "consumed_qty",
+   "oldfieldtype": "Currency",
+   "read_only": 1,
+   "reqd": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "stock_uom", 
-   "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": "Stock Uom", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "stock_uom", 
-   "oldfieldtype": "Data", 
-   "options": "UOM", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "stock_uom",
+   "fieldtype": "Link",
+   "label": "Stock Uom",
+   "oldfieldname": "stock_uom",
+   "oldfieldtype": "Data",
+   "options": "UOM",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "rate", 
-   "fieldtype": "Currency", 
-   "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": "Rate", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "rate", 
-   "oldfieldtype": "Currency", 
-   "options": "Company:company:default_currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "rate",
+   "fieldtype": "Currency",
+   "label": "Rate",
+   "oldfieldname": "rate",
+   "oldfieldtype": "Currency",
+   "options": "Company:company:default_currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "amount", 
-   "fieldtype": "Currency", 
-   "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": "Amount", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "amount", 
-   "oldfieldtype": "Currency", 
-   "options": "Company:company:default_currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "amount",
+   "fieldtype": "Currency",
+   "label": "Amount",
+   "oldfieldname": "amount",
+   "oldfieldtype": "Currency",
+   "options": "Company:company:default_currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "conversion_factor", 
-   "fieldtype": "Float", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Conversion Factor", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "conversion_factor", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "conversion_factor",
+   "fieldtype": "Float",
+   "hidden": 1,
+   "label": "Conversion Factor",
+   "oldfieldname": "conversion_factor",
+   "oldfieldtype": "Currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "current_stock", 
-   "fieldtype": "Float", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Current Stock", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "current_stock", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "current_stock",
+   "fieldtype": "Float",
+   "in_list_view": 1,
+   "label": "Current Stock",
+   "oldfieldname": "current_stock",
+   "oldfieldtype": "Currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "reference_name", 
-   "fieldtype": "Data", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Reference Name", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "reference_name", 
-   "oldfieldtype": "Data", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "reference_name",
+   "fieldtype": "Data",
+   "hidden": 1,
+   "in_list_view": 1,
+   "label": "Reference Name",
+   "oldfieldname": "reference_name",
+   "oldfieldtype": "Data",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "bom_detail_no", 
-   "fieldtype": "Data", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "BOM Detail No", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "bom_detail_no", 
-   "oldfieldtype": "Data", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
+   "fieldname": "bom_detail_no",
+   "fieldtype": "Data",
+   "hidden": 1,
+   "in_list_view": 1,
+   "label": "BOM Detail No",
+   "oldfieldname": "bom_detail_no",
+   "oldfieldtype": "Data",
+   "read_only": 1
   }
- ], 
- "has_web_view": 0, 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "idx": 1, 
- "image_view": 0, 
- "in_create": 0, 
- "is_submittable": 0, 
- "issingle": 0, 
- "istable": 1, 
- "max_attachments": 0, 
- "modified": "2019-01-07 16:51:59.536291", 
- "modified_by": "Administrator", 
- "module": "Buying", 
- "name": "Purchase Receipt Item Supplied", 
- "owner": "wasim@webnotestech.com", 
- "permissions": [], 
- "quick_entry": 0, 
- "read_only": 0, 
- "read_only_onload": 0, 
- "show_name_in_global_search": 0, 
- "sort_field": "modified", 
- "sort_order": "DESC", 
- "track_changes": 1, 
- "track_seen": 0, 
- "track_views": 0
+ ],
+ "idx": 1,
+ "istable": 1,
+ "modified": "2019-11-21 16:25:29.909112",
+ "modified_by": "Administrator",
+ "module": "Buying",
+ "name": "Purchase Receipt Item Supplied",
+ "owner": "wasim@webnotestech.com",
+ "permissions": [],
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
 }
\ No newline at end of file
diff --git a/erpnext/buying/doctype/supplier/supplier.py b/erpnext/buying/doctype/supplier/supplier.py
index b6d588e..62a04f3 100644
--- a/erpnext/buying/doctype/supplier/supplier.py
+++ b/erpnext/buying/doctype/supplier/supplier.py
@@ -56,3 +56,23 @@
 	def after_rename(self, olddn, newdn, merge=False):
 		if frappe.defaults.get_global_default('supp_master_name') == 'Supplier Name':
 			frappe.db.set(self, "supplier_name", newdn)
+
+	def create_onboarding_docs(self, args):
+		defaults = frappe.defaults.get_defaults()
+		for i in range(1, args.get('max_count')):
+			supplier = args.get('supplier_name_' + str(i))
+			if supplier:
+				try:
+					doc = frappe.get_doc({
+						'doctype': self.doctype,
+						'supplier_name': supplier,
+						'supplier_group': _('Local'),
+						'company': defaults.get('company')
+					}).insert()
+
+					if args.get('supplier_email_' + str(i)):
+						from erpnext.selling.doctype.customer.customer import create_contact
+						create_contact(supplier, 'Supplier',
+							doc.name, args.get('supplier_email_' + str(i)))
+				except frappe.NameError:
+					pass
\ No newline at end of file
diff --git a/erpnext/buying/onboarding_slide/add_a_few_suppliers/add_a_few_suppliers.json b/erpnext/buying/onboarding_slide/add_a_few_suppliers/add_a_few_suppliers.json
new file mode 100644
index 0000000..d3adcb7
--- /dev/null
+++ b/erpnext/buying/onboarding_slide/add_a_few_suppliers/add_a_few_suppliers.json
@@ -0,0 +1,48 @@
+{
+ "add_more_button": 1,
+ "app": "ERPNext",
+ "creation": "2019-11-15 14:45:32.626641",
+ "docstatus": 0,
+ "doctype": "Onboarding Slide",
+ "domains": [],
+ "help_links": [
+  {
+   "label": "Learn More",
+   "video_id": "zsrrVDk6VBs"
+  }
+ ],
+ "idx": 0,
+ "image_src": "/assets/erpnext/images/illustrations/supplier-onboard.png",
+ "max_count": 3,
+ "modified": "2019-12-03 22:53:50.552445",
+ "modified_by": "Administrator",
+ "name": "Add A Few Suppliers",
+ "owner": "Administrator",
+ "ref_doctype": "Supplier",
+ "slide_desc": "",
+ "slide_fields": [
+  {
+   "align": "",
+   "fieldname": "supplier_name",
+   "fieldtype": "Data",
+   "label": "Supplier Name",
+   "placeholder": "",
+   "reqd": 1
+  },
+  {
+   "align": "",
+   "fieldtype": "Column Break",
+   "reqd": 0
+  },
+  {
+   "align": "",
+   "fieldname": "supplier_email",
+   "fieldtype": "Data",
+   "label": "Supplier Email",
+   "reqd": 1
+  }
+ ],
+ "slide_order": 50,
+ "slide_title": "Add A Few Suppliers",
+ "slide_type": "Create"
+}
\ No newline at end of file
diff --git a/erpnext/buying/utils.py b/erpnext/buying/utils.py
index 8c0a1e5..b5598f8 100644
--- a/erpnext/buying/utils.py
+++ b/erpnext/buying/utils.py
@@ -24,12 +24,12 @@
 		last_purchase_rate = None
 		if last_purchase_details and \
 				(last_purchase_details.purchase_date > this_purchase_date):
-			last_purchase_rate = last_purchase_details['base_rate']
+			last_purchase_rate = last_purchase_details['base_net_rate']
 		elif is_submit == 1:
 			# even if this transaction is the latest one, it should be submitted
 			# for it to be considered for latest purchase rate
 			if flt(d.conversion_factor):
-				last_purchase_rate = flt(d.base_rate) / flt(d.conversion_factor)
+				last_purchase_rate = flt(d.base_net_rate) / flt(d.conversion_factor)
 			# Check if item code is present
 			# Conversion factor should not be mandatory for non itemized items
 			elif d.item_code:
diff --git a/erpnext/change_log/v12/v12_2_0.md b/erpnext/change_log/v12/v12_2_0.md
new file mode 100644
index 0000000..0ec0eec
--- /dev/null
+++ b/erpnext/change_log/v12/v12_2_0.md
@@ -0,0 +1,14 @@
+# Version 12.2.0 Release Notes
+
+### Accounting
+
+1. Fixed Asset
+	- "Enable CWIP" options moved to Asset Category from Asset Settings
+	- Removed Asset link from Purchase Receipt Item table
+	- Enhanced Asset master
+	- Asset Movement now handles movement of multiple assets
+	- Introduced monthly depreciation
+2. GL Entries for Landed Cost Voucher now posted directly against individual Charges account
+3. Optimization of BOM Update Tool
+4. Syncing of Stock and Account balance is enforced, in case of perpetual inventory
+5. Rendered email template in Email Campaign
diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py
index ab75f21..08711fc 100644
--- a/erpnext/config/accounts.py
+++ b/erpnext/config/accounts.py
@@ -197,6 +197,11 @@
 					"name": "Bank Reconciliation Statement",
 					"is_query_report": True,
 					"doctype": "Journal Entry"
+				},{
+					"type": "page",
+					"name": "bank-reconciliation",
+					"label": _("Bank Reconciliation"),
+					"icon": "fa fa-bar-chart"
 				},
 				{
 					"type": "report",
diff --git a/erpnext/config/crm.py b/erpnext/config/crm.py
index eba6c7a..cf10219 100644
--- a/erpnext/config/crm.py
+++ b/erpnext/config/crm.py
@@ -46,6 +46,16 @@
 					"name": "Contract",
 					"description": _("Helps you keep tracks of Contracts based on Supplier, Customer and Employee"),
 				},
+				{
+					"type": "doctype",
+					"name": "Appointment",
+					"description" : _("Helps you manage appointments with your leads"),
+				},
+        {
+          "type": "doctype",
+					"name": "Newsletter",
+					"label": _("Newsletter"),
+				}
 			]
 		},
 		{
@@ -165,6 +175,11 @@
 					"type": "doctype",
 					"name": "SMS Settings",
 					"description": _("Setup SMS gateway settings")
+				},
+				{
+					"type": "doctype",
+					"label": _("Email Group"),
+					"name": "Email Group",
 				}
 			]
 		},
diff --git a/erpnext/config/stock.py b/erpnext/config/stock.py
index 441a3ab..e24d7b8 100644
--- a/erpnext/config/stock.py
+++ b/erpnext/config/stock.py
@@ -241,6 +241,10 @@
 					"type": "doctype",
 					"name": "Quality Inspection Template",
 				},
+				{
+					"type": "doctype",
+					"name": "Quick Stock Balance",
+				},
 			]
 		},
 		{
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 1f8b663..75564af 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -61,7 +61,6 @@
 						_('{0} is blocked so this transaction cannot proceed'.format(supplier_name)), raise_exception=1)
 
 	def validate(self):
-
 		if not self.get('is_return'):
 			self.validate_qty_is_not_zero()
 
@@ -100,11 +99,23 @@
 
 			if self.is_return:
 				self.validate_qty()
+			else:
+				self.validate_deferred_start_and_end_date()
 
 		validate_regional(self)
 		if self.doctype != 'Material Request':
 			apply_pricing_rule_on_transaction(self)
 
+	def validate_deferred_start_and_end_date(self):
+		for d in self.items:
+			if d.get("enable_deferred_revenue") or d.get("enable_deferred_expense"):
+				if not (d.service_start_date and d.service_end_date):
+					frappe.throw(_("Row #{0}: Service Start and End Date is required for deferred accounting").format(d.idx))
+				elif getdate(d.service_start_date) > getdate(d.service_end_date):
+					frappe.throw(_("Row #{0}: Service Start Date cannot be greater than Service End Date").format(d.idx))
+				elif getdate(self.posting_date) > getdate(d.service_end_date):
+					frappe.throw(_("Row #{0}: Service End Date cannot be before Invoice Posting Date").format(d.idx))
+
 	def validate_invoice_documents_schedule(self):
 		self.validate_payment_schedule_dates()
 		self.set_due_date()
@@ -415,9 +426,10 @@
 		return gl_dict
 
 	def validate_qty_is_not_zero(self):
-		for item in self.items:
-			if not item.qty:
-				frappe.throw(_("Item quantity can not be zero"))
+		if self.doctype != "Purchase Receipt":
+			for item in self.items:
+				if not item.qty:
+					frappe.throw(_("Item quantity can not be zero"))
 
 	def validate_account_currency(self, account, account_currency=None):
 		valid_currency = [self.company_currency]
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index d0befcb..3ec7aff 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -221,7 +221,7 @@
 				"backflush_raw_materials_of_subcontract_based_on")
 			if (self.doctype == 'Purchase Receipt' and
 				backflush_raw_materials_based_on != 'BOM'):
-				self.update_raw_materials_supplied_based_on_stock_entries(raw_material_table)
+				self.update_raw_materials_supplied_based_on_stock_entries()
 			else:
 				for item in self.get("items"):
 					if self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
@@ -241,41 +241,95 @@
 		if self.is_subcontracted == "No" and self.get("supplied_items"):
 			self.set('supplied_items', [])
 
-	def update_raw_materials_supplied_based_on_stock_entries(self, raw_material_table):
-		self.set(raw_material_table, [])
-		purchase_orders = [d.purchase_order for d in self.items]
-		if purchase_orders:
-			items = get_subcontracted_raw_materials_from_se(purchase_orders)
-			backflushed_raw_materials = get_backflushed_subcontracted_raw_materials_from_se(purchase_orders, self.name)
+	def update_raw_materials_supplied_based_on_stock_entries(self):
+		self.set('supplied_items', [])
 
-			for d in items:
-				qty = d.qty - backflushed_raw_materials.get(d.item_code, 0)
-				rm = self.append(raw_material_table, {})
-				rm.rm_item_code = d.item_code
-				rm.item_name = d.item_name
-				rm.main_item_code = d.main_item_code
-				rm.description = d.description
-				rm.stock_uom = d.stock_uom
-				rm.required_qty = qty
-				rm.consumed_qty = qty
-				rm.serial_no = d.serial_no
-				rm.batch_no = d.batch_no
+		purchase_orders = set([d.purchase_order for d in self.items])
 
-				# get raw materials rate
-				from erpnext.stock.utils import get_incoming_rate
-				rm.rate = get_incoming_rate({
-					"item_code": d.item_code,
-					"warehouse": self.supplier_warehouse,
-					"posting_date": self.posting_date,
-					"posting_time": self.posting_time,
-					"qty": -1 * qty,
-					"serial_no": rm.serial_no
-				})
-				if not rm.rate:
-					rm.rate = get_valuation_rate(d.item_code, self.supplier_warehouse,
-						self.doctype, self.name, currency=self.company_currency, company = self.company)
+		# qty of raw materials backflushed (for each item per purchase order)
+		backflushed_raw_materials_map = get_backflushed_subcontracted_raw_materials(purchase_orders)
 
-				rm.amount = qty * flt(rm.rate)
+		# qty of "finished good" item yet to be received
+		qty_to_be_received_map = get_qty_to_be_received(purchase_orders)
+
+		for item in self.get('items'):
+			# reset raw_material cost
+			item.rm_supp_cost = 0
+
+			# qty of raw materials transferred to the supplier
+			transferred_raw_materials = get_subcontracted_raw_materials_from_se(item.purchase_order, item.item_code)
+
+			non_stock_items = get_non_stock_items(item.purchase_order, item.item_code)
+
+			item_key = '{}{}'.format(item.item_code, item.purchase_order)
+
+			fg_yet_to_be_received = qty_to_be_received_map.get(item_key)
+
+			raw_material_data = backflushed_raw_materials_map.get(item_key, {})
+
+			consumed_qty = raw_material_data.get('qty', 0)
+			consumed_serial_nos = raw_material_data.get('serial_nos', '')
+			consumed_batch_nos = raw_material_data.get('batch_nos', '')
+
+			transferred_batch_qty_map = get_transferred_batch_qty_map(item.purchase_order, item.item_code)
+			backflushed_batch_qty_map = get_backflushed_batch_qty_map(item.purchase_order, item.item_code)
+
+			for raw_material in transferred_raw_materials + non_stock_items:
+				transferred_qty = raw_material.qty
+
+				rm_qty_to_be_consumed = transferred_qty - consumed_qty
+
+				# backflush all remaining transferred qty in the last Purchase Receipt
+				if fg_yet_to_be_received == item.qty:
+					qty = rm_qty_to_be_consumed
+				else:
+					qty = (rm_qty_to_be_consumed / fg_yet_to_be_received) * item.qty
+
+					if frappe.get_cached_value('UOM', raw_material.stock_uom, 'must_be_whole_number'):
+						qty = frappe.utils.ceil(qty)
+
+				if qty > rm_qty_to_be_consumed:
+					qty = rm_qty_to_be_consumed
+
+				if not qty: continue
+
+				if raw_material.serial_nos:
+					set_serial_nos(raw_material, consumed_serial_nos, qty)
+
+				if raw_material.batch_nos:
+					batches_qty = get_batches_with_qty(raw_material.rm_item_code, raw_material.main_item_code,
+						qty, transferred_batch_qty_map, backflushed_batch_qty_map)
+					for batch_data in batches_qty:
+						qty = batch_data['qty']
+						raw_material.batch_no = batch_data['batch']
+						self.append_raw_material_to_be_backflushed(item, raw_material, qty)
+				else:
+					self.append_raw_material_to_be_backflushed(item, raw_material, qty)
+
+	def append_raw_material_to_be_backflushed(self, fg_item_doc, raw_material_data, qty):
+		rm = self.append('supplied_items', {})
+		rm.update(raw_material_data)
+
+		rm.required_qty = qty
+		rm.consumed_qty = qty
+
+		if not raw_material_data.get('non_stock_item'):
+			from erpnext.stock.utils import get_incoming_rate
+			rm.rate = get_incoming_rate({
+				"item_code": raw_material_data.rm_item_code,
+				"warehouse": self.supplier_warehouse,
+				"posting_date": self.posting_date,
+				"posting_time": self.posting_time,
+				"qty": -1 * qty,
+				"serial_no": rm.serial_no
+			})
+
+			if not rm.rate:
+				rm.rate = get_valuation_rate(raw_material_data.item_code, self.supplier_warehouse,
+					self.doctype, self.name, currency=self.company_currency, company=self.company)
+
+		rm.amount = qty * flt(rm.rate)
+		fg_item_doc.rm_supp_cost += rm.amount
 
 	def update_raw_materials_supplied_based_on_bom(self, item, raw_material_table):
 		exploded_item = 1
@@ -387,9 +441,11 @@
 			item_codes = list(set(item.item_code for item in
 				self.get("items")))
 			if item_codes:
-				self._sub_contracted_items = [r[0] for r in frappe.db.sql("""select name
-					from `tabItem` where name in (%s) and is_sub_contracted_item=1""" % \
-					(", ".join((["%s"]*len(item_codes))),), item_codes)]
+				items = frappe.get_all('Item', filters={
+					'name': ['in', item_codes],
+					'is_sub_contracted_item': 1
+				})
+				self._sub_contracted_items = [item.name for item in items]
 
 		return self._sub_contracted_items
 
@@ -577,6 +633,7 @@
 
 	def auto_make_assets(self, asset_items):
 		items_data = get_asset_item_details(asset_items)
+		messages = []
 
 		for d in self.items:
 			if d.is_fixed_asset:
@@ -589,12 +646,16 @@
 						for qty in range(cint(d.qty)):
 							self.make_asset(d)
 						is_plural = 's' if cint(d.qty) != 1 else ''
-						frappe.msgprint(_('{0} Asset{2} Created for {1}').format(cint(d.qty), d.item_code, is_plural))
+						messages.append(_('{0} Asset{2} Created for <b>{1}</b>').format(cint(d.qty), d.item_code, is_plural))
 					else:
-						frappe.throw(_("Asset Naming Series is mandatory for the auto creation for item {0}").format(d.item_code))
+						frappe.throw(_("Row {1}: Asset Naming Series is mandatory for the auto creation for item {0}")
+							.format(d.item_code, d.idx))
 				else:
-					frappe.msgprint(_("Assets not created. You will have to create asset manually."))
-					
+					messages.append(_("Assets not created for <b>{0}</b>. You will have to create asset manually.")
+						.format(d.item_code))
+
+		for message in messages:
+			frappe.msgprint(message, title="Success")
 
 	def make_asset(self, row):
 		if not row.asset_location:
@@ -636,7 +697,10 @@
 					asset = frappe.get_doc('Asset', asset.name)
 					if delete_asset and is_auto_create_enabled:
 						# need to delete movements to delete assets otherwise throws link exists error
-						movements = frappe.db.get_all('Asset Movement', filters={ 'reference_name': self.name })
+						movements = frappe.db.sql(
+							"""SELECT asm.name 
+							FROM `tabAsset Movement` asm, `tabAsset Movement Item` asm_item
+							WHERE asm_item.parent=asm.name and asm_item.asset=%s""", asset.name, as_dict=1)
 						for movement in movements:
 							frappe.delete_doc('Asset Movement', movement.name, force=1)
 						frappe.delete_doc("Asset", asset.name, force=1)
@@ -647,8 +711,12 @@
 						asset.purchase_date = self.posting_date
 						asset.supplier = self.supplier
 					elif self.docstatus == 2:
-						asset.set(field, None)
-						asset.supplier = None
+						if asset.docstatus == 0:
+							asset.set(field, None)
+							asset.supplier = None
+						if asset.docstatus == 1 and delete_asset:
+							frappe.throw(_('Cannot cancel this document as it is linked with submitted asset {0}.\
+								Please cancel the it to continue.').format(asset.name))
 
 					asset.flags.ignore_validate_update_after_submit = True
 					asset.flags.ignore_mandatory = True
@@ -710,28 +778,72 @@
 
 	return bom_items
 
-def get_subcontracted_raw_materials_from_se(purchase_orders):
-	return frappe.db.sql("""
-		select
-			sed.item_name, sed.item_code, sum(sed.qty) as qty, sed.description,
-			sed.stock_uom, sed.subcontracted_item as main_item_code, sed.serial_no, sed.batch_no
-		from `tabStock Entry` se,`tabStock Entry Detail` sed
-		where
-			se.name = sed.parent and se.docstatus=1 and se.purpose='Send to Subcontractor'
-			and se.purchase_order in (%s) and ifnull(sed.t_warehouse, '') != ''
-		group by sed.item_code, sed.t_warehouse
-	""" % (','.join(['%s'] * len(purchase_orders))), tuple(purchase_orders), as_dict=1)
+def get_subcontracted_raw_materials_from_se(purchase_order, fg_item):
+	common_query = """
+		SELECT
+			sed.item_code AS rm_item_code,
+			SUM(sed.qty) AS qty,
+			sed.description,
+			sed.stock_uom,
+			sed.subcontracted_item AS main_item_code,
+			{serial_no_concat_syntax} AS serial_nos,
+			{batch_no_concat_syntax} AS batch_nos
+		FROM `tabStock Entry` se,`tabStock Entry Detail` sed
+		WHERE
+			se.name = sed.parent
+			AND se.docstatus=1
+			AND se.purpose='Send to Subcontractor'
+			AND se.purchase_order = %s
+			AND IFNULL(sed.t_warehouse, '') != ''
+			AND sed.subcontracted_item = %s
+		GROUP BY sed.item_code, sed.subcontracted_item
+	"""
+	raw_materials = frappe.db.multisql({
+		'mariadb': common_query.format(
+			serial_no_concat_syntax="GROUP_CONCAT(sed.serial_no)",
+			batch_no_concat_syntax="GROUP_CONCAT(sed.batch_no)"
+		),
+		'postgres': common_query.format(
+			serial_no_concat_syntax="STRING_AGG(sed.serial_no, ',')",
+			batch_no_concat_syntax="STRING_AGG(sed.batch_no, ',')"
+		)
+	}, (purchase_order, fg_item), as_dict=1)
 
-def get_backflushed_subcontracted_raw_materials_from_se(purchase_orders, purchase_receipt):
-	return frappe._dict(frappe.db.sql("""
-		select
-			prsi.rm_item_code as item_code, sum(prsi.consumed_qty) as qty
-		from `tabPurchase Receipt` pr, `tabPurchase Receipt Item` pri, `tabPurchase Receipt Item Supplied` prsi
-		where
-			pr.name = pri.parent and pr.name = prsi.parent and pri.purchase_order in (%s)
-			and pri.item_code = prsi.main_item_code and pr.name != '%s' and pr.docstatus = 1
-		group by prsi.rm_item_code
-	""" % (','.join(['%s'] * len(purchase_orders)), purchase_receipt), tuple(purchase_orders)))
+	return raw_materials
+
+def get_backflushed_subcontracted_raw_materials(purchase_orders):
+	common_query = """
+		SELECT
+			CONCAT(prsi.rm_item_code, pri.purchase_order) AS item_key,
+			SUM(prsi.consumed_qty) AS qty,
+			{serial_no_concat_syntax} AS serial_nos,
+			{batch_no_concat_syntax} AS batch_nos
+		FROM `tabPurchase Receipt` pr, `tabPurchase Receipt Item` pri, `tabPurchase Receipt Item Supplied` prsi
+		WHERE
+			pr.name = pri.parent
+			AND pr.name = prsi.parent
+			AND pri.purchase_order IN %s
+			AND pri.item_code = prsi.main_item_code
+			AND pr.docstatus = 1
+		GROUP BY prsi.rm_item_code, pri.purchase_order
+	"""
+
+	backflushed_raw_materials = frappe.db.multisql({
+		'mariadb': common_query.format(
+			serial_no_concat_syntax="GROUP_CONCAT(prsi.serial_no)",
+			batch_no_concat_syntax="GROUP_CONCAT(prsi.batch_no)"
+		),
+		'postgres': common_query.format(
+			serial_no_concat_syntax="STRING_AGG(prsi.serial_no, ',')",
+			batch_no_concat_syntax="STRING_AGG(prsi.batch_no, ',')"
+		)
+	}, (purchase_orders, ), as_dict=1)
+
+	backflushed_raw_materials_map = frappe._dict()
+	for item in backflushed_raw_materials:
+		backflushed_raw_materials_map.setdefault(item.item_key, item)
+
+	return backflushed_raw_materials_map
 
 def get_asset_item_details(asset_items):
 	asset_items_data = {}
@@ -764,3 +876,125 @@
 			error_message = _("Following item {0} is not marked as {1} item. You can enable them as {1} item from its Item master".format(items, message))
 
 		frappe.throw(error_message)
+
+def get_qty_to_be_received(purchase_orders):
+	return frappe._dict(frappe.db.sql("""
+		SELECT CONCAT(poi.`item_code`, poi.`parent`) AS item_key,
+		SUM(poi.`qty`) - SUM(poi.`received_qty`) AS qty_to_be_received
+		FROM `tabPurchase Order Item` poi
+		WHERE
+			poi.`parent` in %s
+		GROUP BY poi.`item_code`, poi.`parent`
+		HAVING SUM(poi.`qty`) > SUM(poi.`received_qty`)
+	""", (purchase_orders)))
+
+def get_non_stock_items(purchase_order, fg_item_code):
+	return frappe.db.sql("""
+		SELECT
+			pois.main_item_code,
+			pois.rm_item_code,
+			item.description,
+			pois.required_qty AS qty,
+			pois.rate,
+			1 as non_stock_item,
+			pois.stock_uom
+		FROM `tabPurchase Order Item Supplied` pois, `tabItem` item
+		WHERE
+			pois.`rm_item_code` = item.`name`
+			AND item.is_stock_item = 0
+			AND pois.`parent` = %s
+			AND pois.`main_item_code` = %s
+	""", (purchase_order, fg_item_code), as_dict=1)
+
+
+def set_serial_nos(raw_material, consumed_serial_nos, qty):
+	serial_nos = set(get_serial_nos(raw_material.serial_nos)) - \
+		set(get_serial_nos(consumed_serial_nos))
+	if serial_nos and qty <= len(serial_nos):
+		raw_material.serial_no = '\n'.join(list(serial_nos)[0:frappe.utils.cint(qty)])
+
+def get_transferred_batch_qty_map(purchase_order, fg_item):
+	# returns
+	# {
+	# 	(item_code, fg_code): {
+	# 		batch1: 10, # qty
+	# 		batch2: 16
+	# 	},
+	# }
+	transferred_batch_qty_map = {}
+	transferred_batches = frappe.db.sql("""
+		SELECT
+			sed.batch_no,
+			SUM(sed.qty) AS qty,
+			sed.item_code
+		FROM `tabStock Entry` se,`tabStock Entry Detail` sed
+		WHERE
+			se.name = sed.parent
+			AND se.docstatus=1
+			AND se.purpose='Send to Subcontractor'
+			AND se.purchase_order = %s
+			AND sed.subcontracted_item = %s
+			AND sed.batch_no IS NOT NULL
+		GROUP BY
+			sed.batch_no,
+			sed.item_code
+	""", (purchase_order, fg_item), as_dict=1)
+
+	for batch_data in transferred_batches:
+		transferred_batch_qty_map.setdefault((batch_data.item_code, fg_item), {})
+		transferred_batch_qty_map[(batch_data.item_code, fg_item)][batch_data.batch_no] = batch_data.qty
+
+	return transferred_batch_qty_map
+
+def get_backflushed_batch_qty_map(purchase_order, fg_item):
+	# returns
+	# {
+	# 	(item_code, fg_code): {
+	# 		batch1: 10, # qty
+	# 		batch2: 16
+	# 	},
+	# }
+	backflushed_batch_qty_map = {}
+	backflushed_batches = frappe.db.sql("""
+		SELECT
+			pris.batch_no,
+			SUM(pris.consumed_qty) AS qty,
+			pris.rm_item_code AS item_code
+		FROM `tabPurchase Receipt` pr, `tabPurchase Receipt Item` pri, `tabPurchase Receipt Item Supplied` pris
+		WHERE
+			pr.name = pri.parent
+			AND pri.parent = pris.parent
+			AND pri.purchase_order = %s
+			AND pri.item_code = pris.main_item_code
+			AND pr.docstatus = 1
+			AND pris.main_item_code = %s
+			AND pris.batch_no IS NOT NULL
+		GROUP BY
+			pris.rm_item_code, pris.batch_no
+	""", (purchase_order, fg_item), as_dict=1)
+
+	for batch_data in backflushed_batches:
+		backflushed_batch_qty_map.setdefault((batch_data.item_code, fg_item), {})
+		backflushed_batch_qty_map[(batch_data.item_code, fg_item)][batch_data.batch_no] = batch_data.qty
+
+	return backflushed_batch_qty_map
+
+def get_batches_with_qty(item_code, fg_item, required_qty, transferred_batch_qty_map, backflushed_batch_qty_map):
+	# Returns available batches to be backflushed based on requirements
+	transferred_batches = transferred_batch_qty_map.get((item_code, fg_item), {})
+	backflushed_batches = backflushed_batch_qty_map.get((item_code, fg_item), {})
+
+	available_batches = []
+
+	for (batch, transferred_qty) in transferred_batches.items():
+		backflushed_qty = backflushed_batches.get(batch, 0)
+		available_qty = transferred_qty - backflushed_qty
+
+		if available_qty >= required_qty:
+			available_batches.append({'batch': batch, 'qty': required_qty})
+			break
+		else:
+			available_batches.append({'batch': batch, 'qty': available_qty})
+			required_qty -= available_qty
+
+	return available_batches
\ No newline at end of file
diff --git a/erpnext/setup/doctype/setup_progress/__init__.py b/erpnext/crm/doctype/appointment/__init__.py
similarity index 100%
rename from erpnext/setup/doctype/setup_progress/__init__.py
rename to erpnext/crm/doctype/appointment/__init__.py
diff --git a/erpnext/crm/doctype/appointment/appointment.js b/erpnext/crm/doctype/appointment/appointment.js
new file mode 100644
index 0000000..8888b56
--- /dev/null
+++ b/erpnext/crm/doctype/appointment/appointment.js
@@ -0,0 +1,17 @@
+// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Appointment', {
+	refresh: function(frm) {
+		if(frm.doc.lead){
+			frm.add_custom_button(frm.doc.lead,()=>{
+				frappe.set_route("Form", "Lead", frm.doc.lead);
+			});
+		}
+		if(frm.doc.calendar_event){
+			frm.add_custom_button(__(frm.doc.calendar_event),()=>{
+				frappe.set_route("Form", "Event", frm.doc.calendar_event);
+			});
+		}
+	}
+});
diff --git a/erpnext/crm/doctype/appointment/appointment.json b/erpnext/crm/doctype/appointment/appointment.json
new file mode 100644
index 0000000..32df8ec
--- /dev/null
+++ b/erpnext/crm/doctype/appointment/appointment.json
@@ -0,0 +1,153 @@
+{
+ "autoname": "format:APMT-{customer_name}-{####}",
+ "creation": "2019-08-27 10:48:27.926283",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "scheduled_time",
+  "status",
+  "customer_details_section",
+  "customer_name",
+  "customer_phone_number",
+  "customer_skype",
+  "customer_email",
+  "col_br_2",
+  "customer_details",
+  "linked_docs_section",
+  "lead",
+  "col_br_3",
+  "calendar_event"
+ ],
+ "fields": [
+  {
+   "fieldname": "customer_details_section",
+   "fieldtype": "Section Break",
+   "label": "Customer Details"
+  },
+  {
+   "fieldname": "customer_name",
+   "fieldtype": "Data",
+   "in_list_view": 1,
+   "label": "Name",
+   "reqd": 1
+  },
+  {
+   "fieldname": "customer_phone_number",
+   "fieldtype": "Data",
+   "label": "Phone Number"
+  },
+  {
+   "fieldname": "customer_skype",
+   "fieldtype": "Data",
+   "label": "Skype ID"
+  },
+  {
+   "fieldname": "customer_details",
+   "fieldtype": "Long Text",
+   "label": "Details"
+  },
+  {
+   "fieldname": "scheduled_time",
+   "fieldtype": "Datetime",
+   "in_list_view": 1,
+   "label": "Scheduled Time",
+   "reqd": 1
+  },
+  {
+   "fieldname": "status",
+   "fieldtype": "Select",
+   "label": "Status",
+   "options": "Open\nUnverified\nClosed",
+   "reqd": 1
+  },
+  {
+   "fieldname": "lead",
+   "fieldtype": "Link",
+   "label": "Lead",
+   "options": "Lead"
+  },
+  {
+   "fieldname": "calendar_event",
+   "fieldtype": "Link",
+   "label": "Calendar Event",
+   "options": "Event"
+  },
+  {
+   "fieldname": "col_br_2",
+   "fieldtype": "Column Break"
+  },
+  {
+   "fieldname": "customer_email",
+   "fieldtype": "Data",
+   "label": "Email",
+   "reqd": 1
+  },
+  {
+   "fieldname": "linked_docs_section",
+   "fieldtype": "Section Break",
+   "label": "Linked Documents"
+  },
+  {
+   "fieldname": "col_br_3",
+   "fieldtype": "Column Break"
+  }
+ ],
+ "modified": "2019-10-14 15:23:54.630731",
+ "modified_by": "Administrator",
+ "module": "CRM",
+ "name": "Appointment",
+ "name_case": "UPPER CASE",
+ "owner": "Administrator",
+ "permissions": [
+  {
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "System Manager",
+   "share": 1,
+   "write": 1
+  },
+  {
+   "create": 1,
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Guest",
+   "share": 1
+  },
+  {
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Sales Manager",
+   "share": 1,
+   "write": 1
+  },
+  {
+   "create": 1,
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Sales User",
+   "share": 1,
+   "write": 1
+  }
+ ],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/appointment/appointment.py b/erpnext/crm/doctype/appointment/appointment.py
new file mode 100644
index 0000000..2affba2
--- /dev/null
+++ b/erpnext/crm/doctype/appointment/appointment.py
@@ -0,0 +1,223 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+
+import urllib
+from collections import Counter
+from datetime import timedelta
+
+import frappe
+from frappe import _
+from frappe.model.document import Document
+from frappe.utils import get_url
+from frappe.utils.verified_command import verify_request, get_signed_params
+
+
+class Appointment(Document):
+
+	def find_lead_by_email(self):
+		lead_list = frappe.get_list(
+			'Lead', filters={'email_id': self.customer_email}, ignore_permissions=True)
+		if lead_list:
+			return lead_list[0].name
+		return None
+
+	def before_insert(self):
+		number_of_appointments_in_same_slot = frappe.db.count(
+			'Appointment', filters={'scheduled_time': self.scheduled_time})
+		number_of_agents = frappe.db.get_single_value('Appointment Booking Settings', 'number_of_agents')
+		if not number_of_agents == 0:
+			if (number_of_appointments_in_same_slot >= number_of_agents):
+				frappe.throw('Time slot is not available')
+		# Link lead
+		if not self.lead:
+			self.lead = self.find_lead_by_email()
+
+	def after_insert(self):
+		if self.lead:
+			# Create Calendar event
+			self.auto_assign()
+			self.create_calendar_event()
+		else:
+			# Set status to unverified
+			self.status = 'Unverified'
+			# Send email to confirm
+			self.send_confirmation_email()
+
+	def send_confirmation_email(self):
+		verify_url = self._get_verify_url()
+		template = 'confirm_appointment'
+		args = {
+			"link":verify_url,
+			"site_url":frappe.utils.get_url(),
+			"full_name":self.customer_name,
+		}
+		frappe.sendmail(recipients=[self.customer_email],
+						template=template,
+						args=args,
+						subject=_('Appointment Confirmation'))
+		if frappe.session.user == "Guest":
+			frappe.msgprint(
+				'Please check your email to confirm the appointment')
+		else :
+			frappe.msgprint(
+				'Appointment was created. But no lead was found. Please check the email to confirm')
+
+	def on_change(self):
+		# Sync Calendar
+		if not self.calendar_event:
+			return
+		cal_event = frappe.get_doc('Event', self.calendar_event)
+		cal_event.starts_on = self.scheduled_time
+		cal_event.save(ignore_permissions=True)
+
+
+	def set_verified(self, email):
+		if not email == self.customer_email:
+			frappe.throw('Email verification failed.')
+		# Create new lead
+		self.create_lead_and_link()
+		# Remove unverified status
+		self.status = 'Open'
+		# Create calender event
+		self.auto_assign()
+		self.create_calendar_event()
+		self.save(ignore_permissions=True)
+		frappe.db.commit()
+
+	def create_lead_and_link(self):
+		# Return if already linked
+		if self.lead:
+			return
+		lead = frappe.get_doc({
+			'doctype': 'Lead',
+			'lead_name': self.customer_name,
+			'email_id': self.customer_email,
+			'notes': self.customer_details,
+			'phone': self.customer_phone_number,
+		})
+		lead.insert(ignore_permissions=True)
+		# Link lead
+		self.lead = lead.name
+
+	def auto_assign(self):
+		from frappe.desk.form.assign_to import add as add_assignemnt
+		existing_assignee = self.get_assignee_from_latest_opportunity()
+		if existing_assignee:
+			# If the latest opportunity is assigned to someone
+			# Assign the appointment to the same
+			add_assignemnt({
+				'doctype': self.doctype,
+				'name': self.name,
+				'assign_to': existing_assignee
+			})
+			return
+		if self._assign:
+			return
+		available_agents = _get_agents_sorted_by_asc_workload(
+			self.scheduled_time.date())
+		for agent in available_agents:
+			if(_check_agent_availability(agent, self.scheduled_time)):
+				agent = agent[0]
+				add_assignemnt({
+					'doctype': self.doctype,
+					'name': self.name,
+					'assign_to': agent
+				})
+			break
+
+	def get_assignee_from_latest_opportunity(self):
+		if not self.lead:
+			return None
+		if not frappe.db.exists('Lead', self.lead):
+			return None
+		opporutnities = frappe.get_list(
+			'Opportunity',
+			filters={
+				'party_name': self.lead,
+			},
+			ignore_permissions=True,
+			order_by='creation desc')
+		if not opporutnities:
+			return None
+		latest_opportunity = frappe.get_doc('Opportunity', opporutnities[0].name )
+		assignee = latest_opportunity._assign
+		if not assignee:
+			return None
+		assignee = frappe.parse_json(assignee)[0]
+		return assignee
+
+	def create_calendar_event(self):
+		if self.calendar_event:
+			return
+		appointment_event = frappe.get_doc({
+			'doctype': 'Event',
+			'subject': ' '.join(['Appointment with', self.customer_name]),
+			'starts_on': self.scheduled_time,
+			'status': 'Open',
+			'type': 'Public',
+			'send_reminder': frappe.db.get_single_value('Appointment Booking Settings', 'email_reminders'),
+			'event_participants': [dict(reference_doctype='Lead', reference_docname=self.lead)]
+		})
+		employee = _get_employee_from_user(self._assign)
+		if employee:
+			appointment_event.append('event_participants', dict(
+				reference_doctype='Employee',
+				reference_docname=employee.name))
+		appointment_event.insert(ignore_permissions=True)
+		self.calendar_event = appointment_event.name
+		self.save(ignore_permissions=True)
+	
+	def _get_verify_url(self):
+		verify_route = '/book-appointment/verify'
+		params = {
+			'email': self.customer_email,
+			'appointment': self.name
+		}
+		return get_url(verify_route + '?' + get_signed_params(params))
+
+
+def _get_agents_sorted_by_asc_workload(date):
+	appointments = frappe.db.get_list('Appointment', fields='*')
+	agent_list = _get_agent_list_as_strings()
+	if not appointments:
+		return agent_list
+	appointment_counter = Counter(agent_list)
+	for appointment in appointments:
+		assigned_to = frappe.parse_json(appointment._assign)
+		if not assigned_to:
+			continue
+		if (assigned_to[0] in agent_list) and appointment.scheduled_time.date() == date:
+			appointment_counter[assigned_to[0]] += 1
+	sorted_agent_list = appointment_counter.most_common()
+	sorted_agent_list.reverse()
+	return sorted_agent_list
+
+
+def _get_agent_list_as_strings():
+	agent_list_as_strings = []
+	agent_list = frappe.get_doc('Appointment Booking Settings').agent_list
+	for agent in agent_list:
+		agent_list_as_strings.append(agent.user)
+	return agent_list_as_strings
+
+
+def _check_agent_availability(agent_email, scheduled_time):
+	appointemnts_at_scheduled_time = frappe.get_list(
+		'Appointment', filters={'scheduled_time': scheduled_time})
+	for appointment in appointemnts_at_scheduled_time:
+		if appointment._assign == agent_email:
+			return False
+	return True
+
+
+def _get_employee_from_user(user):
+	employee_docname = frappe.db.exists(
+		{'doctype': 'Employee', 'user_id': user})
+	if employee_docname:
+		# frappe.db.exists returns a tuple of a tuple
+		return frappe.get_doc('Employee', employee_docname[0][0])
+	return None
+
diff --git a/erpnext/crm/doctype/appointment/test_appointment.py b/erpnext/crm/doctype/appointment/test_appointment.py
new file mode 100644
index 0000000..50c98c5
--- /dev/null
+++ b/erpnext/crm/doctype/appointment/test_appointment.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+import frappe
+import unittest
+import datetime
+
+
+def create_test_lead():
+    test_lead = frappe.db.exists({'doctype': 'Lead', 'lead_name': 'Test Lead'})
+    if test_lead:
+        return frappe.get_doc('Lead', test_lead[0][0])
+    test_lead = frappe.get_doc({
+        'doctype': 'Lead',
+        'lead_name': 'Test Lead',
+        'email_id': 'test@example.com'
+    })
+    test_lead.insert(ignore_permissions=True)
+    return test_lead
+
+
+def create_test_appointments():
+    test_appointment = frappe.db.exists(
+        {'doctype': 'Appointment', 'scheduled_time':datetime.datetime.now(),'email':'test@example.com'})
+    if test_appointment:
+        return frappe.get_doc('Appointment', test_appointment[0][0])
+    test_appointment = frappe.get_doc({
+        'doctype': 'Appointment',
+        'email': 'test@example.com',
+        'status': 'Open',
+        'customer_name': 'Test Lead',
+        'customer_phone_number': '666',
+        'customer_skype': 'test',
+        'customer_email': 'test@example.com',
+        'scheduled_time': datetime.datetime.now()
+    })
+    test_appointment.insert()
+    return test_appointment
+
+
+class TestAppointment(unittest.TestCase):
+    test_appointment = test_lead = None
+
+    def setUp(self):
+        self.test_lead = create_test_lead()
+        self.test_appointment = create_test_appointments()
+
+    def test_calendar_event_created(self):
+        cal_event = frappe.get_doc(
+            'Event', self.test_appointment.calendar_event)
+        self.assertEqual(cal_event.starts_on,
+                         self.test_appointment.scheduled_time)
+
+    def test_lead_linked(self):
+        lead = frappe.get_doc('Lead', self.test_lead.name)
+        self.assertIsNotNone(lead)
diff --git a/erpnext/setup/doctype/setup_progress/__init__.py b/erpnext/crm/doctype/appointment_booking_settings/__init__.py
similarity index 100%
copy from erpnext/setup/doctype/setup_progress/__init__.py
copy to erpnext/crm/doctype/appointment_booking_settings/__init__.py
diff --git a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.js b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.js
new file mode 100644
index 0000000..99b8214
--- /dev/null
+++ b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.js
@@ -0,0 +1,10 @@
+frappe.ui.form.on('Appointment Booking Settings', 'validate',check_times);
+function check_times(frm) {
+	$.each(frm.doc.availability_of_slots || [], function (i, d) {
+		let from_time = Date.parse('01/01/2019 ' + d.from_time);
+		let to_time = Date.parse('01/01/2019 ' + d.to_time);
+		if (from_time > to_time) {
+			frappe.throw(__(`In row ${i + 1} of Appointment Booking Slots : "To Time" must be later than "From Time"`));
+		}
+	});
+}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json
new file mode 100644
index 0000000..4b26e49
--- /dev/null
+++ b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json
@@ -0,0 +1,151 @@
+{
+ "creation": "2019-08-27 10:56:48.309824",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "enable_scheduling",
+  "agent_detail_section",
+  "availability_of_slots",
+  "number_of_agents",
+  "agent_list",
+  "holiday_list",
+  "appointment_details_section",
+  "appointment_duration",
+  "email_reminders",
+  "advance_booking_days",
+  "success_details",
+  "success_redirect_url"
+ ],
+ "fields": [
+  {
+   "fieldname": "availability_of_slots",
+   "fieldtype": "Table",
+   "label": "Availability Of Slots",
+   "options": "Appointment Booking Slots",
+   "reqd": 1
+  },
+  {
+   "default": "1",
+   "fieldname": "number_of_agents",
+   "fieldtype": "Int",
+   "hidden": 1,
+   "in_list_view": 1,
+   "label": "Number of Concurrent Appointments",
+   "read_only": 1,
+   "reqd": 1
+  },
+  {
+   "fieldname": "holiday_list",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Holiday List",
+   "options": "Holiday List",
+   "reqd": 1
+  },
+  {
+   "default": "60",
+   "fieldname": "appointment_duration",
+   "fieldtype": "Int",
+   "label": "Appointment Duration (In Minutes)",
+   "reqd": 1
+  },
+  {
+   "default": "0",
+   "description": "Notify customer and agent via email on the day of the appointment.",
+   "fieldname": "email_reminders",
+   "fieldtype": "Check",
+   "label": "Notify Via Email"
+  },
+  {
+   "default": "7",
+   "fieldname": "advance_booking_days",
+   "fieldtype": "Int",
+   "label": "Number of days appointments can be booked in advance",
+   "reqd": 1
+  },
+  {
+   "fieldname": "agent_list",
+   "fieldtype": "Table MultiSelect",
+   "label": "Agents",
+   "options": "Assignment Rule User",
+   "reqd": 1
+  },
+  {
+   "default": "0",
+   "fieldname": "enable_scheduling",
+   "fieldtype": "Check",
+   "label": "Enable Appointment Scheduling",
+   "reqd": 1
+  },
+  {
+   "fieldname": "agent_detail_section",
+   "fieldtype": "Section Break",
+   "label": "Agent Details"
+  },
+  {
+   "fieldname": "appointment_details_section",
+   "fieldtype": "Section Break",
+   "label": "Appointment Details"
+  },
+  {
+   "fieldname": "success_details",
+   "fieldtype": "Section Break",
+   "label": "Success Settings"
+  },
+  {
+   "description": "Leave blank for home.\nThis is relative to site URL, for example \"about\" will redirect to \"https://yoursitename.com/about\"",
+   "fieldname": "success_redirect_url",
+   "fieldtype": "Data",
+   "label": "Success Redirect URL"
+  }
+ ],
+ "issingle": 1,
+ "modified": "2019-11-26 12:14:17.669366",
+ "modified_by": "Administrator",
+ "module": "CRM",
+ "name": "Appointment Booking Settings",
+ "owner": "Administrator",
+ "permissions": [
+  {
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "print": 1,
+   "read": 1,
+   "role": "System Manager",
+   "share": 1,
+   "write": 1
+  },
+  {
+   "email": 1,
+   "print": 1,
+   "read": 1,
+   "role": "Guest",
+   "share": 1
+  },
+  {
+   "create": 1,
+   "email": 1,
+   "print": 1,
+   "read": 1,
+   "role": "HR Manager",
+   "share": 1,
+   "write": 1
+  },
+  {
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "print": 1,
+   "read": 1,
+   "role": "Sales Manager",
+   "share": 1,
+   "write": 1
+  }
+ ],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py
new file mode 100644
index 0000000..27f14b1
--- /dev/null
+++ b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe import _
+import datetime
+from frappe.model.document import Document
+
+
+class AppointmentBookingSettings(Document):
+	agent_list = [] #Hack
+	min_date = '01/01/1970 '
+	format_string = "%d/%m/%Y %H:%M:%S"
+
+	def validate(self):
+		self.validate_availability_of_slots()
+
+	def save(self):
+		self.number_of_agents = len(self.agent_list)
+		super(AppointmentBookingSettings, self).save()
+
+	def validate_availability_of_slots(self):
+		for record in self.availability_of_slots:
+			from_time = datetime.datetime.strptime(
+				self.min_date+record.from_time, self.format_string)
+			to_time = datetime.datetime.strptime(
+				self.min_date+record.to_time, self.format_string)
+			timedelta = to_time-from_time
+			self.validate_from_and_to_time(from_time, to_time)
+			self.duration_is_divisible(from_time, to_time)
+
+	def validate_from_and_to_time(self, from_time, to_time):
+		if from_time > to_time:
+			err_msg = _('<b>From Time</b> cannot be later than <b>To Time</b> for {0}').format(record.day_of_week)
+			frappe.throw(_(err_msg))
+
+	def duration_is_divisible(self, from_time, to_time):
+		timedelta = to_time - from_time
+		if timedelta.total_seconds() % (self.appointment_duration * 60):
+			frappe.throw(
+				_('The difference between from time and To Time must be a multiple of Appointment'))
diff --git a/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py b/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py
new file mode 100644
index 0000000..3dc3c39
--- /dev/null
+++ b/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+# import frappe
+import unittest
+
+class TestAppointmentBookingSettings(unittest.TestCase):
+	pass
diff --git a/erpnext/setup/doctype/setup_progress/__init__.py b/erpnext/crm/doctype/appointment_booking_slots/__init__.py
similarity index 100%
copy from erpnext/setup/doctype/setup_progress/__init__.py
copy to erpnext/crm/doctype/appointment_booking_slots/__init__.py
diff --git a/erpnext/crm/doctype/appointment_booking_slots/appointment_booking_slots.json b/erpnext/crm/doctype/appointment_booking_slots/appointment_booking_slots.json
new file mode 100644
index 0000000..ddf8738
--- /dev/null
+++ b/erpnext/crm/doctype/appointment_booking_slots/appointment_booking_slots.json
@@ -0,0 +1,46 @@
+{
+ "creation": "2019-11-19 10:49:49.494927",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "day_of_week",
+  "from_time",
+  "to_time"
+ ],
+ "fields": [
+  {
+   "fieldname": "day_of_week",
+   "fieldtype": "Select",
+   "in_list_view": 1,
+   "label": "Day Of Week",
+   "options": "Sunday\nMonday\nTuesday\nWednesday\nThursday\nFriday\nSaturday",
+   "reqd": 1
+  },
+  {
+   "fieldname": "from_time",
+   "fieldtype": "Time",
+   "in_list_view": 1,
+   "label": "From Time ",
+   "reqd": 1
+  },
+  {
+   "fieldname": "to_time",
+   "fieldtype": "Time",
+   "in_list_view": 1,
+   "label": "To Time",
+   "reqd": 1
+  }
+ ],
+ "istable": 1,
+ "modified": "2019-11-19 10:49:49.494927",
+ "modified_by": "Administrator",
+ "module": "CRM",
+ "name": "Appointment Booking Slots",
+ "owner": "Administrator",
+ "permissions": [],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/appointment_booking_slots/appointment_booking_slots.py b/erpnext/crm/doctype/appointment_booking_slots/appointment_booking_slots.py
new file mode 100644
index 0000000..3cadbc9
--- /dev/null
+++ b/erpnext/crm/doctype/appointment_booking_slots/appointment_booking_slots.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+# import frappe
+from frappe.model.document import Document
+
+class AppointmentBookingSlots(Document):
+	pass
diff --git a/erpnext/setup/doctype/setup_progress/__init__.py b/erpnext/crm/doctype/availability_of_slots/__init__.py
similarity index 100%
copy from erpnext/setup/doctype/setup_progress/__init__.py
copy to erpnext/crm/doctype/availability_of_slots/__init__.py
diff --git a/erpnext/crm/doctype/availability_of_slots/availability_of_slots.json b/erpnext/crm/doctype/availability_of_slots/availability_of_slots.json
new file mode 100644
index 0000000..b54af8d
--- /dev/null
+++ b/erpnext/crm/doctype/availability_of_slots/availability_of_slots.json
@@ -0,0 +1,46 @@
+{
+ "creation": "2019-09-10 15:02:05.779434",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "day_of_week",
+  "from_time",
+  "to_time"
+ ],
+ "fields": [
+  {
+   "fieldname": "day_of_week",
+   "fieldtype": "Select",
+   "in_list_view": 1,
+   "label": "Day Of Week",
+   "options": "Sunday\nMonday\nTuesday\nWednesday\nThursday\nFriday\nSaturday",
+   "reqd": 1
+  },
+  {
+   "fieldname": "from_time",
+   "fieldtype": "Time",
+   "in_list_view": 1,
+   "label": "From Time",
+   "reqd": 1
+  },
+  {
+   "fieldname": "to_time",
+   "fieldtype": "Time",
+   "in_list_view": 1,
+   "label": "To Time",
+   "reqd": 1
+  }
+ ],
+ "istable": 1,
+ "modified": "2019-09-10 15:05:20.406855",
+ "modified_by": "Administrator",
+ "module": "CRM",
+ "name": "Availability Of Slots",
+ "owner": "Administrator",
+ "permissions": [],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/availability_of_slots/availability_of_slots.py b/erpnext/crm/doctype/availability_of_slots/availability_of_slots.py
new file mode 100644
index 0000000..8258471
--- /dev/null
+++ b/erpnext/crm/doctype/availability_of_slots/availability_of_slots.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+# import frappe
+from frappe.model.document import Document
+
+class AvailabilityOfSlots(Document):
+	pass
diff --git a/erpnext/crm/doctype/email_campaign/email_campaign.py b/erpnext/crm/doctype/email_campaign/email_campaign.py
index 3050d05..00a4bd1 100644
--- a/erpnext/crm/doctype/email_campaign/email_campaign.py
+++ b/erpnext/crm/doctype/email_campaign/email_campaign.py
@@ -41,7 +41,8 @@
 		email_campaign_exists = frappe.db.exists("Email Campaign", {
 			"campaign_name": self.campaign_name,
 			"recipient": self.recipient,
-			"status": ("in", ["In Progress", "Scheduled"])
+			"status": ("in", ["In Progress", "Scheduled"]),
+			"name": ("!=", self.name)
 		})
 		if email_campaign_exists:
 			frappe.throw(_("The Campaign '{0}' already exists for the {1} '{2}'").format(self.campaign_name, self.email_campaign_for, self.recipient))
@@ -78,7 +79,7 @@
 	comm = make(
 		doctype = "Email Campaign",
 		name = email_campaign.name,
-		subject = email_template.get("subject"),
+		subject = frappe.render_template(email_template.get("subject"), context),
 		content = frappe.render_template(email_template.get("response"), context),
 		sender = sender,
 		recipients = recipient,
diff --git a/erpnext/crm/doctype/lead/lead.json b/erpnext/crm/doctype/lead/lead.json
index 3c22dc7..eb68c67 100644
--- a/erpnext/crm/doctype/lead/lead.json
+++ b/erpnext/crm/doctype/lead/lead.json
@@ -1,1436 +1,372 @@
 {
- "allow_copy": 0,
  "allow_events_in_timeline": 1,
- "allow_guest_to_view": 0,
  "allow_import": 1,
- "allow_rename": 0,
  "autoname": "naming_series:",
- "beta": 0,
  "creation": "2013-04-10 11:45:37",
- "custom": 0,
- "docstatus": 0,
  "doctype": "DocType",
  "document_type": "Document",
- "editable_grid": 0,
+ "engine": "InnoDB",
+ "field_order": [
+  "organization_lead",
+  "lead_details",
+  "naming_series",
+  "lead_name",
+  "company_name",
+  "email_id",
+  "col_break123",
+  "lead_owner",
+  "status",
+  "gender",
+  "source",
+  "customer",
+  "campaign_name",
+  "image",
+  "section_break_12",
+  "contact_by",
+  "column_break_14",
+  "contact_date",
+  "ends_on",
+  "notes_section",
+  "notes",
+  "contact_info",
+  "address_desc",
+  "address_html",
+  "column_break2",
+  "contact_html",
+  "phone",
+  "salutation",
+  "mobile_no",
+  "fax",
+  "website",
+  "territory",
+  "more_info",
+  "type",
+  "market_segment",
+  "industry",
+  "request_type",
+  "column_break3",
+  "company",
+  "unsubscribed",
+  "blog_subscriber"
+ ],
  "fields": [
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "depends_on": "",
-   "fetch_if_empty": 0,
+   "default": "0",
    "fieldname": "organization_lead",
    "fieldtype": "Check",
-   "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": "Lead is an Organization",
-   "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": 1,
-   "translatable": 0,
-   "unique": 0
+   "set_only_once": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "lead_details",
    "fieldtype": "Section 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,
-   "label": "",
-   "length": 0,
-   "no_copy": 0,
-   "options": "fa fa-user",
-   "permlevel": 0,
-   "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
+   "options": "fa fa-user"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "default": "",
-   "fetch_if_empty": 0,
    "fieldname": "naming_series",
    "fieldtype": "Select",
-   "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": "Series",
-   "length": 0,
    "no_copy": 1,
    "oldfieldname": "naming_series",
    "oldfieldtype": "Select",
    "options": "CRM-LEAD-.YYYY.-",
-   "permlevel": 0,
-   "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": 1,
-   "translatable": 0,
-   "unique": 0
+   "set_only_once": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "depends_on": "eval:!doc.organization_lead",
-   "fetch_if_empty": 0,
    "fieldname": "lead_name",
    "fieldtype": "Data",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
    "in_global_search": 1,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "Person Name",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "lead_name",
    "oldfieldtype": "Data",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 0,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 1,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "search_index": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "company_name",
    "fieldtype": "Data",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
    "in_list_view": 1,
-   "in_standard_filter": 0,
    "label": "Organization Name",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "company_name",
-   "oldfieldtype": "Data",
-   "permlevel": 0,
-   "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
+   "oldfieldtype": "Data"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "email_id",
    "fieldtype": "Data",
-   "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": "Email Address",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "email_id",
    "oldfieldtype": "Data",
    "options": "Email",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 0,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 1,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "search_index": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "col_break123",
    "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,
-   "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,
    "width": "50%"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "default": "__user",
-   "fetch_if_empty": 0,
    "fieldname": "lead_owner",
    "fieldtype": "Link",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
    "in_list_view": 1,
-   "in_standard_filter": 0,
    "label": "Lead Owner",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "lead_owner",
    "oldfieldtype": "Link",
    "options": "User",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 0,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 1,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "search_index": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "default": "Lead",
-   "fetch_if_empty": 0,
    "fieldname": "status",
    "fieldtype": "Select",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
    "in_list_view": 1,
    "in_standard_filter": 1,
    "label": "Status",
-   "length": 0,
    "no_copy": 1,
    "oldfieldname": "status",
    "oldfieldtype": "Select",
    "options": "Lead\nOpen\nReplied\nOpportunity\nQuotation\nLost Quotation\nInterested\nConverted\nDo Not Contact",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 0,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
    "reqd": 1,
-   "search_index": 1,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "search_index": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "depends_on": "eval:!doc.organization_lead",
-   "fetch_if_empty": 0,
    "fieldname": "gender",
    "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": "Gender",
-   "length": 0,
-   "no_copy": 0,
-   "options": "Gender",
-   "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
+   "options": "Gender"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "depends_on": "",
-   "fetch_if_empty": 0,
    "fieldname": "source",
    "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": "Source",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "source",
    "oldfieldtype": "Select",
-   "options": "Lead Source",
-   "permlevel": 0,
-   "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
+   "options": "Lead Source"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "depends_on": "eval:doc.source == 'Existing Customer'",
-   "fetch_if_empty": 0,
    "fieldname": "customer",
    "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": "From Customer",
-   "length": 0,
    "no_copy": 1,
    "oldfieldname": "customer",
    "oldfieldtype": "Link",
-   "options": "Customer",
-   "permlevel": 0,
-   "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
+   "options": "Customer"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "depends_on": "eval: doc.source==\"Campaign\"",
-   "description": "",
-   "fetch_if_empty": 0,
    "fieldname": "campaign_name",
    "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": "Campaign Name",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "campaign_name",
    "oldfieldtype": "Link",
-   "options": "Campaign",
-   "permlevel": 0,
-   "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
+   "options": "Campaign"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "image",
    "fieldtype": "Attach Image",
    "hidden": 1,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "Image",
-   "length": 0,
-   "no_copy": 0,
-   "permlevel": 0,
-   "precision": "",
-   "print_hide": 1,
-   "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
+   "print_hide": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "section_break_12",
    "fieldtype": "Section 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,
-   "label": "Follow Up",
-   "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
+   "label": "Follow Up"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "contact_by",
    "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": "Next Contact By",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "contact_by",
    "oldfieldtype": "Link",
    "options": "User",
-   "permlevel": 0,
-   "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,
    "width": "100px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "column_break_14",
-   "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
+   "fieldtype": "Column Break"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
    "bold": 1,
-   "collapsible": 0,
-   "columns": 0,
-   "description": "",
-   "fetch_if_empty": 0,
    "fieldname": "contact_date",
    "fieldtype": "Datetime",
-   "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": "Next Contact Date",
-   "length": 0,
    "no_copy": 1,
    "oldfieldname": "contact_date",
    "oldfieldtype": "Date",
-   "permlevel": 0,
-   "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,
    "width": "100px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
    "bold": 1,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "ends_on",
    "fieldtype": "Datetime",
-   "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": "Ends On",
-   "length": 0,
-   "no_copy": 1,
-   "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
+   "no_copy": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
    "collapsible": 1,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "notes_section",
    "fieldtype": "Section 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,
-   "label": "Notes",
-   "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
+   "label": "Notes"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "notes",
    "fieldtype": "Text Editor",
-   "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": "Notes",
-   "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
+   "label": "Notes"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
    "collapsible": 1,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "contact_info",
    "fieldtype": "Section 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,
    "label": "Address & Contact",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldtype": "Column Break",
-   "options": "fa fa-map-marker",
-   "permlevel": 0,
-   "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
+   "options": "fa fa-map-marker"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "depends_on": "eval:doc.__islocal",
-   "fetch_if_empty": 0,
    "fieldname": "address_desc",
    "fieldtype": "HTML",
-   "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": "Address Desc",
-   "length": 0,
-   "no_copy": 0,
-   "permlevel": 0,
-   "print_hide": 1,
-   "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
+   "print_hide": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "address_html",
    "fieldtype": "HTML",
-   "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": "Address HTML",
-   "length": 0,
-   "no_copy": 0,
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "column_break2",
-   "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,
-   "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
+   "fieldtype": "Column Break"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "depends_on": "eval:doc.organization_lead",
-   "fetch_if_empty": 0,
    "fieldname": "contact_html",
    "fieldtype": "HTML",
-   "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": "Contact HTML",
-   "length": 0,
-   "no_copy": 0,
-   "permlevel": 0,
-   "precision": "",
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "depends_on": "eval:!doc.organization_lead",
-   "fetch_if_empty": 0,
    "fieldname": "phone",
    "fieldtype": "Data",
-   "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": "Phone",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "contact_no",
-   "oldfieldtype": "Data",
-   "permlevel": 0,
-   "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
+   "oldfieldtype": "Data"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "depends_on": "eval:!doc.organization_lead",
-   "fetch_if_empty": 0,
    "fieldname": "salutation",
    "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": "Salutation",
-   "length": 0,
-   "no_copy": 0,
-   "options": "Salutation",
-   "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
+   "options": "Salutation"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "depends_on": "eval:!doc.organization_lead",
-   "fetch_if_empty": 0,
    "fieldname": "mobile_no",
    "fieldtype": "Data",
-   "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": "Mobile No.",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "mobile_no",
-   "oldfieldtype": "Data",
-   "permlevel": 0,
-   "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
+   "oldfieldtype": "Data"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "depends_on": "eval:!doc.organization_lead",
-   "fetch_if_empty": 0,
    "fieldname": "fax",
    "fieldtype": "Data",
-   "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": "Fax",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "fax",
-   "oldfieldtype": "Data",
-   "permlevel": 0,
-   "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
+   "oldfieldtype": "Data"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "website",
    "fieldtype": "Data",
-   "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": "Website",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "website",
-   "oldfieldtype": "Data",
-   "permlevel": 0,
-   "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
+   "oldfieldtype": "Data"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "description": "",
-   "fetch_if_empty": 0,
    "fieldname": "territory",
    "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": "Territory",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "territory",
    "oldfieldtype": "Link",
    "options": "Territory",
-   "permlevel": 0,
-   "print_hide": 1,
-   "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
+   "print_hide": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
    "collapsible": 1,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "more_info",
    "fieldtype": "Section 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,
    "label": "More Information",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldtype": "Section Break",
-   "options": "fa fa-file-text",
-   "permlevel": 0,
-   "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
+   "options": "fa fa-file-text"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "type",
    "fieldtype": "Select",
-   "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": "Lead Type",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "type",
    "oldfieldtype": "Select",
-   "options": "\nClient\nChannel Partner\nConsultant",
-   "permlevel": 0,
-   "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
+   "options": "\nClient\nChannel Partner\nConsultant"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "market_segment",
    "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": "Market Segment",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "market_segment",
    "oldfieldtype": "Select",
-   "options": "Market Segment",
-   "permlevel": 0,
-   "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
+   "options": "Market Segment"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "industry",
    "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": "Industry",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "industry",
    "oldfieldtype": "Link",
-   "options": "Industry Type",
-   "permlevel": 0,
-   "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
+   "options": "Industry Type"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "request_type",
    "fieldtype": "Select",
-   "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": "Request Type",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "request_type",
    "oldfieldtype": "Select",
-   "options": "\nProduct Enquiry\nRequest for Information\nSuggestions\nOther",
-   "permlevel": 0,
-   "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
+   "options": "\nProduct Enquiry\nRequest for Information\nSuggestions\nOther"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
    "fieldname": "column_break3",
    "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,
    "oldfieldtype": "Column Break",
-   "permlevel": 0,
-   "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,
    "width": "50%"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 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,
    "oldfieldname": "company",
    "oldfieldtype": "Link",
    "options": "Company",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 0,
-   "remember_last_selected_value": 1,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "remember_last_selected_value": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
+   "default": "0",
    "fieldname": "unsubscribed",
    "fieldtype": "Check",
-   "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": "Unsubscribed",
-   "length": 0,
-   "no_copy": 0,
-   "permlevel": 0,
-   "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
+   "label": "Unsubscribed"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "fetch_if_empty": 0,
+   "default": "0",
    "fieldname": "blog_subscriber",
    "fieldtype": "Check",
-   "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": "Blog Subscriber",
-   "length": 0,
-   "no_copy": 0,
-   "permlevel": 0,
-   "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
+   "label": "Blog Subscriber"
   }
  ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
  "icon": "fa fa-user",
  "idx": 5,
  "image_field": "image",
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2019-06-18 03:22:57.283628",
+ "modified": "2019-09-19 12:49:02.536647",
  "modified_by": "Administrator",
  "module": "CRM",
  "name": "Lead",
@@ -1438,128 +374,69 @@
  "owner": "Administrator",
  "permissions": [
   {
-   "amend": 0,
-   "cancel": 0,
-   "create": 0,
-   "delete": 0,
-   "email": 0,
-   "export": 0,
-   "if_owner": 0,
-   "import": 0,
    "permlevel": 1,
-   "print": 0,
    "read": 1,
    "report": 1,
-   "role": "All",
-   "set_user_permissions": 0,
-   "share": 0,
-   "submit": 0,
-   "write": 0
+   "role": "All"
   },
   {
-   "amend": 0,
-   "cancel": 0,
    "create": 1,
-   "delete": 0,
    "email": 1,
-   "export": 0,
-   "if_owner": 0,
-   "import": 0,
-   "permlevel": 0,
    "print": 1,
    "read": 1,
    "report": 1,
    "role": "Sales User",
-   "set_user_permissions": 0,
    "share": 1,
-   "submit": 0,
    "write": 1
   },
   {
-   "amend": 0,
-   "cancel": 0,
    "create": 1,
    "delete": 1,
    "email": 1,
    "export": 1,
-   "if_owner": 0,
    "import": 1,
-   "permlevel": 0,
    "print": 1,
    "read": 1,
    "report": 1,
    "role": "Sales Manager",
-   "set_user_permissions": 0,
    "share": 1,
-   "submit": 0,
    "write": 1
   },
   {
-   "amend": 0,
-   "cancel": 0,
    "create": 1,
-   "delete": 0,
    "email": 1,
-   "export": 0,
-   "if_owner": 0,
-   "import": 0,
-   "permlevel": 0,
    "print": 1,
    "read": 1,
    "report": 1,
    "role": "System Manager",
-   "set_user_permissions": 0,
    "share": 1,
-   "submit": 0,
    "write": 1
   },
   {
-   "amend": 0,
-   "cancel": 0,
-   "create": 0,
-   "delete": 0,
-   "email": 0,
-   "export": 0,
-   "if_owner": 0,
-   "import": 0,
    "permlevel": 1,
-   "print": 0,
    "read": 1,
    "report": 1,
-   "role": "Sales Manager",
-   "set_user_permissions": 0,
-   "share": 0,
-   "submit": 0,
-   "write": 0
+   "role": "Sales Manager"
   },
   {
-   "amend": 0,
-   "cancel": 0,
-   "create": 0,
-   "delete": 0,
-   "email": 0,
-   "export": 0,
-   "if_owner": 0,
-   "import": 0,
    "permlevel": 1,
-   "print": 0,
    "read": 1,
    "report": 1,
-   "role": "Sales User",
-   "set_user_permissions": 0,
-   "share": 0,
-   "submit": 0,
-   "write": 0
+   "role": "Sales User"
+  },
+  {
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Guest",
+   "share": 1
   }
  ],
- "quick_entry": 0,
- "read_only": 0,
  "search_fields": "lead_name,lead_owner,status",
  "show_name_in_global_search": 1,
  "sort_field": "modified",
  "sort_order": "DESC",
- "title_field": "lead_name",
- "track_changes": 0,
- "track_seen": 0,
- "track_views": 0
+ "title_field": "lead_name"
 }
\ No newline at end of file
diff --git a/erpnext/crm/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py
index 99486fa..2880c80 100644
--- a/erpnext/crm/doctype/opportunity/opportunity.py
+++ b/erpnext/crm/doctype/opportunity/opportunity.py
@@ -130,10 +130,10 @@
 
 	def has_lost_quotation(self):
 		lost_quotation = frappe.db.sql("""
-			select q.name
-			from `tabQuotation` q, `tabQuotation Item` qi
-			where q.name = qi.parent and q.docstatus=1
-				and qi.prevdoc_docname =%s and q.status = 'Lost'
+			select name
+			from `tabQuotation`
+			where docstatus=1
+				and opportunity =%s and status = 'Lost'
 			""", self.name)
 		if lost_quotation:
 			if self.has_active_quotation():
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment.py b/erpnext/education/doctype/program_enrollment/program_enrollment.py
index d5348ff..7536172 100644
--- a/erpnext/education/doctype/program_enrollment/program_enrollment.py
+++ b/erpnext/education/doctype/program_enrollment/program_enrollment.py
@@ -71,7 +71,7 @@
 	def create_course_enrollments(self):
 		student = frappe.get_doc("Student", self.student)
 		program = frappe.get_doc("Program", self.program)
-		course_list = [course.course for course in program.get_all_children()]
+		course_list = [course.course for course in program.courses]
 		for course_name in course_list:
 			student.enroll_in_course(course_name=course_name, program_enrollment=self.name)
 
diff --git a/erpnext/education/doctype/student/student.py b/erpnext/education/doctype/student/student.py
index 9af5e22..76825ce 100644
--- a/erpnext/education/doctype/student/student.py
+++ b/erpnext/education/doctype/student/student.py
@@ -40,7 +40,7 @@
 			frappe.throw(_("Student {0} exist against student applicant {1}").format(student[0][0], self.student_applicant))
 
 	def after_insert(self):
-		if not frappe.get_single('Education Settings').user_creation_skip:
+		if not frappe.get_single('Education Settings').get('user_creation_skip'):
 			self.create_student_user()
 
 	def create_student_user(self):
diff --git a/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.py b/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.py
index 141329b..7cec362 100644
--- a/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.py
+++ b/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.py
@@ -63,10 +63,11 @@
 	 item_code=%s""",(self.template, self.rate, self.item))
 
 def create_item_from_template(doc):
+	disabled = 1
+	
 	if(doc.is_billable == 1):
 		disabled = 0
-	else:
-		disabled = 1
+
 	#insert item
 	item =  frappe.get_doc({
 	"doctype": "Item",
diff --git a/erpnext/healthcare/doctype/inpatient_record/inpatient_record.py b/erpnext/healthcare/doctype/inpatient_record/inpatient_record.py
index c107cd7..835b38b 100644
--- a/erpnext/healthcare/doctype/inpatient_record/inpatient_record.py
+++ b/erpnext/healthcare/doctype/inpatient_record/inpatient_record.py
@@ -5,7 +5,7 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
-from frappe.utils import today, now_datetime
+from frappe.utils import today, now_datetime, getdate
 from frappe.model.document import Document
 from frappe.desk.reportview import get_match_cond
 
@@ -15,11 +15,20 @@
 		frappe.db.set_value("Patient", self.patient, "inpatient_record", self.name)
 
 	def validate(self):
+		self.validate_dates()
 		self.validate_already_scheduled_or_admitted()
 		if self.status == "Discharged":
 			frappe.db.set_value("Patient", self.patient, "inpatient_status", None)
 			frappe.db.set_value("Patient", self.patient, "inpatient_record", None)
 
+	def validate_dates(self):
+		if (getdate(self.scheduled_date) < getdate(today())) or \
+			(getdate(self.admitted_datetime) < getdate(today())):
+				frappe.throw(_("Scheduled and Admitted dates can not be less than today"))
+		if (getdate(self.expected_discharge) < getdate(self.scheduled_date)) or \
+			(getdate(self.discharge_date) < getdate(self.scheduled_date)):
+			frappe.throw(_("Expected and Discharge dates cannot be less than Admission Schedule date"))
+	
 	def validate_already_scheduled_or_admitted(self):
 		query = """
 			select name, status
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 9e74bfd..ed5bf9b 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -40,8 +40,6 @@
 boot_session = "erpnext.startup.boot.boot_session"
 notification_config = "erpnext.startup.notifications.get_notification_config"
 get_help_messages = "erpnext.utilities.activation.get_help_messages"
-get_user_progress_slides = "erpnext.utilities.user_progress.get_user_progress_slides"
-update_and_get_user_progress = "erpnext.utilities.user_progress_utils.update_default_domain_actions_and_get_state"
 leaderboards = "erpnext.startup.leaderboard.get_leaderboards"
 
 
@@ -301,7 +299,8 @@
 		"erpnext.quality_management.doctype.quality_review.quality_review.review",
 		"erpnext.support.doctype.service_level_agreement.service_level_agreement.check_agreement_status",
 		"erpnext.crm.doctype.email_campaign.email_campaign.send_email_to_leads_or_contacts",
-		"erpnext.crm.doctype.email_campaign.email_campaign.set_email_campaign_status"
+		"erpnext.crm.doctype.email_campaign.email_campaign.set_email_campaign_status",
+		"erpnext.selling.doctype.quotation.quotation.set_expired_status"
 	],
 	"daily_long": [
 		"erpnext.setup.doctype.email_digest.email_digest.send",
diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py
index bc4a1b4..7a9727f 100644
--- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py
+++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py
@@ -5,9 +5,10 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
-from frappe.utils import date_diff, add_days, getdate
+from frappe.utils import date_diff, add_days, getdate, cint
 from frappe.model.document import Document
-from erpnext.hr.utils import validate_dates, validate_overlap, get_leave_period, get_holidays_for_employee
+from erpnext.hr.utils import validate_dates, validate_overlap, get_leave_period, \
+	get_holidays_for_employee, create_additional_leave_ledger_entry
 
 class CompensatoryLeaveRequest(Document):
 
@@ -25,16 +26,14 @@
 			frappe.throw(_("Leave Type is madatory"))
 
 	def validate_attendance(self):
-		query = """select attendance_date, status
-			from `tabAttendance` where
-			attendance_date between %(work_from_date)s and %(work_end_date)s
-			and docstatus=1 and status = 'Present' and employee=%(employee)s"""
+		attendance = frappe.get_all('Attendance',
+			filters={
+				'attendance_date': ['between', (self.work_from_date, self.work_end_date)],
+				'status': 'Present',
+				'docstatus': 1,
+				'employee': self.employee
+			}, fields=['attendance_date', 'status'])
 
-		attendance = frappe.db.sql(query, {
-			"work_from_date": self.work_from_date,
-			"work_end_date": self.work_end_date,
-			"employee": self.employee
-		}, as_dict=True)
 		if len(attendance) < date_diff(self.work_end_date, self.work_from_date) + 1:
 			frappe.throw(_("You are not present all day(s) between compensatory leave request days"))
 
@@ -50,13 +49,19 @@
 			date_difference -= 0.5
 		leave_period = get_leave_period(self.work_from_date, self.work_end_date, company)
 		if leave_period:
-			leave_allocation = self.exists_allocation_for_period(leave_period)
+			leave_allocation = self.get_existing_allocation_for_period(leave_period)
 			if leave_allocation:
 				leave_allocation.new_leaves_allocated += date_difference
-				leave_allocation.submit()
+				leave_allocation.validate()
+				leave_allocation.db_set("new_leaves_allocated", leave_allocation.total_leaves_allocated)
+				leave_allocation.db_set("total_leaves_allocated", leave_allocation.total_leaves_allocated)
+
+				# generate additional ledger entry for the new compensatory leaves off
+				create_additional_leave_ledger_entry(leave_allocation, date_difference, add_days(self.work_end_date, 1))
+
 			else:
 				leave_allocation = self.create_leave_allocation(leave_period, date_difference)
-			self.db_set("leave_allocation", leave_allocation.name)
+			self.leave_allocation=leave_allocation.name
 		else:
 			frappe.throw(_("There is no leave period in between {0} and {1}").format(self.work_from_date, self.work_end_date))
 
@@ -68,11 +73,16 @@
 			leave_allocation = frappe.get_doc("Leave Allocation", self.leave_allocation)
 			if leave_allocation:
 				leave_allocation.new_leaves_allocated -= date_difference
-				if leave_allocation.total_leaves_allocated - date_difference <= 0:
-					leave_allocation.total_leaves_allocated = 0
-				leave_allocation.submit()
+				if leave_allocation.new_leaves_allocated - date_difference <= 0:
+					leave_allocation.new_leaves_allocated = 0
+				leave_allocation.validate()
+				leave_allocation.db_set("new_leaves_allocated", leave_allocation.total_leaves_allocated)
+				leave_allocation.db_set("total_leaves_allocated", leave_allocation.total_leaves_allocated)
 
-	def exists_allocation_for_period(self, leave_period):
+				# create reverse entry on cancelation
+				create_additional_leave_ledger_entry(leave_allocation, date_difference * -1, add_days(self.work_end_date, 1))
+
+	def get_existing_allocation_for_period(self, leave_period):
 		leave_allocation = frappe.db.sql("""
 			select name
 			from `tabLeave Allocation`
@@ -95,17 +105,18 @@
 
 	def create_leave_allocation(self, leave_period, date_difference):
 		is_carry_forward = frappe.db.get_value("Leave Type", self.leave_type, "is_carry_forward")
-		allocation = frappe.new_doc("Leave Allocation")
-		allocation.employee = self.employee
-		allocation.employee_name = self.employee_name
-		allocation.leave_type = self.leave_type
-		allocation.from_date = add_days(self.work_end_date, 1)
-		allocation.to_date = leave_period[0].to_date
-		allocation.new_leaves_allocated = date_difference
-		allocation.total_leaves_allocated = date_difference
-		allocation.description = self.reason
-		if is_carry_forward == 1:
-			allocation.carry_forward = True
-		allocation.save(ignore_permissions = True)
+		allocation = frappe.get_doc(dict(
+			doctype="Leave Allocation",
+			employee=self.employee,
+			employee_name=self.employee_name,
+			leave_type=self.leave_type,
+			from_date=add_days(self.work_end_date, 1),
+			to_date=leave_period[0].to_date,
+			carry_forward=cint(is_carry_forward),
+			new_leaves_allocated=date_difference,
+			total_leaves_allocated=date_difference,
+			description=self.reason
+		))
+		allocation.insert(ignore_permissions=True)
 		allocation.submit()
-		return allocation
+		return allocation
\ No newline at end of file
diff --git a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py
index f2ca1f4..1615ab3 100644
--- a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py
+++ b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py
@@ -5,37 +5,128 @@
 
 import frappe
 import unittest
+from frappe.utils import today, add_months, add_days
+from erpnext.hr.doctype.attendance_request.test_attendance_request import get_employee
+from erpnext.hr.doctype.leave_period.test_leave_period import create_leave_period
+from erpnext.hr.doctype.leave_application.leave_application import get_leave_balance_on
 
-# class TestCompensatoryLeaveRequest(unittest.TestCase):
-# 	def get_compensatory_leave_request(self):
-# 		return frappe.get_doc('Compensatory Leave Request', dict(
-# 			employee = employee,
-# 			work_from_date = today,
-# 			work_to_date = today,
-# 			reason = 'test'
-# 		)).insert()
-#
-# 	def test_creation_of_leave_allocation(self):
-# 		employee = get_employee()
-# 		today = get_today()
-#
-# 		compensatory_leave_request = self.get_compensatory_leave_request(today)
-#
-# 		before = get_leave_balance(employee, compensatory_leave_request.leave_type)
-#
-# 		compensatory_leave_request.submit()
-#
-# 		self.assertEqual(get_leave_balance(employee, compensatory_leave_request.leave_type), before + 1)
-#
-# 	def test_max_compensatory_leave(self):
-# 		employee = get_employee()
-# 		today = get_today()
-#
-# 		compensatory_leave_request = self.get_compensatory_leave_request()
-#
-# 		frappe.db.set_value('Leave Type', compensatory_leave_request.leave_type, 'max_leaves_allowed', 0)
-#
-# 		self.assertRaises(MaxLeavesLimitCrossed, compensatory_leave_request.submit)
-#
-# 		frappe.db.set_value('Leave Type', compensatory_leave_request.leave_type, 'max_leaves_allowed', 10)
-#
+class TestCompensatoryLeaveRequest(unittest.TestCase):
+	def setUp(self):
+		frappe.db.sql(''' delete from `tabCompensatory Leave Request`''')
+		frappe.db.sql(''' delete from `tabLeave Ledger Entry`''')
+		frappe.db.sql(''' delete from `tabLeave Allocation`''')
+		frappe.db.sql(''' delete from `tabAttendance` where attendance_date in {0} '''.format((today(), add_days(today(), -1)))) #nosec
+		create_leave_period(add_months(today(), -3), add_months(today(), 3), "_Test Company")
+		create_holiday_list()
+
+		employee = get_employee()
+		employee.holiday_list = "_Test Compensatory Leave"
+		employee.save()
+
+	def test_leave_balance_on_submit(self):
+		''' check creation of leave allocation on submission of compensatory leave request '''
+		employee = get_employee()
+		mark_attendance(employee)
+		compensatory_leave_request = get_compensatory_leave_request(employee.name)
+
+		before = get_leave_balance_on(employee.name, compensatory_leave_request.leave_type, today())
+		compensatory_leave_request.submit()
+
+		self.assertEqual(get_leave_balance_on(employee.name, compensatory_leave_request.leave_type, add_days(today(), 1)), before + 1)
+
+	def test_leave_allocation_update_on_submit(self):
+		employee = get_employee()
+		mark_attendance(employee, date=add_days(today(), -1))
+		compensatory_leave_request = get_compensatory_leave_request(employee.name, leave_date=add_days(today(), -1))
+		compensatory_leave_request.submit()
+
+		# leave allocation creation on submit
+		leaves_allocated = frappe.db.get_value('Leave Allocation', {
+				'name': compensatory_leave_request.leave_allocation
+			}, ['total_leaves_allocated'])
+		self.assertEqual(leaves_allocated, 1)
+
+		mark_attendance(employee)
+		compensatory_leave_request = get_compensatory_leave_request(employee.name)
+		compensatory_leave_request.submit()
+
+		# leave allocation updates on submission of second compensatory leave request
+		leaves_allocated = frappe.db.get_value('Leave Allocation', {
+				'name': compensatory_leave_request.leave_allocation
+			}, ['total_leaves_allocated'])
+		self.assertEqual(leaves_allocated, 2)
+
+	def test_creation_of_leave_ledger_entry_on_submit(self):
+		''' check creation of leave ledger entry on submission of leave request '''
+		employee = get_employee()
+		mark_attendance(employee)
+		compensatory_leave_request = get_compensatory_leave_request(employee.name)
+		compensatory_leave_request.submit()
+
+		filters = dict(transaction_name=compensatory_leave_request.leave_allocation)
+		leave_ledger_entry = frappe.get_all('Leave Ledger Entry', fields='*', filters=filters)
+
+		self.assertEquals(len(leave_ledger_entry), 1)
+		self.assertEquals(leave_ledger_entry[0].employee, compensatory_leave_request.employee)
+		self.assertEquals(leave_ledger_entry[0].leave_type, compensatory_leave_request.leave_type)
+		self.assertEquals(leave_ledger_entry[0].leaves, 1)
+
+		# check reverse leave ledger entry on cancellation
+		compensatory_leave_request.cancel()
+		leave_ledger_entry = frappe.get_all('Leave Ledger Entry', fields='*', filters=filters, order_by = 'creation desc')
+
+		self.assertEquals(len(leave_ledger_entry), 2)
+		self.assertEquals(leave_ledger_entry[0].employee, compensatory_leave_request.employee)
+		self.assertEquals(leave_ledger_entry[0].leave_type, compensatory_leave_request.leave_type)
+		self.assertEquals(leave_ledger_entry[0].leaves, -1)
+
+def get_compensatory_leave_request(employee, leave_date=today()):
+	prev_comp_leave_req = frappe.db.get_value('Compensatory Leave Request',
+		dict(leave_type='Compensatory Off',
+			work_from_date=leave_date,
+			work_end_date=leave_date,
+			employee=employee), 'name')
+	if prev_comp_leave_req:
+		return frappe.get_doc('Compensatory Leave Request', prev_comp_leave_req)
+
+	return frappe.get_doc(dict(
+			doctype='Compensatory Leave Request',
+			employee=employee,
+			leave_type='Compensatory Off',
+			work_from_date=leave_date,
+			work_end_date=leave_date,
+			reason='test'
+		)).insert()
+
+def mark_attendance(employee, date=today(), status='Present'):
+	if not frappe.db.exists(dict(doctype='Attendance', employee=employee.name, attendance_date=date, status='Present')):
+		attendance = frappe.get_doc({
+				"doctype": "Attendance",
+				"employee": employee.name,
+				"attendance_date": date,
+				"status": status
+		})
+		attendance.save()
+		attendance.submit()
+
+def create_holiday_list():
+	if frappe.db.exists("Holiday List", "_Test Compensatory Leave"):
+		return
+
+	holiday_list = frappe.get_doc({
+		"doctype": "Holiday List",
+		"from_date": add_months(today(), -3),
+		"to_date": add_months(today(), 3),
+		"holidays": [
+			{
+				"description": "Test Holiday",
+				"holiday_date": today()
+			},
+			{
+				"description": "Test Holiday 1",
+				"holiday_date": add_days(today(), -1)
+			}
+		],
+		"holiday_list_name": "_Test Compensatory Leave"
+	})
+	holiday_list.save()
\ No newline at end of file
diff --git a/erpnext/hr/doctype/employee/employee.py b/erpnext/hr/doctype/employee/employee.py
index 703ec06..242531b 100755
--- a/erpnext/hr/doctype/employee/employee.py
+++ b/erpnext/hr/doctype/employee/employee.py
@@ -4,7 +4,7 @@
 from __future__ import unicode_literals
 import frappe
 
-from frappe.utils import getdate, validate_email_address, today, add_years, format_datetime
+from frappe.utils import getdate, validate_email_address, today, add_years, format_datetime, cstr
 from frappe.model.naming import set_name_by_naming_series
 from frappe import throw, _, scrub
 from frappe.permissions import add_user_permission, remove_user_permission, \
@@ -152,8 +152,8 @@
 		elif self.date_of_retirement and self.date_of_joining and (getdate(self.date_of_retirement) <= getdate(self.date_of_joining)):
 			throw(_("Date Of Retirement must be greater than Date of Joining"))
 
-		elif self.relieving_date and self.date_of_joining and (getdate(self.relieving_date) <= getdate(self.date_of_joining)):
-			throw(_("Relieving Date must be greater than Date of Joining"))
+		elif self.relieving_date and self.date_of_joining and (getdate(self.relieving_date) < getdate(self.date_of_joining)):
+			throw(_("Relieving Date must be greater than or equal to Date of Joining"))
 
 		elif self.contract_end_date and self.date_of_joining and (getdate(self.contract_end_date) <= getdate(self.date_of_joining)):
 			throw(_("Contract End Date must be greater than Date of Joining"))
@@ -218,8 +218,8 @@
 
 	def reset_employee_emails_cache(self):
 		prev_doc = self.get_doc_before_save() or {}
-		cell_number = self.get('cell_number')
-		prev_number = prev_doc.get('cell_number')
+		cell_number = cstr(self.get('cell_number'))
+		prev_number = cstr(prev_doc.get('cell_number'))
 		if (cell_number != prev_number or
 			self.get('user_id') != prev_doc.get('user_id')):
 			frappe.cache().hdel('employees_with_number', cell_number)
diff --git a/erpnext/hr/doctype/employee_attendance_tool/employee_attendance_tool.py b/erpnext/hr/doctype/employee_attendance_tool/employee_attendance_tool.py
index 32fcee1..16c1a32 100644
--- a/erpnext/hr/doctype/employee_attendance_tool/employee_attendance_tool.py
+++ b/erpnext/hr/doctype/employee_attendance_tool/employee_attendance_tool.py
@@ -6,6 +6,7 @@
 import frappe
 import json
 from frappe.model.document import Document
+from frappe.utils import getdate
 
 
 class EmployeeAttendanceTool(Document):
@@ -43,17 +44,26 @@
 
 @frappe.whitelist()
 def mark_employee_attendance(employee_list, status, date, leave_type=None, company=None):
+
 	employee_list = json.loads(employee_list)
 	for employee in employee_list:
-		attendance = frappe.new_doc("Attendance")
-		attendance.employee = employee['employee']
-		attendance.employee_name = employee['employee_name']
-		attendance.attendance_date = date
-		attendance.status = status
+
 		if status == "On Leave" and leave_type:
-			attendance.leave_type = leave_type
-		if company:
-			attendance.company = company
+			leave_type = leave_type
 		else:
-			attendance.company = frappe.db.get_value("Employee", employee['employee'], "Company")
+			leave_type = None
+
+		if not company:
+			company = frappe.db.get_value("Employee", employee['employee'], "Company")
+
+		attendance=frappe.get_doc(dict(
+			doctype='Attendance',
+			employee=employee.get('employee'),
+			employee_name=employee.get('employee_name'),
+			attendance_date=getdate(date),
+			status=status,
+			leave_type=leave_type,
+			company=company
+		))
+		attendance.insert()
 		attendance.submit()
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.js b/erpnext/hr/doctype/expense_claim/expense_claim.js
index 6d3a28e..0d37c10 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.js
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.js
@@ -208,6 +208,24 @@
 		frm.refresh_fields();
 	},
 
+	grand_total: function(frm) {
+		frm.trigger("update_employee_advance_claimed_amount");
+	},
+
+	update_employee_advance_claimed_amount: function(frm) {
+		let amount_to_be_allocated = frm.doc.grand_total;
+		$.each(frm.doc.advances || [], function(i, advance){
+			if (amount_to_be_allocated >= advance.unclaimed_amount){
+				frm.doc.advances[i].allocated_amount = frm.doc.advances[i].unclaimed_amount;
+				amount_to_be_allocated -= advance.allocated_amount;
+			} else{
+				frm.doc.advances[i].allocated_amount = amount_to_be_allocated;
+				amount_to_be_allocated = 0;
+			}
+			frm.refresh_field("advances");
+		});
+	},
+
 	make_payment_entry: function(frm) {
 		var method = "erpnext.accounts.doctype.payment_entry.payment_entry.get_payment_entry";
 		if(frm.doc.__onload && frm.doc.__onload.make_payment_via_journal_entry) {
@@ -300,7 +318,7 @@
 							row.advance_account = d.advance_account;
 							row.advance_paid = d.paid_amount;
 							row.unclaimed_amount = flt(d.paid_amount) - flt(d.claimed_amount);
-							row.allocated_amount = flt(d.paid_amount) - flt(d.claimed_amount);
+							row.allocated_amount = 0;
 						});
 						refresh_field("advances");
 					}
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.py b/erpnext/hr/doctype/expense_claim/expense_claim.py
index f003627..5939150 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.py
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.py
@@ -140,32 +140,6 @@
 					"against": ",".join([d.default_account for d in self.expenses]),
 					"party_type": "Employee",
 					"party": self.employee,
-					"against_voucher_type": self.doctype,
-					"against_voucher": self.name
-				})
-			)
-
-			gl_entry.append(
-				self.get_gl_dict({
-					"account": data.advance_account,
-					"debit": data.allocated_amount,
-					"debit_in_account_currency": data.allocated_amount,
-					"against": self.payable_account,
-					"party_type": "Employee",
-					"party": self.employee,
-					"against_voucher_type": self.doctype,
-					"against_voucher": self.name
-				})
-			)
-
-			gl_entry.append(
-				self.get_gl_dict({
-					"account": self.payable_account,
-					"credit": data.allocated_amount,
-					"credit_in_account_currency": data.allocated_amount,
-					"against": data.advance_account,
-					"party_type": "Employee",
-					"party": self.employee,
 					"against_voucher_type": "Employee Advance",
 					"against_voucher": data.employee_advance
 				})
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
index 874ae7a..d13bb45 100755
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
@@ -69,10 +69,14 @@
 
 	def validate_allocation_overlap(self):
 		leave_allocation = frappe.db.sql("""
-			select name from `tabLeave Allocation`
-			where employee=%s and leave_type=%s and docstatus=1
-			and to_date >= %s and from_date <= %s""",
-			(self.employee, self.leave_type, self.from_date, self.to_date))
+			SELECT
+				name
+			FROM `tabLeave Allocation`
+			WHERE
+				employee=%s AND leave_type=%s
+				AND name <> %s AND docstatus=1
+				AND to_date >= %s AND from_date <= %s""",
+			(self.employee, self.leave_type, self.name, self.from_date, self.to_date))
 
 		if leave_allocation:
 			frappe.msgprint(_("{0} already allocated for Employee {1} for period {2} to {3}")
diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js
index 1746410..e32d570 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.js
+++ b/erpnext/hr/doctype/leave_application/leave_application.js
@@ -60,7 +60,6 @@
 					}
 				}
 			});
-			$("div").remove(".form-dashboard-section");
 			frm.dashboard.add_section(
 				frappe.render_template('leave_application_dashboard', {
 					data: leave_details
@@ -171,7 +170,7 @@
 				frm.set_value('to_date', '');
 				return;
 			}
-				// server call is done to include holidays in leave days calculations
+			// server call is done to include holidays in leave days calculations
 			return frappe.call({
 				method: 'erpnext.hr.doctype.leave_application.leave_application.get_number_of_leave_days',
 				args: {
@@ -194,7 +193,7 @@
 
 	set_leave_approver: function(frm) {
 		if(frm.doc.employee) {
-				// server call is done to include holidays in leave days calculations
+			// server call is done to include holidays in leave days calculations
 			return frappe.call({
 				method: 'erpnext.hr.doctype.leave_application.leave_application.get_leave_approver',
 				args: {
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index 0e66305..65fcbf7 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -549,10 +549,10 @@
 			leave_days += leave_entry.leaves
 
 		elif inclusive_period and leave_entry.transaction_type == 'Leave Allocation' \
-			and not skip_expiry_leaves(leave_entry, to_date):
+			and leave_entry.is_expired and not skip_expiry_leaves(leave_entry, to_date):
 			leave_days += leave_entry.leaves
 
-		else:
+		elif leave_entry.transaction_type == 'Leave Application':
 			if leave_entry.from_date < getdate(from_date):
 				leave_entry.from_date = from_date
 			if leave_entry.to_date > getdate(to_date):
@@ -579,14 +579,15 @@
 def get_leave_entries(employee, leave_type, from_date, to_date):
 	''' Returns leave entries between from_date and to_date '''
 	return frappe.db.sql("""
-		select employee, leave_type, from_date, to_date, leaves, transaction_type, is_carry_forward, transaction_name
-		from `tabLeave Ledger Entry`
-		where employee=%(employee)s and leave_type=%(leave_type)s
-			and docstatus=1
-			and leaves<0
-			and (from_date between %(from_date)s and %(to_date)s
-				or to_date between %(from_date)s and %(to_date)s
-				or (from_date < %(from_date)s and to_date > %(to_date)s))
+		SELECT
+			employee, leave_type, from_date, to_date, leaves, transaction_name, transaction_type,
+			is_carry_forward, is_expired
+		FROM `tabLeave Ledger Entry`
+		WHERE employee=%(employee)s AND leave_type=%(leave_type)s
+			AND docstatus=1 AND leaves<0
+			AND (from_date between %(from_date)s AND %(to_date)s
+				OR to_date between %(from_date)s AND %(to_date)s
+				OR (from_date < %(from_date)s AND to_date > %(to_date)s))
 	""", {
 		"from_date": from_date,
 		"to_date": to_date,
@@ -773,4 +774,4 @@
 		leave_approver = frappe.db.get_value('Department Approver', {'parent': department,
 			'parentfield': 'leave_approvers', 'idx': 1}, 'approver')
 
-	return leave_approver
+	return leave_approver
\ No newline at end of file
diff --git a/erpnext/hr/doctype/leave_application/test_leave_application.py b/erpnext/hr/doctype/leave_application/test_leave_application.py
index 38ae808..b9c0210 100644
--- a/erpnext/hr/doctype/leave_application/test_leave_application.py
+++ b/erpnext/hr/doctype/leave_application/test_leave_application.py
@@ -301,7 +301,7 @@
 			to_date = add_days(date, 2),
 			company = "_Test Company",
 			docstatus = 1,
-            status = "Approved"
+			status = "Approved"
 		))
 		leave_application.submit()
 
@@ -314,7 +314,7 @@
 			to_date = add_days(date, 8),
 			company = "_Test Company",
 			docstatus = 1,
-            status = "Approved"
+			status = "Approved"
 		))
 		self.assertRaises(frappe.ValidationError, leave_application.insert)
 
diff --git a/erpnext/hr/doctype/leave_period/test_leave_period.py b/erpnext/hr/doctype/leave_period/test_leave_period.py
index 850a08d..1762cf9 100644
--- a/erpnext/hr/doctype/leave_period/test_leave_period.py
+++ b/erpnext/hr/doctype/leave_period/test_leave_period.py
@@ -43,10 +43,18 @@
 		leave_period.grant_leave_allocation(employee=employee_doc_name)
 		self.assertEqual(get_leave_balance_on(employee_doc_name, leave_type, today()), 20)
 
-def create_leave_period(from_date, to_date):
+def create_leave_period(from_date, to_date, company=None):
+	leave_period = frappe.db.get_value('Leave Period',
+		dict(company=company or erpnext.get_default_company(),
+			from_date=from_date,
+			to_date=to_date,
+			is_active=1), 'name')
+	if leave_period:
+		return frappe.get_doc("Leave Period", leave_period)
+
 	leave_period = frappe.get_doc({
 		"doctype": "Leave Period",
-		"company": erpnext.get_default_company(),
+		"company": company or erpnext.get_default_company(),
 		"from_date": from_date,
 		"to_date": to_date,
 		"is_active": 1
diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.js b/erpnext/hr/doctype/payroll_entry/payroll_entry.js
index adc0671..d25eb6d 100644
--- a/erpnext/hr/doctype/payroll_entry/payroll_entry.js
+++ b/erpnext/hr/doctype/payroll_entry/payroll_entry.js
@@ -31,7 +31,11 @@
 			}
 			if ((frm.doc.employees || []).length) {
 				frm.page.set_primary_action(__('Create Salary Slips'), () => {
-					frm.save('Submit');
+					frm.save('Submit').then(()=>{
+						frm.page.clear_primary_action();
+						frm.refresh();
+						frm.events.refresh(frm);
+					});
 				});
 			}
 		}
diff --git a/erpnext/hr/doctype/repayment_schedule/repayment_schedule.json b/erpnext/hr/doctype/repayment_schedule/repayment_schedule.json
index a116185..5bb2d37 100644
--- a/erpnext/hr/doctype/repayment_schedule/repayment_schedule.json
+++ b/erpnext/hr/doctype/repayment_schedule/repayment_schedule.json
@@ -1,231 +1,82 @@
 {
- "allow_copy": 0, 
- "allow_guest_to_view": 0, 
- "allow_import": 0, 
- "allow_rename": 0, 
- "beta": 0, 
- "creation": "2016-12-20 15:32:25.078334", 
- "custom": 0, 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "", 
- "editable_grid": 1, 
- "engine": "InnoDB", 
+ "creation": "2016-12-20 15:32:25.078334",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "payment_date",
+  "principal_amount",
+  "interest_amount",
+  "total_payment",
+  "balance_loan_amount",
+  "paid"
+ ],
  "fields": [
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 2, 
-   "fieldname": "payment_date", 
-   "fieldtype": "Date", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Payment 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_on_submit": 1,
+   "columns": 2,
+   "fieldname": "payment_date",
+   "fieldtype": "Date",
+   "in_list_view": 1,
+   "label": "Payment Date"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 2, 
-   "fieldname": "principal_amount", 
-   "fieldtype": "Currency", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Principal Amount", 
-   "length": 0, 
-   "no_copy": 1, 
-   "options": "Company:company:default_currency", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "columns": 2,
+   "fieldname": "principal_amount",
+   "fieldtype": "Currency",
+   "in_list_view": 1,
+   "label": "Principal Amount",
+   "no_copy": 1,
+   "options": "Company:company:default_currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 2, 
-   "fieldname": "interest_amount", 
-   "fieldtype": "Currency", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Interest Amount", 
-   "length": 0, 
-   "no_copy": 1, 
-   "options": "Company:company:default_currency", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "columns": 2,
+   "fieldname": "interest_amount",
+   "fieldtype": "Currency",
+   "in_list_view": 1,
+   "label": "Interest Amount",
+   "no_copy": 1,
+   "options": "Company:company:default_currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 2, 
-   "fieldname": "total_payment", 
-   "fieldtype": "Currency", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Total Payment", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Company:company:default_currency", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "columns": 2,
+   "fieldname": "total_payment",
+   "fieldtype": "Currency",
+   "in_list_view": 1,
+   "label": "Total Payment",
+   "options": "Company:company:default_currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 2, 
-   "fieldname": "balance_loan_amount", 
-   "fieldtype": "Currency", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Balance Loan Amount", 
-   "length": 0, 
-   "no_copy": 1, 
-   "options": "Company:company:default_currency", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "columns": 2,
+   "fieldname": "balance_loan_amount",
+   "fieldtype": "Currency",
+   "in_list_view": 1,
+   "label": "Balance Loan Amount",
+   "no_copy": 1,
+   "options": "Company:company:default_currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "paid", 
-   "fieldtype": "Check", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Paid", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
+   "default": "0",
+   "fieldname": "paid",
+   "fieldtype": "Check",
+   "in_list_view": 1,
+   "label": "Paid",
+   "read_only": 1
   }
- ], 
- "has_web_view": 0, 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "idx": 0, 
- "image_view": 0, 
- "in_create": 0, 
- "is_submittable": 0, 
- "issingle": 0, 
- "istable": 1, 
- "max_attachments": 0, 
- "modified": "2018-03-30 17:37:31.834792", 
- "modified_by": "Administrator", 
- "module": "HR", 
- "name": "Repayment Schedule", 
- "name_case": "", 
- "owner": "Administrator", 
- "permissions": [], 
- "quick_entry": 1, 
- "read_only": 0, 
- "read_only_onload": 0, 
- "show_name_in_global_search": 0, 
- "sort_field": "modified", 
- "sort_order": "DESC", 
- "track_changes": 1, 
- "track_seen": 0
+ ],
+ "istable": 1,
+ "modified": "2019-10-29 11:45:10.694557",
+ "modified_by": "Administrator",
+ "module": "HR",
+ "name": "Repayment Schedule",
+ "owner": "Administrator",
+ "permissions": [],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
 }
\ No newline at end of file
diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py
index 1464a77..c3e8d27 100644
--- a/erpnext/hr/utils.py
+++ b/erpnext/hr/utils.py
@@ -321,11 +321,11 @@
 				if new_allocation == allocation.total_leaves_allocated:
 					continue
 				allocation.db_set("total_leaves_allocated", new_allocation, update_modified=False)
-				create_earned_leave_ledger_entry(allocation, earned_leaves, today)
+				create_additional_leave_ledger_entry(allocation, earned_leaves, today)
 
-def create_earned_leave_ledger_entry(allocation, earned_leaves, date):
-	''' Create leave ledger entry based on the earned leave frequency '''
-	allocation.new_leaves_allocated = earned_leaves
+def create_additional_leave_ledger_entry(allocation, leaves, date):
+	''' Create leave ledger entry for leave types '''
+	allocation.new_leaves_allocated = leaves
 	allocation.from_date = date
 	allocation.unused_leaves = 0
 	allocation.create_leave_ledger_entry()
@@ -389,6 +389,7 @@
 
 def get_holidays_for_employee(employee, start_date, end_date):
 	holiday_list = get_holiday_list_for_employee(employee)
+
 	holidays = frappe.db.sql_list('''select holiday_date from `tabHoliday`
 		where
 			parent=%(holiday_list)s
diff --git a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
index faed707..38118bd 100644
--- a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
+++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
@@ -44,6 +44,8 @@
 			target.item_name = item.get("item_name")
 			target.description = item.get("description")
 			target.uom = item.get("stock_uom")
+			target.against_blanket_order = 1
+			target.blanket_order = source_name
 
 	target_doc = get_mapped_doc("Blanket Order", source_name, {
 		"Blanket Order": {
@@ -71,6 +73,8 @@
 			target.description = item.get("description")
 			target.uom = item.get("stock_uom")
 			target.warehouse = item.get("default_warehouse")
+			target.against_blanket_order = 1
+			target.blanket_order = source_name
 
 	target_doc = get_mapped_doc("Blanket Order", source_name, {
 		"Blanket Order": {
diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js
index b9591d6..8283fd7 100644
--- a/erpnext/manufacturing/doctype/bom/bom.js
+++ b/erpnext/manufacturing/doctype/bom/bom.js
@@ -5,6 +5,12 @@
 
 frappe.ui.form.on("BOM", {
 	setup: function(frm) {
+		frm.custom_make_buttons = {
+			'BOM': 'Duplicate BOM',
+			'Work Order': 'Work Order',
+			'Quality Inspection': 'Quality Inspection'
+		};
+
 		frm.set_query("bom_no", "items", function() {
 			return {
 				filters: {
@@ -85,9 +91,21 @@
 		}
 
 		if(frm.doc.docstatus!=0) {
-			frm.add_custom_button(__("Duplicate"), function() {
+			frm.add_custom_button(__("Duplicate BOM"), function() {
 				frm.copy_doc();
-			});
+			}, __("Create"));
+
+			frm.add_custom_button(__("Work Order"), function() {
+				frm.trigger("make_work_order");
+			}, __("Create"));
+
+			if (frm.doc.inspection_required) {
+				frm.add_custom_button(__("Quality Inspection"), function() {
+					frm.trigger("make_quality_inspection");
+				}, __("Create"));
+			}
+
+			frm.page.set_inner_btn_group_as_primary(__('Create'));
 		}
 
 		if(frm.doc.items && frm.doc.allow_alternative_item) {
@@ -109,6 +127,41 @@
 		}
 	},
 
+	make_work_order: function(frm) {
+		const fields = [{
+			fieldtype: 'Float',
+			label: __('Qty To Manufacture'),
+			fieldname: 'qty',
+			reqd: 1,
+			default: 1
+		}];
+
+		frappe.prompt(fields, data => {
+			frappe.call({
+				method: "erpnext.manufacturing.doctype.work_order.work_order.make_work_order",
+				args: {
+					item: frm.doc.item,
+					qty: data.qty || 0.0,
+					project: frm.doc.project
+				},
+				freeze: true,
+				callback: function(r) {
+					if(r.message) {
+						var doc = frappe.model.sync(r.message)[0];
+						frappe.set_route("Form", doc.doctype, doc.name);
+					}
+				}
+			});
+		}, __("Enter Value"), __("Create"));
+	},
+
+	make_quality_inspection: function(frm) {
+		frappe.model.open_mapped_doc({
+			method: "erpnext.stock.doctype.quality_inspection.quality_inspection.make_quality_inspection",
+			frm: frm
+		})
+	},
+
 	update_cost: function(frm) {
 		return frappe.call({
 			doc: frm.doc,
diff --git a/erpnext/manufacturing/doctype/bom/bom.json b/erpnext/manufacturing/doctype/bom/bom.json
index a0faeb5..63f4f97 100644
--- a/erpnext/manufacturing/doctype/bom/bom.json
+++ b/erpnext/manufacturing/doctype/bom/bom.json
@@ -3,33 +3,36 @@
  "creation": "2013-01-22 15:11:38",
  "doctype": "DocType",
  "document_type": "Setup",
+ "engine": "InnoDB",
  "field_order": [
   "item",
-  "item_name",
-  "image",
-  "uom",
   "quantity",
+  "set_rate_of_sub_assembly_item_based_on_bom",
   "cb0",
   "is_active",
   "is_default",
-  "with_operations",
-  "inspection_required",
   "allow_alternative_item",
-  "allow_same_item_multiple_times",
-  "set_rate_of_sub_assembly_item_based_on_bom",
-  "quality_inspection_template",
+  "image",
+  "item_name",
+  "uom",
   "currency_detail",
   "company",
-  "transfer_material_against",
+  "project",
   "conversion_rate",
   "column_break_12",
   "currency",
   "rm_cost_as_per",
   "buying_price_list",
-  "operations_section",
+  "section_break_21",
+  "with_operations",
+  "column_break_23",
+  "transfer_material_against",
   "routing",
+  "operations_section",
   "operations",
   "materials_section",
+  "inspection_required",
+  "quality_inspection_template",
   "items",
   "scrap_section",
   "scrap_items",
@@ -41,14 +44,9 @@
   "base_operating_cost",
   "base_raw_material_cost",
   "base_scrap_material_cost",
-  "total_cost_of_bom",
-  "total_cost",
   "column_break_26",
+  "total_cost",
   "base_total_cost",
-  "more_info_section",
-  "project",
-  "amended_from",
-  "col_break23",
   "section_break_25",
   "description",
   "column_break_27",
@@ -57,12 +55,14 @@
   "website_section",
   "show_in_website",
   "route",
+  "column_break_52",
   "website_image",
   "thumbnail",
   "sb_web_spec",
-  "web_long_description",
   "show_items",
-  "show_operations"
+  "show_operations",
+  "web_long_description",
+  "amended_from"
  ],
  "fields": [
   {
@@ -152,7 +152,7 @@
    "default": "0",
    "fieldname": "inspection_required",
    "fieldtype": "Check",
-   "label": "Inspection Required"
+   "label": "Quality Inspection Required"
   },
   {
    "default": "0",
@@ -161,12 +161,6 @@
    "label": "Allow Alternative Item"
   },
   {
-   "default": "0",
-   "fieldname": "allow_same_item_multiple_times",
-   "fieldtype": "Check",
-   "label": "Allow Same Item Multiple Times"
-  },
-  {
    "allow_on_submit": 1,
    "default": "1",
    "fieldname": "set_rate_of_sub_assembly_item_based_on_bom",
@@ -193,6 +187,7 @@
    "reqd": 1
   },
   {
+   "default": "Work Order",
    "fieldname": "transfer_material_against",
    "fieldtype": "Select",
    "label": "Transfer Material Against",
@@ -235,10 +230,10 @@
   {
    "fieldname": "operations_section",
    "fieldtype": "Section Break",
-   "label": "Operations",
    "oldfieldtype": "Section Break"
   },
   {
+   "depends_on": "with_operations",
    "fieldname": "routing",
    "fieldtype": "Link",
    "label": "Routing",
@@ -336,10 +331,6 @@
    "read_only": 1
   },
   {
-   "fieldname": "total_cost_of_bom",
-   "fieldtype": "Section Break"
-  },
-  {
    "fieldname": "total_cost",
    "fieldtype": "Currency",
    "in_list_view": 1,
@@ -360,10 +351,6 @@
    "read_only": 1
   },
   {
-   "fieldname": "more_info_section",
-   "fieldtype": "Section Break"
-  },
-  {
    "fieldname": "project",
    "fieldtype": "Link",
    "label": "Project",
@@ -382,10 +369,6 @@
    "read_only": 1
   },
   {
-   "fieldname": "col_break23",
-   "fieldtype": "Column Break"
-  },
-  {
    "fieldname": "section_break_25",
    "fieldtype": "Section Break"
   },
@@ -481,13 +464,26 @@
    "fieldname": "show_operations",
    "fieldtype": "Check",
    "label": "Show Operations"
+  },
+  {
+   "fieldname": "section_break_21",
+   "fieldtype": "Section Break",
+   "label": "Operations"
+  },
+  {
+   "fieldname": "column_break_23",
+   "fieldtype": "Column Break"
+  },
+  {
+   "fieldname": "column_break_52",
+   "fieldtype": "Column Break"
   }
  ],
  "icon": "fa fa-sitemap",
  "idx": 1,
  "image_field": "image",
  "is_submittable": 1,
- "modified": "2019-07-30 17:00:09.665068",
+ "modified": "2019-11-22 14:35:12.142150",
  "modified_by": "Administrator",
  "module": "Manufacturing",
  "name": "BOM",
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index db79d7f..e3ece56 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -96,6 +96,7 @@
 
 	def get_routing(self):
 		if self.routing:
+			self.set("operations", [])
 			for d in frappe.get_all("BOM Operation", fields = ["*"],
 				filters = {'parenttype': 'Routing', 'parent': self.routing}):
 				child = self.append('operations', d)
@@ -289,7 +290,7 @@
 		if not valuation_rate:
 			valuation_rate = frappe.db.get_value("Item", args['item_code'], "valuation_rate")
 
-		return valuation_rate
+		return flt(valuation_rate)
 
 	def manage_default_bom(self):
 		""" Uncheck others if current one is selected as default or
@@ -362,15 +363,9 @@
 	def validate_materials(self):
 		""" Validate raw material entries """
 
-		def get_duplicates(lst):
-			seen = set()
-			seen_add = seen.add
-			for item in lst:
-				if item.item_code in seen or seen_add(item.item_code):
-					yield item
-
 		if not self.get('items'):
 			frappe.throw(_("Raw Materials cannot be blank."))
+
 		check_list = []
 		for m in self.get('items'):
 			if m.bom_no:
@@ -379,16 +374,6 @@
 				frappe.throw(_("Quantity required for Item {0} in row {1}").format(m.item_code, m.idx))
 			check_list.append(m)
 
-		if not self.allow_same_item_multiple_times:
-			duplicate_items = list(get_duplicates(check_list))
-			if duplicate_items:
-				li = []
-				for i in duplicate_items:
-					li.append("{0} on row {1}".format(i.item_code, i.idx))
-				duplicate_list = '<br>' + '<br>'.join(li)
-
-				frappe.throw(_("Same item has been entered multiple times. {0}").format(duplicate_list))
-
 	def check_recursion(self, bom_list=[]):
 		""" Check whether recursion occurs in any bom"""
 		bom_list = self.traverse_tree()
@@ -621,6 +606,7 @@
 				item.image,
 				bom.project,
 				item.stock_uom,
+				item.item_group,
 				item.allow_alternative_item,
 				item_default.default_warehouse,
 				item_default.expense_account as expense_account,
diff --git a/erpnext/manufacturing/doctype/bom/bom_dashboard.py b/erpnext/manufacturing/doctype/bom/bom_dashboard.py
index 803ece7..060cd53 100644
--- a/erpnext/manufacturing/doctype/bom/bom_dashboard.py
+++ b/erpnext/manufacturing/doctype/bom/bom_dashboard.py
@@ -17,11 +17,13 @@
 			},
 			{
 				'label': _('Manufacture'),
-				'items': ['BOM', 'Work Order', 'Job Card', 'Production Plan']
+				'items': ['BOM', 'Work Order', 'Job Card']
 			},
 			{
-				'label': _('Purchase'),
+				'label': _('Subcontract'),
 				'items': ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']
 			}
-		]
+		],
+		'disable_create_buttons': ["Item", "Purchase Order", "Purchase Receipt",
+			"Purchase Invoice", "Job Card", "Stock Entry"]
 	}
diff --git a/erpnext/manufacturing/doctype/bom_item/bom_item.json b/erpnext/manufacturing/doctype/bom_item/bom_item.json
index febf315..f094be4 100644
--- a/erpnext/manufacturing/doctype/bom_item/bom_item.json
+++ b/erpnext/manufacturing/doctype/bom_item/bom_item.json
@@ -1,1053 +1,273 @@
 {
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
  "creation": "2013-02-22 01:27:49",
- "custom": 0,
- "docstatus": 0,
  "doctype": "DocType",
  "document_type": "Setup",
  "editable_grid": 1,
+ "field_order": [
+  "item_code",
+  "item_name",
+  "operation",
+  "column_break_3",
+  "bom_no",
+  "source_warehouse",
+  "allow_alternative_item",
+  "section_break_5",
+  "description",
+  "col_break1",
+  "image",
+  "image_view",
+  "quantity_and_rate",
+  "qty",
+  "uom",
+  "col_break2",
+  "stock_qty",
+  "stock_uom",
+  "conversion_factor",
+  "rate_amount_section",
+  "rate",
+  "base_rate",
+  "column_break_21",
+  "amount",
+  "base_amount",
+  "section_break_18",
+  "scrap",
+  "qty_consumed_per_unit",
+  "section_break_27",
+  "include_item_in_manufacturing",
+  "original_item"
+ ],
  "fields": [
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
    "columns": 3,
    "fieldname": "item_code",
    "fieldtype": "Link",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
    "in_filter": 1,
-   "in_global_search": 0,
    "in_list_view": 1,
-   "in_standard_filter": 0,
    "label": "Item Code",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "item_code",
    "oldfieldtype": "Link",
    "options": "Item",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 0,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
    "reqd": 1,
-   "search_index": 1,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "search_index": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
    "columns": 3,
    "fieldname": "item_name",
    "fieldtype": "Data",
-   "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": "Item Name",
-   "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
+   "label": "Item Name"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "operation",
    "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": "Item operation",
-   "length": 0,
-   "no_copy": 0,
-   "options": "Operation",
-   "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
+   "options": "Operation"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "column_break_3",
-   "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
+   "fieldtype": "Column Break"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "bom_no",
    "fieldtype": "Link",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
    "in_filter": 1,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "BOM No",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "bom_no",
    "oldfieldtype": "Link",
    "options": "BOM",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "150px",
-   "read_only": 0,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
    "search_index": 1,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "150px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "source_warehouse",
    "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": "Source Warehouse",
-   "length": 0,
-   "no_copy": 0,
-   "options": "Warehouse",
-   "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
+   "options": "Warehouse"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
    "collapsible": 1,
-   "columns": 0,
    "fieldname": "section_break_5",
    "fieldtype": "Section 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,
-   "label": "Description",
-   "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
+   "label": "Description"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "description",
    "fieldtype": "Text Editor",
-   "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": "Item Description",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "description",
    "oldfieldtype": "Text",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "250px",
-   "read_only": 0,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "250px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "col_break1",
-   "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,
-   "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
+   "fieldtype": "Column Break"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "image",
    "fieldtype": "Attach",
    "hidden": 1,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "Image",
-   "length": 0,
-   "no_copy": 0,
-   "permlevel": 0,
-   "precision": "",
-   "print_hide": 1,
-   "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
+   "print_hide": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "image_view",
    "fieldtype": "Image",
-   "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": "Image View",
-   "length": 0,
-   "no_copy": 0,
-   "options": "image",
-   "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
+   "options": "image"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "quantity_and_rate",
    "fieldtype": "Section 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,
-   "label": "Quantity and Rate",
-   "length": 0,
-   "no_copy": 0,
-   "permlevel": 0,
-   "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
+   "label": "Quantity and Rate"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
    "columns": 2,
    "fieldname": "qty",
    "fieldtype": "Float",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
    "in_list_view": 1,
-   "in_standard_filter": 0,
    "label": "Qty",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "qty",
    "oldfieldtype": "Currency",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 0,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 1,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "reqd": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
    "columns": 1,
    "fieldname": "uom",
    "fieldtype": "Link",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
    "in_list_view": 1,
-   "in_standard_filter": 0,
    "label": "UOM",
-   "length": 0,
-   "no_copy": 0,
    "options": "UOM",
-   "permlevel": 0,
-   "precision": "",
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 0,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 1,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "reqd": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "col_break2",
-   "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,
-   "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
+   "fieldtype": "Column Break"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "stock_qty",
    "fieldtype": "Float",
-   "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": "Stock Qty",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "stock_qty",
    "oldfieldtype": "Currency",
-   "permlevel": 0,
-   "precision": "",
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "stock_uom",
    "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": "Stock UOM",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "stock_uom",
    "oldfieldtype": "Data",
    "options": "UOM",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "conversion_factor",
    "fieldtype": "Float",
-   "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": "Conversion Factor",
-   "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
+   "label": "Conversion Factor"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "rate_amount_section",
    "fieldtype": "Section 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,
-   "label": "Rate & Amount",
-   "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
+   "label": "Rate & Amount"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
-   "description": "",
    "fieldname": "rate",
    "fieldtype": "Currency",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
    "in_list_view": 1,
-   "in_standard_filter": 0,
    "label": "Rate",
-   "length": 0,
-   "no_copy": 0,
    "options": "currency",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 0,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 1,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "reqd": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "base_rate",
    "fieldtype": "Currency",
-   "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": "Basic Rate (Company Currency)",
-   "length": 0,
-   "no_copy": 0,
    "options": "Company:company:default_currency",
-   "permlevel": 0,
-   "precision": "",
    "print_hide": 1,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "column_break_21",
-   "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
+   "fieldtype": "Column Break"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "amount",
    "fieldtype": "Currency",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
    "in_list_view": 1,
-   "in_standard_filter": 0,
    "label": "Amount",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "amount_as_per_mar",
    "oldfieldtype": "Currency",
    "options": "currency",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "150px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "150px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "base_amount",
    "fieldtype": "Currency",
-   "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": "Amount (Company Currency)",
-   "length": 0,
-   "no_copy": 0,
    "options": "Company:company:default_currency",
-   "permlevel": 0,
-   "precision": "",
    "print_hide": 1,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "section_break_18",
-   "fieldtype": "Section 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
+   "fieldtype": "Section Break"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
    "columns": 1,
    "fieldname": "scrap",
    "fieldtype": "Float",
-   "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": "Scrap %",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "scrap",
    "oldfieldtype": "Currency",
-   "permlevel": 0,
-   "print_hide": 1,
-   "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
+   "print_hide": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "qty_consumed_per_unit",
    "fieldtype": "Float",
    "hidden": 1,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "Qty Consumed Per Unit",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "qty_consumed_per_unit",
    "oldfieldtype": "Float",
-   "permlevel": 0,
    "print_hide": 1,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "section_break_27",
-   "fieldtype": "Section 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
+   "fieldtype": "Section Break"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
+   "default": "0",
    "fieldname": "allow_alternative_item",
    "fieldtype": "Check",
-   "hidden": 1,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
-   "label": "Allow Alternative Item",
-   "length": 0,
-   "no_copy": 0,
-   "permlevel": 0,
-   "precision": "",
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "label": "Allow Alternative Item"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
+   "default": "0",
    "fetch_from": "item_code.include_item_in_manufacturing",
    "fieldname": "include_item_in_manufacturing",
    "fieldtype": "Check",
-   "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": "Include Item In Manufacturing",
-   "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
+   "label": "Include Item In Manufacturing"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "original_item",
    "fieldtype": "Link",
    "hidden": 1,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "Original Item",
-   "length": 0,
-   "no_copy": 0,
    "options": "Item",
-   "permlevel": 0,
-   "precision": "",
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   }
  ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
  "idx": 1,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
  "istable": 1,
- "max_attachments": 0,
- "modified": "2019-02-21 19:19:54.872459",
+ "modified": "2019-11-22 11:38:52.087303",
  "modified_by": "Administrator",
  "module": "Manufacturing",
  "name": "BOM Item",
  "owner": "Administrator",
  "permissions": [],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
  "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0,
- "track_views": 0
+ "sort_order": "DESC"
 }
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py b/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py
index 2ca4d16..31a9fdb 100644
--- a/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py
+++ b/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py
@@ -9,6 +9,7 @@
 from six import string_types
 from erpnext.manufacturing.doctype.bom.bom import get_boms_in_bottom_up_order
 from frappe.model.document import Document
+import click
 
 class BOMUpdateTool(Document):
 	def replace_bom(self):
@@ -17,7 +18,8 @@
 		frappe.cache().delete_key('bom_children')
 		bom_list = self.get_parent_boms(self.new_bom)
 		updated_bom = []
-
+		with click.progressbar(bom_list) as bom_list:
+			pass
 		for bom in bom_list:
 			try:
 				bom_obj = frappe.get_cached_doc('BOM', bom)
diff --git a/erpnext/manufacturing/doctype/job_card/job_card.json b/erpnext/manufacturing/doctype/job_card/job_card.json
index 39c5cce..2c21702 100644
--- a/erpnext/manufacturing/doctype/job_card/job_card.json
+++ b/erpnext/manufacturing/doctype/job_card/job_card.json
@@ -1,1071 +1,299 @@
 {
- "allow_copy": 0, 
- "allow_events_in_timeline": 0, 
- "allow_guest_to_view": 0, 
- "allow_import": 0, 
- "allow_rename": 0, 
- "autoname": "PO-JOB.#####", 
- "beta": 0, 
- "creation": "2018-07-09 17:23:29.518745", 
- "custom": 0, 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "", 
- "editable_grid": 1, 
- "engine": "InnoDB", 
+ "autoname": "naming_series:",
+ "creation": "2018-07-09 17:23:29.518745",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "naming_series",
+  "work_order",
+  "bom_no",
+  "workstation",
+  "operation",
+  "column_break_4",
+  "posting_date",
+  "company",
+  "for_quantity",
+  "wip_warehouse",
+  "timing_detail",
+  "employee",
+  "time_logs",
+  "section_break_13",
+  "total_completed_qty",
+  "total_time_in_mins",
+  "column_break_15",
+  "section_break_8",
+  "items",
+  "more_information",
+  "operation_id",
+  "transferred_qty",
+  "requested_qty",
+  "project",
+  "remarks",
+  "column_break_20",
+  "status",
+  "job_started",
+  "started_time",
+  "amended_from"
+ ],
  "fields": [
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "work_order", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Work Order", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Work Order", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 1, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "work_order",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Work Order",
+   "options": "Work Order",
+   "read_only": 1,
+   "reqd": 1,
+   "search_index": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "bom_no", 
-   "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": "BOM No", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "BOM", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "bom_no",
+   "fieldtype": "Link",
+   "label": "BOM No",
+   "options": "BOM",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "workstation", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Workstation", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Workstation", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "workstation",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Workstation",
+   "options": "Workstation",
+   "reqd": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "operation", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Operation", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Operation", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "operation",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Operation",
+   "options": "Operation",
+   "reqd": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "column_break_4", 
-   "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
-  }, 
+   "fieldname": "column_break_4",
+   "fieldtype": "Column Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "default": "Today", 
-   "fetch_if_empty": 0, 
-   "fieldname": "posting_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": "Posting 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
-  }, 
+   "default": "Today",
+   "fieldname": "posting_date",
+   "fieldtype": "Date",
+   "label": "Posting Date"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 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": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "company",
+   "fieldtype": "Link",
+   "label": "Company",
+   "options": "Company",
+   "reqd": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "for_quantity", 
-   "fieldtype": "Float", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "For Quantity", 
-   "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": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "for_quantity",
+   "fieldtype": "Float",
+   "in_list_view": 1,
+   "label": "For Quantity",
+   "reqd": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "wip_warehouse", 
-   "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": "WIP Warehouse", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Warehouse", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "wip_warehouse",
+   "fieldtype": "Link",
+   "label": "WIP Warehouse",
+   "options": "Warehouse",
+   "reqd": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "timing_detail", 
-   "fieldtype": "Section 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, 
-   "label": "Timing Detail", 
-   "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
-  }, 
+   "fieldname": "timing_detail",
+   "fieldtype": "Section Break",
+   "label": "Timing Detail"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "employee", 
-   "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": "Employee", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Employee", 
-   "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
-  }, 
+   "fieldname": "employee",
+   "fieldtype": "Link",
+   "label": "Employee",
+   "options": "Employee"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "time_logs", 
-   "fieldtype": "Table", 
-   "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": "Time Logs", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Job Card Time Log", 
-   "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
-  }, 
+   "fieldname": "time_logs",
+   "fieldtype": "Table",
+   "label": "Time Logs",
+   "options": "Job Card Time Log"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "section_break_13", 
-   "fieldtype": "Section 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
-  }, 
+   "fieldname": "section_break_13",
+   "fieldtype": "Section Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "total_completed_qty", 
-   "fieldtype": "Float", 
-   "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": "Total Completed Qty", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "total_completed_qty",
+   "fieldtype": "Float",
+   "label": "Total Completed Qty",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "column_break_15", 
-   "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
-  }, 
+   "fieldname": "column_break_15",
+   "fieldtype": "Column Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "total_time_in_mins", 
-   "fieldtype": "Float", 
-   "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": "Total Time in Mins", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "total_time_in_mins",
+   "fieldtype": "Float",
+   "label": "Total Time in Mins",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "section_break_8", 
-   "fieldtype": "Section 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, 
-   "label": "Raw Materials", 
-   "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
-  }, 
+   "fieldname": "section_break_8",
+   "fieldtype": "Section Break",
+   "label": "Raw Materials"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "items", 
-   "fieldtype": "Table", 
-   "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": "Items", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Job Card Item", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "items",
+   "fieldtype": "Table",
+   "label": "Items",
+   "options": "Job Card Item",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 1, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "more_information", 
-   "fieldtype": "Section 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, 
-   "label": "More Information", 
-   "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
-  }, 
+   "collapsible": 1,
+   "fieldname": "more_information",
+   "fieldtype": "Section Break",
+   "label": "More Information"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "operation_id", 
-   "fieldtype": "Data", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Operation ID", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "operation_id",
+   "fieldtype": "Data",
+   "hidden": 1,
+   "label": "Operation ID",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "default": "0", 
-   "fetch_if_empty": 0, 
-   "fieldname": "transferred_qty", 
-   "fieldtype": "Float", 
-   "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": "Transferred Qty", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "default": "0",
+   "fieldname": "transferred_qty",
+   "fieldtype": "Float",
+   "label": "Transferred Qty",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "default": "0", 
-   "fetch_if_empty": 0, 
-   "fieldname": "requested_qty", 
-   "fieldtype": "Float", 
-   "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": "Requested Qty", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "default": "0",
+   "fieldname": "requested_qty",
+   "fieldtype": "Float",
+   "label": "Requested Qty",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "project", 
-   "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": "Project", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Project", 
-   "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
-  }, 
+   "fieldname": "project",
+   "fieldtype": "Link",
+   "label": "Project",
+   "options": "Project"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "remarks", 
-   "fieldtype": "Small Text", 
-   "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": "Remarks", 
-   "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
-  }, 
+   "fieldname": "remarks",
+   "fieldtype": "Small Text",
+   "label": "Remarks"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "column_break_20", 
-   "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
-  }, 
+   "fieldname": "column_break_20",
+   "fieldtype": "Column Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "default": "Open", 
-   "fetch_if_empty": 0, 
-   "fieldname": "status", 
-   "fieldtype": "Select", 
-   "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": "Status", 
-   "length": 0, 
-   "no_copy": 1, 
-   "options": "Open\nWork In Progress\nMaterial Transferred\nSubmitted\nCancelled\nCompleted", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "default": "Open",
+   "fieldname": "status",
+   "fieldtype": "Select",
+   "label": "Status",
+   "no_copy": 1,
+   "options": "Open\nWork In Progress\nMaterial Transferred\nSubmitted\nCancelled\nCompleted",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "job_started", 
-   "fieldtype": "Check", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Job Started", 
-   "length": 0, 
-   "no_copy": 1, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 1, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "default": "0",
+   "fieldname": "job_started",
+   "fieldtype": "Check",
+   "hidden": 1,
+   "label": "Job Started",
+   "no_copy": 1,
+   "print_hide": 1,
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "started_time", 
-   "fieldtype": "Datetime", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Started Time", 
-   "length": 0, 
-   "no_copy": 1, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 1, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "started_time",
+   "fieldtype": "Datetime",
+   "hidden": 1,
+   "label": "Started Time",
+   "no_copy": 1,
+   "print_hide": 1,
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fetch_if_empty": 0, 
-   "fieldname": "amended_from", 
-   "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": "Amended From", 
-   "length": 0, 
-   "no_copy": 1, 
-   "options": "Job Card", 
-   "permlevel": 0, 
-   "print_hide": 1, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
+   "fieldname": "amended_from",
+   "fieldtype": "Link",
+   "label": "Amended From",
+   "no_copy": 1,
+   "options": "Job Card",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "default": "PO-JOB.#####",
+   "fieldname": "naming_series",
+   "fieldtype": "Select",
+   "label": "Naming Series",
+   "options": "PO-JOB.#####",
+   "reqd": 1
   }
- ], 
- "has_web_view": 0, 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "idx": 0, 
- "image_view": 0, 
- "in_create": 0, 
- "is_submittable": 1, 
- "issingle": 0, 
- "istable": 0, 
- "max_attachments": 0, 
- "modified": "2019-03-10 17:38:37.499871", 
- "modified_by": "Administrator", 
- "module": "Manufacturing", 
- "name": "Job Card", 
- "name_case": "", 
- "owner": "Administrator", 
+ ],
+ "is_submittable": 1,
+ "modified": "2019-10-30 01:49:19.606178",
+ "modified_by": "Administrator",
+ "module": "Manufacturing",
+ "name": "Job Card",
+ "owner": "Administrator",
  "permissions": [
   {
-   "amend": 1, 
-   "cancel": 1, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 1, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "System Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 1, 
+   "amend": 1,
+   "cancel": 1,
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "System Manager",
+   "share": 1,
+   "submit": 1,
    "write": 1
-  }, 
+  },
   {
-   "amend": 1, 
-   "cancel": 1, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 1, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Manufacturing User", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 1, 
+   "amend": 1,
+   "cancel": 1,
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Manufacturing User",
+   "share": 1,
+   "submit": 1,
    "write": 1
-  }, 
+  },
   {
-   "amend": 1, 
-   "cancel": 1, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 1, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Manufacturing Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 1, 
+   "amend": 1,
+   "cancel": 1,
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Manufacturing Manager",
+   "share": 1,
+   "submit": 1,
    "write": 1
   }
- ], 
- "quick_entry": 1, 
- "read_only": 0, 
- "read_only_onload": 0, 
- "show_name_in_global_search": 0, 
- "sort_field": "modified", 
- "sort_order": "DESC", 
- "title_field": "operation", 
- "track_changes": 1, 
- "track_seen": 0, 
- "track_views": 0
+ ],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "title_field": "operation",
+ "track_changes": 1
 }
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py
index 9d2e620..e8787ed 100644
--- a/erpnext/manufacturing/doctype/job_card/job_card.py
+++ b/erpnext/manufacturing/doctype/job_card/job_card.py
@@ -4,10 +4,16 @@
 
 from __future__ import unicode_literals
 import frappe
+import datetime
 from frappe import _
-from frappe.utils import flt, time_diff_in_hours, get_datetime
 from frappe.model.mapper import get_mapped_doc
 from frappe.model.document import Document
+from frappe.utils import (flt, cint, time_diff_in_hours, get_datetime, getdate, 
+	get_time, add_to_date, time_diff, add_days, get_datetime_str)
+
+from erpnext.manufacturing.doctype.manufacturing_settings.manufacturing_settings import get_mins_between_operations
+
+class OverlapError(frappe.ValidationError): pass
 
 class JobCard(Document):
 	def validate(self):
@@ -26,7 +32,7 @@
 				data = self.get_overlap_for(d)
 				if data:
 					frappe.throw(_("Row {0}: From Time and To Time of {1} is overlapping with {2}")
-						.format(d.idx, self.name, data.name))
+						.format(d.idx, self.name, data.name), OverlapError)
 
 				if d.from_time and d.to_time:
 					d.time_in_mins = time_diff_in_hours(d.to_time, d.from_time) * 60
@@ -35,27 +41,120 @@
 				if d.completed_qty:
 					self.total_completed_qty += d.completed_qty
 
-	def get_overlap_for(self, args):
-		existing = frappe.db.sql("""select jc.name as name from
+	def get_overlap_for(self, args, check_next_available_slot=False):
+		production_capacity = 1
+	
+		if self.workstation:
+			production_capacity = frappe.get_cached_value("Workstation",
+				self.workstation, 'production_capacity') or 1
+			validate_overlap_for = " and jc.workstation = %(workstation)s "
+
+		if self.employee:
+			# override capacity for employee
+			production_capacity = 1
+			validate_overlap_for = " and jc.employee = %(employee)s "
+
+		extra_cond = ''
+		if check_next_available_slot:
+			extra_cond = " or (%(from_time)s <= jctl.from_time and %(to_time)s <= jctl.to_time)"
+
+		existing = frappe.db.sql("""select jc.name as name, jctl.to_time from
 			`tabJob Card Time Log` jctl, `tabJob Card` jc where jctl.parent = jc.name and
 			(
 				(%(from_time)s > jctl.from_time and %(from_time)s < jctl.to_time) or
 				(%(to_time)s > jctl.from_time and %(to_time)s < jctl.to_time) or
-				(%(from_time)s <= jctl.from_time and %(to_time)s >= jctl.to_time))
-			and jctl.name!=%(name)s
-			and jc.name!=%(parent)s
-			and jc.docstatus < 2
-			and jc.employee = %(employee)s """,
+				(%(from_time)s <= jctl.from_time and %(to_time)s >= jctl.to_time) {0}
+			)
+			and jctl.name != %(name)s and jc.name != %(parent)s and jc.docstatus < 2 {1}
+			order by jctl.to_time desc limit 1""".format(extra_cond, validate_overlap_for),
 			{
 				"from_time": args.from_time,
 				"to_time": args.to_time,
 				"name": args.name or "No Name",
 				"parent": args.parent or "No Name",
-				"employee": self.employee
+				"employee": self.employee,
+				"workstation": self.workstation
 			}, as_dict=True)
 
+		if existing and production_capacity > len(existing):
+			return
+
 		return existing[0] if existing else None
 
+	def schedule_time_logs(self, row):
+		row.remaining_time_in_mins = row.time_in_mins
+		while row.remaining_time_in_mins > 0:
+			args = frappe._dict({
+				"from_time": row.planned_start_time,
+				"to_time": row.planned_end_time
+			})
+
+			self.validate_overlap_for_workstation(args, row)
+			self.check_workstation_time(row)
+
+	def validate_overlap_for_workstation(self, args, row):
+		# get the last record based on the to time from the job card
+		data = self.get_overlap_for(args, check_next_available_slot=True)
+		if data:
+			row.planned_start_time = get_datetime(data.to_time + get_mins_between_operations())
+
+	def check_workstation_time(self, row):
+		workstation_doc = frappe.get_cached_doc("Workstation", self.workstation)
+		if (not workstation_doc.working_hours or
+			cint(frappe.db.get_single_value("Manufacturing Settings", "allow_overtime"))):
+			row.remaining_time_in_mins -= time_diff_in_minutes(row.planned_end_time,
+				row.planned_start_time)
+
+			self.update_time_logs(row)
+			return
+
+		start_date = getdate(row.planned_start_time)
+		start_time = get_time(row.planned_start_time)
+
+		new_start_date = workstation_doc.validate_workstation_holiday(start_date)
+
+		if new_start_date != start_date:
+			row.planned_start_time = datetime.datetime.combine(new_start_date, start_time)
+			start_date = new_start_date
+
+		total_idx = len(workstation_doc.working_hours)
+
+		for i, time_slot in enumerate(workstation_doc.working_hours):
+			workstation_start_time = datetime.datetime.combine(start_date, get_time(time_slot.start_time))
+			workstation_end_time = datetime.datetime.combine(start_date, get_time(time_slot.end_time))
+
+			if (get_datetime(row.planned_start_time) >= workstation_start_time and
+				get_datetime(row.planned_start_time) <= workstation_end_time):
+				time_in_mins = time_diff_in_minutes(workstation_end_time, row.planned_start_time)
+
+				# If remaining time fit in workstation time logs else split hours as per workstation time
+				if time_in_mins > row.remaining_time_in_mins:
+					row.planned_end_time = add_to_date(row.planned_start_time,
+						minutes=row.remaining_time_in_mins)
+					row.remaining_time_in_mins = 0
+				else:
+					row.planned_end_time = add_to_date(row.planned_start_time, minutes=time_in_mins)
+					row.remaining_time_in_mins -= time_in_mins
+
+				self.update_time_logs(row)
+
+				if total_idx != (i+1) and row.remaining_time_in_mins > 0:
+					row.planned_start_time = datetime.datetime.combine(start_date,
+						get_time(workstation_doc.working_hours[i+1].start_time))
+
+		if row.remaining_time_in_mins > 0:
+			start_date = add_days(start_date, 1)
+			row.planned_start_time = datetime.datetime.combine(start_date,
+				get_time(workstation_doc.working_hours[0].start_time))
+
+	def update_time_logs(self, row):
+		self.append("time_logs", {
+			"from_time": row.planned_start_time,
+			"to_time": row.planned_end_time,
+			"completed_qty": 0,
+			"time_in_mins": time_diff_in_minutes(row.planned_end_time, row.planned_start_time),
+		})
+
 	def get_required_items(self):
 		if not self.get('work_order'):
 			return
@@ -251,3 +350,6 @@
 	}, target_doc, set_missing_values)
 
 	return doclist
+
+def time_diff_in_minutes(string_ed_date, string_st_date):
+	return time_diff(string_ed_date, string_st_date).total_seconds() / 60
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json b/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json
index 461b9ab..86fa7a8 100644
--- a/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json
+++ b/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json
@@ -1,585 +1,178 @@
 {
- "allow_copy": 0, 
- "allow_guest_to_view": 0, 
- "allow_import": 0, 
- "allow_rename": 0, 
- "beta": 0, 
- "creation": "2014-11-27 14:12:07.542534", 
- "custom": 0, 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "Document", 
- "editable_grid": 0, 
- "engine": "InnoDB", 
+ "creation": "2014-11-27 14:12:07.542534",
+ "doctype": "DocType",
+ "document_type": "Document",
+ "engine": "InnoDB",
+ "field_order": [
+  "raw_materials_consumption_section",
+  "material_consumption",
+  "column_break_3",
+  "backflush_raw_materials_based_on",
+  "capacity_planning",
+  "disable_capacity_planning",
+  "allow_overtime",
+  "allow_production_on_holidays",
+  "column_break_5",
+  "capacity_planning_for_days",
+  "mins_between_operations",
+  "section_break_6",
+  "default_wip_warehouse",
+  "default_fg_warehouse",
+  "column_break_11",
+  "default_scrap_warehouse",
+  "over_production_for_sales_and_work_order_section",
+  "overproduction_percentage_for_sales_order",
+  "column_break_16",
+  "overproduction_percentage_for_work_order",
+  "other_settings_section",
+  "update_bom_costs_automatically"
+ ],
  "fields": [
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "capacity_planning", 
-   "fieldtype": "Section 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, 
-   "label": "Capacity Planning", 
-   "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
-  }, 
+   "fieldname": "capacity_planning",
+   "fieldtype": "Section Break",
+   "label": "Capacity Planning"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "Disables creation of time logs against Work Orders. Operations shall not be tracked against Work Order", 
-   "fieldname": "disable_capacity_planning", 
-   "fieldtype": "Check", 
-   "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": "Disable Capacity Planning and Time Tracking", 
-   "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
-  }, 
+   "default": "0",
+   "depends_on": "eval:!doc.disable_capacity_planning",
+   "description": "Plan time logs outside Workstation Working Hours.",
+   "fieldname": "allow_overtime",
+   "fieldtype": "Check",
+   "label": "Allow Overtime"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "Plan time logs outside Workstation Working Hours.", 
-   "fieldname": "allow_overtime", 
-   "fieldtype": "Check", 
-   "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": "Allow Overtime", 
-   "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
-  }, 
+   "default": "0",
+   "depends_on": "eval:!doc.disable_capacity_planning",
+   "fieldname": "allow_production_on_holidays",
+   "fieldtype": "Check",
+   "in_list_view": 1,
+   "label": "Allow Production on Holidays"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "default": "", 
-   "fieldname": "allow_production_on_holidays", 
-   "fieldtype": "Check", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Allow Production on Holidays", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "", 
-   "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
-  }, 
+   "fieldname": "column_break_3",
+   "fieldtype": "Column Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "column_break_3", 
-   "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
-  }, 
+   "default": "30",
+   "depends_on": "eval:!doc.disable_capacity_planning",
+   "description": "Try planning operations for X days in advance.",
+   "fieldname": "capacity_planning_for_days",
+   "fieldtype": "Int",
+   "label": "Capacity Planning For (Days)"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "default": "30", 
-   "description": "Try planning operations for X days in advance.", 
-   "fieldname": "capacity_planning_for_days", 
-   "fieldtype": "Int", 
-   "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": "Capacity Planning For (Days)", 
-   "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
-  }, 
+   "depends_on": "eval:!doc.disable_capacity_planning",
+   "description": "Default 10 mins",
+   "fieldname": "mins_between_operations",
+   "fieldtype": "Int",
+   "label": "Time Between Operations (in mins)"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "Default 10 mins", 
-   "fieldname": "mins_between_operations", 
-   "fieldtype": "Int", 
-   "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": "Time Between Operations (in mins)", 
-   "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
-  }, 
+   "fieldname": "section_break_6",
+   "fieldtype": "Section Break",
+   "label": "Default Warehouses for Production"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "section_break_6", 
-   "fieldtype": "Section 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
-  }, 
+   "fieldname": "overproduction_percentage_for_sales_order",
+   "fieldtype": "Percent",
+   "label": "Overproduction Percentage For Sales Order"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "overproduction_percentage_for_sales_order", 
-   "fieldtype": "Percent", 
-   "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": "Overproduction Percentage For Sales Order", 
-   "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
-  }, 
+   "fieldname": "overproduction_percentage_for_work_order",
+   "fieldtype": "Percent",
+   "label": "Overproduction Percentage For Work Order"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "overproduction_percentage_for_work_order", 
-   "fieldtype": "Percent", 
-   "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": "Overproduction Percentage For Work Order", 
-   "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
-  }, 
+   "default": "BOM",
+   "fieldname": "backflush_raw_materials_based_on",
+   "fieldtype": "Select",
+   "label": "Backflush Raw Materials Based On",
+   "options": "BOM\nMaterial Transferred for Manufacture"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "default": "BOM", 
-   "fieldname": "backflush_raw_materials_based_on", 
-   "fieldtype": "Select", 
-   "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": "Backflush Raw Materials Based On", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "BOM\nMaterial Transferred for Manufacture", 
-   "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
-  }, 
+   "default": "0",
+   "description": "Allow multiple Material Consumption against a Work Order",
+   "fieldname": "material_consumption",
+   "fieldtype": "Check",
+   "label": "Allow Multiple Material Consumption"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "Allow multiple Material Consumption against a Work Order", 
-   "fieldname": "material_consumption", 
-   "fieldtype": "Check", 
-   "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": "Allow Multiple Material Consumption", 
-   "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
-  }, 
+   "default": "0",
+   "description": "Update BOM cost automatically via Scheduler, based on latest valuation rate / price list rate / last purchase rate of raw materials.",
+   "fieldname": "update_bom_costs_automatically",
+   "fieldtype": "Check",
+   "label": "Update BOM Cost Automatically"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "Update BOM cost automatically via Scheduler, based on latest valuation rate / price list rate / last purchase rate of raw materials.", 
-   "fieldname": "update_bom_costs_automatically", 
-   "fieldtype": "Check", 
-   "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": "Update BOM Cost Automatically", 
-   "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
-  }, 
+   "fieldname": "column_break_11",
+   "fieldtype": "Column Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "column_break_11", 
-   "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
-  }, 
+   "fieldname": "default_wip_warehouse",
+   "fieldtype": "Link",
+   "label": "Default Work In Progress Warehouse",
+   "options": "Warehouse"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "default_wip_warehouse", 
-   "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": "Default Work In Progress Warehouse", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Warehouse", 
-   "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
-  }, 
+   "fieldname": "default_fg_warehouse",
+   "fieldtype": "Link",
+   "label": "Default Finished Goods Warehouse",
+   "options": "Warehouse"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "default_fg_warehouse", 
-   "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": "Default Finished Goods Warehouse", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Warehouse", 
-   "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
+   "default": "0",
+   "fieldname": "disable_capacity_planning",
+   "fieldtype": "Check",
+   "label": "Disable Capacity Planning"
+  },
+  {
+   "fieldname": "default_scrap_warehouse",
+   "fieldtype": "Link",
+   "label": "Default Scrap Warehouse",
+   "options": "Warehouse"
+  },
+  {
+   "fieldname": "over_production_for_sales_and_work_order_section",
+   "fieldtype": "Section Break",
+   "label": "Over Production for Sales and Work Order"
+  },
+  {
+   "fieldname": "raw_materials_consumption_section",
+   "fieldtype": "Section Break",
+   "label": "Raw Materials Consumption"
+  },
+  {
+   "fieldname": "column_break_16",
+   "fieldtype": "Column Break"
+  },
+  {
+   "fieldname": "other_settings_section",
+   "fieldtype": "Section Break",
+   "label": "Other Settings"
+  },
+  {
+   "fieldname": "column_break_5",
+   "fieldtype": "Column Break"
   }
- ], 
- "has_web_view": 0, 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "icon": "icon-wrench", 
- "idx": 0, 
- "image_view": 0, 
- "in_create": 0, 
- "is_submittable": 0, 
- "issingle": 1, 
- "istable": 0, 
- "max_attachments": 0, 
- "menu_index": 0, 
- "modified": "2018-05-28 00:46:25.310621", 
- "modified_by": "Administrator", 
- "module": "Manufacturing", 
- "name": "Manufacturing Settings", 
- "name_case": "", 
- "owner": "Administrator", 
+ ],
+ "icon": "icon-wrench",
+ "issingle": 1,
+ "modified": "2019-11-26 13:10:45.569341",
+ "modified_by": "Administrator",
+ "module": "Manufacturing",
+ "name": "Manufacturing Settings",
+ "owner": "Administrator",
  "permissions": [
   {
-   "amend": 0, 
-   "cancel": 0, 
-   "create": 1, 
-   "delete": 0, 
-   "email": 0, 
-   "export": 0, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 0, 
-   "read": 1, 
-   "report": 0, 
-   "role": "Manufacturing Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 0, 
+   "create": 1,
+   "read": 1,
+   "role": "Manufacturing Manager",
+   "share": 1,
    "write": 1
   }
- ], 
- "quick_entry": 0, 
- "read_only": 0, 
- "read_only_onload": 0, 
- "show_name_in_global_search": 0, 
- "sort_field": "modified", 
- "sort_order": "DESC", 
- "track_changes": 1, 
- "track_seen": 0
+ ],
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
 }
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.py b/erpnext/manufacturing/doctype/production_plan/production_plan.py
index 5d26969..8876253 100644
--- a/erpnext/manufacturing/doctype/production_plan/production_plan.py
+++ b/erpnext/manufacturing/doctype/production_plan/production_plan.py
@@ -529,7 +529,6 @@
 		required_qty = ceil(required_qty)
 
 	if required_qty > 0:
-		print(row)
 		return {
 			'item_code': row.item_code,
 			'item_name': row.item_name,
@@ -616,6 +615,9 @@
 
 	doc['mr_items'] = []
 	po_items = doc.get('po_items') if doc.get('po_items') else doc.get('items')
+	if not po_items:
+		frappe.throw(_("Items are required to pull the raw materials which is associated with it."))
+
 	company = doc.get('company')
 	warehouse = doc.get('for_warehouse')
 
diff --git a/erpnext/manufacturing/doctype/work_order/test_work_order.py b/erpnext/manufacturing/doctype/work_order/test_work_order.py
index ea2e7a9..0a8f41f 100644
--- a/erpnext/manufacturing/doctype/work_order/test_work_order.py
+++ b/erpnext/manufacturing/doctype/work_order/test_work_order.py
@@ -5,10 +5,10 @@
 from __future__ import unicode_literals
 import unittest
 import frappe
-from frappe.utils import flt, time_diff_in_hours, now, add_days, cint
+from frappe.utils import flt, time_diff_in_hours, now, add_months, cint, today
 from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
-from erpnext.manufacturing.doctype.work_order.work_order \
-	import make_stock_entry, ItemHasVariantError, stop_unstop, StockOverProductionError, OverProductionError
+from erpnext.manufacturing.doctype.work_order.work_order import (make_stock_entry, 
+	ItemHasVariantError, stop_unstop, StockOverProductionError, OverProductionError, CapacityError)
 from erpnext.stock.doctype.stock_entry import test_stock_entry
 from erpnext.stock.utils import get_bin
 from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
@@ -307,14 +307,50 @@
 			{'docstatus': 1, 'with_operations': 1, 'company': '_Test Company'}, ['name', 'item'])
 
 		if data:
+			frappe.db.set_value("Manufacturing Settings",
+				None, "disable_capacity_planning", 0)
+
 			bom, bom_item = data
 
 			bom_doc = frappe.get_doc('BOM', bom)
 			work_order = make_wo_order_test_record(item=bom_item, qty=1, bom_no=bom)
+			self.assertTrue(work_order.planned_end_date)
 
 			job_cards = frappe.get_all('Job Card', filters = {'work_order': work_order.name})
 			self.assertEqual(len(job_cards), len(bom_doc.operations))
 
+	def test_capcity_planning(self):
+		frappe.db.set_value("Manufacturing Settings", None, {
+			"disable_capacity_planning": 0,
+			"capacity_planning_for_days": 1
+		})
+
+		data = frappe.get_cached_value('BOM', {'docstatus': 1, 'item': '_Test FG Item 2',
+			'with_operations': 1, 'company': '_Test Company'}, ['name', 'item'])
+
+		if data:
+			bom, bom_item = data
+
+			planned_start_date = add_months(today(), months=-1)
+			work_order = make_wo_order_test_record(item=bom_item,
+				qty=10, bom_no=bom, planned_start_date=planned_start_date)
+
+			work_order1 = make_wo_order_test_record(item=bom_item,
+				qty=30, bom_no=bom, planned_start_date=planned_start_date, do_not_submit=1)
+
+			self.assertRaises(CapacityError, work_order1.submit)
+
+			frappe.db.set_value("Manufacturing Settings", None, {
+				"capacity_planning_for_days": 30
+			})
+
+			work_order1.reload()
+			work_order1.submit()
+			self.assertTrue(work_order1.docstatus, 1)
+
+			work_order1.cancel()
+			work_order.cancel()
+
 	def test_work_order_with_non_transfer_item(self):
 		items = {'Finished Good Transfer Item': 1, '_Test FG Item': 1, '_Test FG Item 1': 0}
 		for item, allow_transfer in items.items():
@@ -371,14 +407,12 @@
 	wo_order.skip_transfer=1
 	wo_order.get_items_and_operations_from_bom()
 	wo_order.sales_order = args.sales_order or None
+	wo_order.planned_start_date = args.planned_start_date or now()
 
 	if args.source_warehouse:
 		for item in wo_order.get("required_items"):
 			item.source_warehouse = args.source_warehouse
 
-	if args.planned_start_date:
-		wo_order.planned_start_date = args.planned_start_date
-
 	if not args.do_not_save:
 		wo_order.insert()
 
diff --git a/erpnext/manufacturing/doctype/work_order/work_order.js b/erpnext/manufacturing/doctype/work_order/work_order.js
index 107c79b..5c721c7 100644
--- a/erpnext/manufacturing/doctype/work_order/work_order.js
+++ b/erpnext/manufacturing/doctype/work_order/work_order.js
@@ -551,6 +551,7 @@
 					if (!r.exe) {
 						frm.set_value("wip_warehouse", r.message.wip_warehouse);
 						frm.set_value("fg_warehouse", r.message.fg_warehouse);
+						frm.set_value("scrap_warehouse", r.message.scrap_warehouse);
 					}
 				}
 			});
diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py
index 089cb80..ff48954 100644
--- a/erpnext/manufacturing/doctype/work_order/work_order.py
+++ b/erpnext/manufacturing/doctype/work_order/work_order.py
@@ -12,7 +12,7 @@
 from dateutil.relativedelta import relativedelta
 from erpnext.stock.doctype.item.item import validate_end_of_life
 from erpnext.manufacturing.doctype.workstation.workstation import WorkstationHolidayError
-from erpnext.projects.doctype.timesheet.timesheet import OverlapError
+from erpnext.manufacturing.doctype.job_card.job_card import OverlapError
 from erpnext.stock.doctype.stock_entry.stock_entry import get_additional_costs
 from erpnext.manufacturing.doctype.manufacturing_settings.manufacturing_settings import get_mins_between_operations
 from erpnext.stock.stock_balance import get_planned_qty, update_bin_qty
@@ -22,6 +22,7 @@
 from frappe.model.mapper import get_mapped_doc
 
 class OverProductionError(frappe.ValidationError): pass
+class CapacityError(frappe.ValidationError): pass
 class StockOverProductionError(frappe.ValidationError): pass
 class OperationTooLongError(frappe.ValidationError): pass
 class ItemHasVariantError(frappe.ValidationError): pass
@@ -260,12 +261,50 @@
 		self.update_reserved_qty_for_production()
 
 	def create_job_card(self):
-		for row in self.operations:
+		manufacturing_settings_doc = frappe.get_doc("Manufacturing Settings")
+
+		enable_capacity_planning = not cint(manufacturing_settings_doc.disable_capacity_planning)
+		plan_days = cint(manufacturing_settings_doc.capacity_planning_for_days) or 30
+
+		for i, row in enumerate(self.operations):
+			self.set_operation_start_end_time(i, row)
+
 			if not row.workstation:
 				frappe.throw(_("Row {0}: select the workstation against the operation {1}")
 					.format(row.idx, row.operation))
 
-			create_job_card(self, row, auto_create=True)
+			original_start_time = row.planned_start_time
+			job_card_doc = create_job_card(self, row,
+				enable_capacity_planning=enable_capacity_planning, auto_create=True)
+
+			if enable_capacity_planning and job_card_doc:
+				row.planned_start_time = job_card_doc.time_logs[0].from_time
+				row.planned_end_time = job_card_doc.time_logs[-1].to_time
+
+				if date_diff(row.planned_start_time, original_start_time) > plan_days:
+					frappe.throw(_("Unable to find the time slot in the next {0} days for the operation {1}.")
+						.format(plan_days, row.operation), CapacityError)
+
+				row.db_update()
+
+		planned_end_date = self.operations and self.operations[-1].planned_end_time
+		if planned_end_date:
+			self.db_set("planned_end_date", planned_end_date)
+
+	def set_operation_start_end_time(self, idx, row):
+		"""Set start and end time for given operation. If first operation, set start as
+		`planned_start_date`, else add time diff to end time of earlier operation."""
+		if idx==0:
+			# first operation at planned_start date
+			row.planned_start_time = self.planned_start_date
+		else:
+			row.planned_start_time = get_datetime(self.operations[idx-1].planned_end_time)\
+				+ get_mins_between_operations()
+
+		row.planned_end_time = get_datetime(row.planned_start_time) + relativedelta(minutes = row.time_in_mins)
+
+		if row.planned_start_time == row.planned_end_time:
+			frappe.throw(_("Capacity Planning Error, planned start time can not be same as end time"))
 
 	def validate_cancel(self):
 		if self.status == "Stopped":
@@ -327,9 +366,8 @@
 		"""Fetch operations from BOM and set in 'Work Order'"""
 		self.set('operations', [])
 
-		if not self.bom_no \
-			or cint(frappe.db.get_single_value("Manufacturing Settings", "disable_capacity_planning")):
-				return
+		if not self.bom_no:
+			return
 
 		if self.use_multi_level_bom:
 			bom_list = frappe.get_doc("BOM", self.bom_no).traverse_tree()
@@ -610,6 +648,22 @@
 	return res
 
 @frappe.whitelist()
+def make_work_order(item, qty=0, project=None):
+	if not frappe.has_permission("Work Order", "write"):
+		frappe.throw(_("Not permitted"), frappe.PermissionError)
+
+	item_details = get_item_details(item, project)
+
+	wo_doc = frappe.new_doc("Work Order")
+	wo_doc.production_item = item
+	wo_doc.update(item_details)
+	if qty > 0:
+		wo_doc.qty = qty
+		wo_doc.get_items_and_operations_from_bom()
+
+	return wo_doc
+
+@frappe.whitelist()
 def check_if_scrap_warehouse_mandatory(bom_no):
 	res = {"set_scrap_wh_mandatory": False }
 	if bom_no:
@@ -665,11 +719,13 @@
 
 @frappe.whitelist()
 def get_default_warehouse():
-	wip_warehouse = frappe.db.get_single_value("Manufacturing Settings",
-		"default_wip_warehouse")
-	fg_warehouse = frappe.db.get_single_value("Manufacturing Settings",
-		"default_fg_warehouse")
-	return {"wip_warehouse": wip_warehouse, "fg_warehouse": fg_warehouse}
+	doc = frappe.get_cached_doc("Manufacturing Settings")
+
+	return {
+		"wip_warehouse": doc.default_wip_warehouse,
+		"fg_warehouse": doc.default_fg_warehouse,
+		"scrap_warehouse": doc.default_scrap_warehouse
+	}
 
 @frappe.whitelist()
 def stop_unstop(work_order, status):
@@ -705,7 +761,7 @@
 	if row:
 		return create_job_card(work_order, row, qty)
 
-def create_job_card(work_order, row, qty=0, auto_create=False):
+def create_job_card(work_order, row, qty=0, enable_capacity_planning=False, auto_create=False):
 	doc = frappe.new_doc("Job Card")
 	doc.update({
 		'work_order': work_order.name,
@@ -725,6 +781,9 @@
 
 	if auto_create:
 		doc.flags.ignore_mandatory = True
+		if enable_capacity_planning:
+			doc.schedule_time_logs(row)
+
 		doc.insert()
 		frappe.msgprint(_("Job card {0} created").format(doc.name))
 
diff --git a/erpnext/manufacturing/doctype/workstation/workstation.json b/erpnext/manufacturing/doctype/workstation/workstation.json
index dca9891..d130391 100644
--- a/erpnext/manufacturing/doctype/workstation/workstation.json
+++ b/erpnext/manufacturing/doctype/workstation/workstation.json
@@ -1,466 +1,159 @@
 {
- "allow_copy": 0, 
- "allow_guest_to_view": 0, 
- "allow_import": 1, 
- "allow_rename": 1, 
- "autoname": "field:workstation_name", 
- "beta": 0, 
- "creation": "2013-01-10 16:34:17", 
- "custom": 0, 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "Setup", 
- "editable_grid": 0, 
+ "allow_import": 1,
+ "allow_rename": 1,
+ "autoname": "field:workstation_name",
+ "creation": "2013-01-10 16:34:17",
+ "doctype": "DocType",
+ "document_type": "Setup",
+ "field_order": [
+  "workstation_name",
+  "production_capacity",
+  "column_break_3",
+  "over_heads",
+  "hour_rate_electricity",
+  "hour_rate_consumable",
+  "column_break_11",
+  "hour_rate_rent",
+  "hour_rate_labour",
+  "hour_rate",
+  "working_hours_section",
+  "holiday_list",
+  "working_hours",
+  "workstaion_description",
+  "description"
+ ],
  "fields": [
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 1, 
-   "columns": 0, 
-   "fieldname": "description_section", 
-   "fieldtype": "Section 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, 
-   "label": "Description", 
-   "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, 
-   "unique": 0
-  }, 
+   "fieldname": "workstation_name",
+   "fieldtype": "Data",
+   "in_list_view": 1,
+   "label": "Workstation Name",
+   "oldfieldname": "workstation_name",
+   "oldfieldtype": "Data",
+   "reqd": 1,
+   "unique": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "workstation_name", 
-   "fieldtype": "Data", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Workstation Name", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "workstation_name", 
-   "oldfieldtype": "Data", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "description", 
-   "fieldtype": "Text", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Description", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "description", 
-   "oldfieldtype": "Text", 
-   "permlevel": 0, 
-   "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, 
-   "unique": 0, 
+   "fieldname": "description",
+   "fieldtype": "Text",
+   "in_list_view": 1,
+   "label": "Description",
+   "oldfieldname": "description",
+   "oldfieldtype": "Text",
    "width": "300px"
-  }, 
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "over_heads", 
-   "fieldtype": "Section 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, 
-   "label": "Operating Costs", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldtype": "Section Break", 
-   "permlevel": 0, 
-   "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, 
-   "unique": 0
-  }, 
+   "fieldname": "over_heads",
+   "fieldtype": "Section Break",
+   "label": "Operating Costs",
+   "oldfieldtype": "Section Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "per hour", 
-   "fieldname": "hour_rate_electricity", 
-   "fieldtype": "Currency", 
-   "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": "Electricity Cost", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "hour_rate_electricity", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "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, 
-   "unique": 0
-  }, 
+   "bold": 1,
+   "description": "per hour",
+   "fieldname": "hour_rate_electricity",
+   "fieldtype": "Currency",
+   "label": "Electricity Cost",
+   "oldfieldname": "hour_rate_electricity",
+   "oldfieldtype": "Currency"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "per hour", 
-   "fieldname": "hour_rate_consumable", 
-   "fieldtype": "Currency", 
-   "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": "Consumable Cost", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "hour_rate_consumable", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "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, 
-   "unique": 0
-  }, 
+   "bold": 1,
+   "description": "per hour",
+   "fieldname": "hour_rate_consumable",
+   "fieldtype": "Currency",
+   "label": "Consumable Cost",
+   "oldfieldname": "hour_rate_consumable",
+   "oldfieldtype": "Currency"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "column_break_11", 
-   "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, 
-   "unique": 0
-  }, 
+   "fieldname": "column_break_11",
+   "fieldtype": "Column Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "per hour", 
-   "fieldname": "hour_rate_rent", 
-   "fieldtype": "Currency", 
-   "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": "Rent Cost", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "hour_rate_rent", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "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, 
-   "unique": 0
-  }, 
+   "bold": 1,
+   "description": "per hour",
+   "fieldname": "hour_rate_rent",
+   "fieldtype": "Currency",
+   "label": "Rent Cost",
+   "oldfieldname": "hour_rate_rent",
+   "oldfieldtype": "Currency"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "Wages per hour", 
-   "fieldname": "hour_rate_labour", 
-   "fieldtype": "Currency", 
-   "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": "Wages", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "hour_rate_labour", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "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, 
-   "unique": 0
-  }, 
+   "bold": 1,
+   "description": "Wages per hour",
+   "fieldname": "hour_rate_labour",
+   "fieldtype": "Currency",
+   "label": "Wages",
+   "oldfieldname": "hour_rate_labour",
+   "oldfieldtype": "Currency"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "per hour", 
-   "fieldname": "hour_rate", 
-   "fieldtype": "Currency", 
-   "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": "Net Hour Rate", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "hour_rate", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
+   "description": "per hour",
+   "fieldname": "hour_rate",
+   "fieldtype": "Currency",
+   "label": "Net Hour Rate",
+   "oldfieldname": "hour_rate",
+   "oldfieldtype": "Currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "working_hours_section", 
-   "fieldtype": "Section 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, 
-   "label": "Working Hours", 
-   "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, 
-   "unique": 0
-  }, 
+   "fieldname": "working_hours_section",
+   "fieldtype": "Section Break",
+   "label": "Working Hours"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "working_hours", 
-   "fieldtype": "Table", 
-   "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": "Working Hours", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Workstation Working Hour", 
-   "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, 
-   "unique": 0
-  }, 
+   "fieldname": "working_hours",
+   "fieldtype": "Table",
+   "label": "Working Hours",
+   "options": "Workstation Working Hour"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "default": "", 
-   "fieldname": "holiday_list", 
-   "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": "Holiday List", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Holiday List", 
-   "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, 
-   "unique": 0
+   "fieldname": "holiday_list",
+   "fieldtype": "Link",
+   "label": "Holiday List",
+   "options": "Holiday List"
+  },
+  {
+   "default": "1",
+   "fieldname": "production_capacity",
+   "fieldtype": "Int",
+   "label": "Production Capacity",
+   "reqd": 1
+  },
+  {
+   "fieldname": "column_break_3",
+   "fieldtype": "Column Break"
+  },
+  {
+   "collapsible": 1,
+   "fieldname": "workstaion_description",
+   "fieldtype": "Section Break",
+   "label": "Description"
   }
- ], 
- "has_web_view": 0, 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "icon": "icon-wrench", 
- "idx": 1, 
- "image_view": 0, 
- "in_create": 0, 
- "is_submittable": 0, 
- "issingle": 0, 
- "istable": 0, 
- "max_attachments": 0, 
- "modified": "2017-07-18 22:28:50.163219", 
- "modified_by": "Administrator", 
- "module": "Manufacturing", 
- "name": "Workstation", 
- "owner": "Administrator", 
+ ],
+ "icon": "icon-wrench",
+ "idx": 1,
+ "modified": "2019-11-26 12:39:19.742052",
+ "modified_by": "Administrator",
+ "module": "Manufacturing",
+ "name": "Workstation",
+ "owner": "Administrator",
  "permissions": [
   {
-   "amend": 0, 
-   "apply_user_permissions": 0, 
-   "cancel": 0, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 0, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Manufacturing User", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 0, 
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Manufacturing User",
+   "share": 1,
    "write": 1
   }
- ], 
- "quick_entry": 1, 
- "read_only": 0, 
- "read_only_onload": 0, 
- "show_name_in_global_search": 1, 
- "sort_order": "ASC", 
- "track_changes": 1, 
- "track_seen": 0
+ ],
+ "quick_entry": 1,
+ "show_name_in_global_search": 1,
+ "sort_order": "ASC",
+ "track_changes": 1
 }
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/workstation/workstation.py b/erpnext/manufacturing/doctype/workstation/workstation.py
index f6ab72a..3512e59 100644
--- a/erpnext/manufacturing/doctype/workstation/workstation.py
+++ b/erpnext/manufacturing/doctype/workstation/workstation.py
@@ -4,7 +4,9 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
-from frappe.utils import flt, cint, getdate, formatdate, comma_and, time_diff_in_seconds, to_timedelta
+from erpnext.support.doctype.issue.issue import get_holidays
+from frappe.utils import (flt, cint, getdate, formatdate,
+	comma_and, time_diff_in_seconds, to_timedelta, add_days)
 from frappe.model.document import Document
 from dateutil.parser import parse
 
@@ -43,6 +45,17 @@
 				where parent = %s and workstation = %s""",
 				(self.hour_rate, bom_no[0], self.name))
 
+	def validate_workstation_holiday(self, schedule_date, skip_holiday_list_check=False):
+		if not skip_holiday_list_check and (not self.holiday_list or
+			cint(frappe.db.get_single_value("Manufacturing Settings", "allow_production_on_holidays"))):
+			return schedule_date
+
+		if schedule_date in tuple(get_holidays(self.holiday_list)):
+			schedule_date = add_days(schedule_date, 1)
+			self.validate_workstation_holiday(schedule_date, skip_holiday_list_check=True)
+
+		return schedule_date
+
 @frappe.whitelist()
 def get_default_holiday_list():
 	return frappe.get_cached_value('Company',  frappe.defaults.get_user_default("Company"),  "default_holiday_list")
diff --git a/erpnext/manufacturing/doctype/workstation/workstation_dashboard.py b/erpnext/manufacturing/doctype/workstation/workstation_dashboard.py
index 9e0d1d1..7f0124b 100644
--- a/erpnext/manufacturing/doctype/workstation/workstation_dashboard.py
+++ b/erpnext/manufacturing/doctype/workstation/workstation_dashboard.py
@@ -6,8 +6,12 @@
 		'fieldname': 'workstation',
 		'transactions': [
 			{
-				'label': _('Manufacture'),
-				'items': ['BOM', 'Routing', 'Work Order', 'Job Card', 'Operation', 'Timesheet']
+				'label': _('Master'),
+				'items': ['BOM', 'Routing', 'Operation']
+			},
+			{
+				'label': _('Transaction'),
+				'items': ['Work Order', 'Job Card', 'Timesheet']
 			}
 		]
 	}
diff --git a/erpnext/manufacturing/report/bom_explorer/bom_explorer.py b/erpnext/manufacturing/report/bom_explorer/bom_explorer.py
index 875d115..48907ad 100644
--- a/erpnext/manufacturing/report/bom_explorer/bom_explorer.py
+++ b/erpnext/manufacturing/report/bom_explorer/bom_explorer.py
@@ -14,7 +14,7 @@
 def get_data(filters, data):
 	get_exploded_items(filters.bom, data)
 
-def get_exploded_items(bom, data, indent=0):
+def get_exploded_items(bom, data, indent=0, qty=1):
 	exploded_items = frappe.get_all("BOM Item",
 		filters={"parent": bom},
 		fields= ['qty','bom_no','qty','scrap','item_code','item_name','description','uom'])
@@ -26,13 +26,13 @@
 			'item_name': item.item_name,
 			'indent': indent,
 			'bom': item.bom_no,
-			'qty': item.qty,
+			'qty': item.qty * qty,
 			'uom': item.uom,
 			'description': item.description,
 			'scrap': item.scrap
 			})
 		if item.bom_no:
-			get_exploded_items(item.bom_no, data, indent=indent+1)
+			get_exploded_items(item.bom_no, data, indent=indent+1, qty=item.qty)
 
 def get_columns():
 	return [
diff --git a/erpnext/manufacturing/report/bom_stock_calculated/bom_stock_calculated.py b/erpnext/manufacturing/report/bom_stock_calculated/bom_stock_calculated.py
index be016ad..f7b407b 100644
--- a/erpnext/manufacturing/report/bom_stock_calculated/bom_stock_calculated.py
+++ b/erpnext/manufacturing/report/bom_stock_calculated/bom_stock_calculated.py
@@ -4,6 +4,7 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
+from frappe.utils.data import comma_and
 
 def execute(filters=None):
 #	if not filters: filters = {}
@@ -13,35 +14,36 @@
 	data = get_bom_stock(filters)
 	qty_to_make = filters.get("qty_to_make")
 
+	manufacture_details = get_manufacturer_records()
 	for row in data:
-		item_map = get_item_details(row.item_code)
 		reqd_qty = qty_to_make * row.actual_qty
 		last_pur_price = frappe.db.get_value("Item", row.item_code, "last_purchase_rate")
-		if row.to_build > 0:
-			diff_qty = row.to_build - reqd_qty
-			summ_data.append([row.item_code, row.description, item_map[row.item_code]["manufacturer"], item_map[row.item_code]["manufacturer_part_no"], row.actual_qty, row.to_build, reqd_qty, diff_qty, last_pur_price])
-		else:
-			diff_qty = 0 - reqd_qty
-			summ_data.append([row.item_code, row.description, item_map[row.item_code]["manufacturer"], item_map[row.item_code]["manufacturer_part_no"], row.actual_qty, "0.000", reqd_qty, diff_qty, last_pur_price])
 
+		summ_data.append(get_report_data(last_pur_price, reqd_qty, row, manufacture_details))
 	return columns, summ_data
 
+def get_report_data(last_pur_price, reqd_qty, row, manufacture_details):
+	to_build = row.to_build if row.to_build > 0 else 0
+	diff_qty = to_build - reqd_qty
+	return [row.item_code, row.description,
+		comma_and(manufacture_details.get(row.item_code, {}).get('manufacturer', []), add_quotes=False),
+		comma_and(manufacture_details.get(row.item_code, {}).get('manufacturer_part', []), add_quotes=False),
+		row.actual_qty, str(to_build),
+		reqd_qty, diff_qty, last_pur_price]
+
 def get_columns():
 	"""return columns"""
 	columns = [
 		_("Item") + ":Link/Item:100",
 		_("Description") + "::150",
-		_("Manufacturer") + "::100",
-		_("Manufacturer Part Number") + "::100",
+		_("Manufacturer") + "::250",
+		_("Manufacturer Part Number") + "::250",
 		_("Qty") + ":Float:50",
 		_("Stock Qty") + ":Float:100",
 		_("Reqd Qty")+ ":Float:100",
 		_("Diff Qty")+ ":Float:100",
 		_("Last Purchase Price")+ ":Float:100",
-
-
 	]
-
 	return columns
 
 def get_bom_stock(filters):
@@ -85,7 +87,12 @@
 
 			GROUP BY bom_item.item_code""".format(qty_field=qty_field, table=table, conditions=conditions, bom=bom), as_dict=1)
 
-def get_item_details(item_code):
-		items = frappe.db.sql("""select it.item_group, it.item_name, it.stock_uom, it.name, it.brand, it.description, it.manufacturer_part_no, it.manufacturer from tabItem it where it.item_code = %s""", item_code, as_dict=1)
+def get_manufacturer_records():
+	details = frappe.get_list('Item Manufacturer', fields = ["manufacturer", "manufacturer_part_no, parent"])
+	manufacture_details = frappe._dict()
+	for detail in details:
+		dic = manufacture_details.setdefault(detail.get('parent'), {})
+		dic.setdefault('manufacturer', []).append(detail.get('manufacturer'))
+		dic.setdefault('manufacturer_part', []).append(detail.get('manufacturer_part_no'))
 
-		return dict((d.name, d) for d in items)
+	return manufacture_details
\ No newline at end of file
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 9e4dc12..daedca7 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -645,4 +645,6 @@
 erpnext.patches.v12_0.set_payment_entry_status
 erpnext.patches.v12_0.update_owner_fields_in_acc_dimension_custom_fields
 erpnext.patches.v12_0.set_default_for_add_taxes_from_item_tax_template
-erpnext.patches.v12_0.remove_denied_leaves_from_leave_ledger
\ No newline at end of file
+erpnext.patches.v12_0.remove_denied_leaves_from_leave_ledger
+erpnext.patches.v12_0.update_price_or_product_discount
+erpnext.patches.v12_0.set_production_capacity_in_workstation
\ No newline at end of file
diff --git a/erpnext/patches/v11_0/rename_bom_wo_fields.py b/erpnext/patches/v11_0/rename_bom_wo_fields.py
index c8106a6..b4a740f 100644
--- a/erpnext/patches/v11_0/rename_bom_wo_fields.py
+++ b/erpnext/patches/v11_0/rename_bom_wo_fields.py
@@ -15,13 +15,6 @@
 
             rename_field(doctype, "allow_transfer_for_manufacture", "include_item_in_manufacturing")
 
-    if frappe.db.has_column('BOM', 'allow_same_item_multiple_times'):
-        frappe.db.sql(""" UPDATE tabBOM
-            SET
-                allow_same_item_multiple_times = 0
-            WHERE
-                trim(coalesce(allow_same_item_multiple_times, '')) = '' """)
-
     for doctype in ['BOM', 'Work Order']:
         frappe.reload_doc('manufacturing', 'doctype', frappe.scrub(doctype))
 
diff --git a/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py b/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py
index f25b9ea..e47344b 100644
--- a/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py
+++ b/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py
@@ -62,12 +62,12 @@
 	]
 	
 	for dt in doctypes:
-		for d in frappe.db.sql("""select name, parent, item_code, item_tax_rate from `tab{0} Item`
+		for d in frappe.db.sql("""select name, parenttype, parent, item_code, item_tax_rate from `tab{0} Item`
 								where ifnull(item_tax_rate, '') not in ('', '{{}}') 
 								and item_tax_template is NULL""".format(dt), as_dict=1):
 			item_tax_map = json.loads(d.item_tax_rate)
 			item_tax_template_name = get_item_tax_template(item_tax_templates,
-				item_tax_map, d.item_code, d.parent)
+				item_tax_map, d.item_code, d.parenttype, d.parent)
 			frappe.db.set_value(dt + " Item", d.name, "item_tax_template", item_tax_template_name)
 
 	frappe.db.auto_commit_on_many_writes = False
@@ -77,7 +77,7 @@
 	settings.determine_address_tax_category_from = "Billing Address"
 	settings.save()
 
-def get_item_tax_template(item_tax_templates, item_tax_map, item_code, parent=None):
+def get_item_tax_template(item_tax_templates, item_tax_map, item_code, parenttype=None, parent=None):
 	# search for previously created item tax template by comparing tax maps
 	for template, item_tax_template_map in iteritems(item_tax_templates):
 		if item_tax_map == item_tax_template_map:
@@ -88,23 +88,44 @@
 	item_tax_template.title = make_autoname("Item Tax Template-.####")
 
 	for tax_type, tax_rate in iteritems(item_tax_map):
-		if not frappe.db.exists("Account", tax_type):
+		account_details = frappe.db.get_value("Account", tax_type, ['name', 'account_type'], as_dict=1)
+		if account_details:
+			if account_details.account_type not in ('Tax', 'Chargeable', 'Income Account', 'Expense Account', 'Expenses Included In Valuation'):
+				frappe.db.set_value('Account', account_details.name, 'account_type', 'Chargeable')
+		else:
 			parts = tax_type.strip().split(" - ")
 			account_name = " - ".join(parts[:-1])
-			company = frappe.db.get_value("Company", filters={"abbr": parts[-1]})
+			company = get_company(parts[-1], parenttype, parent)
 			parent_account = frappe.db.get_value("Account",
 				filters={"account_type": "Tax", "root_type": "Liability", "is_group": 0, "company": company}, fieldname="parent_account")
-
-			frappe.get_doc({
-				"doctype": "Account",
+			filters = {
 				"account_name": account_name,
-				"company": company,
-				"account_type": "Tax",
-				"parent_account": parent_account
-			}).insert()
+                                "company": company,
+                                "account_type": "Tax",
+                                "parent_account": parent_account
+                        }
+			tax_type = frappe.db.get_value("Account", filters)
+			if not tax_type:
+				account = frappe.new_doc("Account")
+				account.update(filters)
+				account.insert()
+				tax_type = account.name
 
 		item_tax_template.append("taxes", {"tax_type": tax_type, "tax_rate": tax_rate})
 		item_tax_templates.setdefault(item_tax_template.title, {})
 		item_tax_templates[item_tax_template.title][tax_type] = tax_rate
 	item_tax_template.save()
 	return item_tax_template.name
+
+def get_company(company_abbr, parenttype=None, parent=None):
+	if parenttype and parent:
+		company = frappe.get_cached_value(parenttype, parent, 'company')
+	else:
+		company = frappe.db.get_value("Company", filters={"abbr": company_abbr})
+
+	if not company:
+		companies = frappe.get_all('Company')
+		if len(companies) == 1:
+			company = companies[0].name
+
+	return company
diff --git a/erpnext/patches/v12_0/set_cwip_and_delete_asset_settings.py b/erpnext/patches/v12_0/set_cwip_and_delete_asset_settings.py
index 5842e9e..4d4fc7c 100644
--- a/erpnext/patches/v12_0/set_cwip_and_delete_asset_settings.py
+++ b/erpnext/patches/v12_0/set_cwip_and_delete_asset_settings.py
@@ -7,15 +7,11 @@
 	'''Get 'Disable CWIP Accounting value' from Asset Settings, set it in 'Enable Capital Work in Progress Accounting' field
 	in Company, delete Asset Settings '''
 
-	if frappe.db.exists("DocType","Asset Settings"):
-		frappe.reload_doctype("Company")
-		cwip_value = frappe.db.get_single_value("Asset Settings","disable_cwip_accounting")
+	if frappe.db.exists("DocType", "Asset Settings"):
+		frappe.reload_doctype("Asset Category")
+		cwip_value = frappe.db.get_single_value("Asset Settings", "disable_cwip_accounting")
+		
+		frappe.db.sql("""UPDATE `tabAsset Category` SET enable_cwip_accounting = %s""", cint(cwip_value))
 
-		companies = [x['name'] for x in frappe.get_all("Company", "name")]
-		for company in companies:
-			enable_cwip_accounting = cint(not cint(cwip_value))
-			frappe.db.set_value("Company", company, "enable_cwip_accounting", enable_cwip_accounting)
-
-		frappe.db.sql(
-			""" DELETE FROM `tabSingles` where doctype = 'Asset Settings' """)
-		frappe.delete_doc_if_exists("DocType","Asset Settings")
\ No newline at end of file
+		frappe.db.sql("""DELETE FROM `tabSingles` where doctype = 'Asset Settings'""")
+		frappe.delete_doc_if_exists("DocType", "Asset Settings")
\ No newline at end of file
diff --git a/erpnext/patches/v12_0/set_production_capacity_in_workstation.py b/erpnext/patches/v12_0/set_production_capacity_in_workstation.py
new file mode 100644
index 0000000..bae1e28
--- /dev/null
+++ b/erpnext/patches/v12_0/set_production_capacity_in_workstation.py
@@ -0,0 +1,8 @@
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+    frappe.reload_doc("manufacturing", "doctype", "workstation")
+
+    frappe.db.sql(""" UPDATE `tabWorkstation`
+        SET production_capacity = 1 """)
\ No newline at end of file
diff --git a/erpnext/patches/v12_0/update_price_or_product_discount.py b/erpnext/patches/v12_0/update_price_or_product_discount.py
new file mode 100644
index 0000000..3a8cd43
--- /dev/null
+++ b/erpnext/patches/v12_0/update_price_or_product_discount.py
@@ -0,0 +1,8 @@
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+	frappe.reload_doc("accounts", "doctype", "pricing_rule")
+
+	frappe.db.sql(""" UPDATE `tabPricing Rule` SET price_or_product_discount = 'Price'
+		WHERE ifnull(price_or_product_discount,'') = '' """)
diff --git a/erpnext/patches/v8_9/add_setup_progress_actions.py b/erpnext/patches/v8_9/add_setup_progress_actions.py
index fe12311..7750107 100644
--- a/erpnext/patches/v8_9/add_setup_progress_actions.py
+++ b/erpnext/patches/v8_9/add_setup_progress_actions.py
@@ -5,6 +5,9 @@
 
 def execute():
 	"""Add setup progress actions"""
+	if not frappe.db.exists('DocType', 'Setup Progress') or not frappe.db.exists('DocType', 'Setup Progress Action'):
+		return
+
 	frappe.reload_doc("setup", "doctype", "setup_progress")
 	frappe.reload_doc("setup", "doctype", "setup_progress_action")
 
diff --git a/erpnext/portal/doctype/homepage/test_homepage.py b/erpnext/portal/doctype/homepage/test_homepage.py
index b262c46..bf5c402 100644
--- a/erpnext/portal/doctype/homepage/test_homepage.py
+++ b/erpnext/portal/doctype/homepage/test_homepage.py
@@ -5,7 +5,7 @@
 
 import frappe
 import unittest
-from frappe.tests.test_website import set_request
+from frappe.utils import set_request
 from frappe.website.render import render
 
 class TestHomepage(unittest.TestCase):
diff --git a/erpnext/portal/doctype/homepage_section/test_homepage_section.py b/erpnext/portal/doctype/homepage_section/test_homepage_section.py
index c52b7a9..5b3196d 100644
--- a/erpnext/portal/doctype/homepage_section/test_homepage_section.py
+++ b/erpnext/portal/doctype/homepage_section/test_homepage_section.py
@@ -6,7 +6,7 @@
 import frappe
 import unittest
 from bs4 import BeautifulSoup
-from frappe.tests.test_website import set_request
+from frappe.utils import set_request
 from frappe.website.render import render
 
 class TestHomepageSection(unittest.TestCase):
diff --git a/erpnext/portal/product_configurator/test_product_configurator.py b/erpnext/portal/product_configurator/test_product_configurator.py
index a534e5f..97042db 100644
--- a/erpnext/portal/product_configurator/test_product_configurator.py
+++ b/erpnext/portal/product_configurator/test_product_configurator.py
@@ -2,7 +2,7 @@
 
 from bs4 import BeautifulSoup
 import frappe, unittest
-from frappe.tests.test_website import set_request, get_html_for_route
+from frappe.utils import set_request, get_html_for_route
 from frappe.website.render import render
 from erpnext.portal.product_configurator.utils import get_products_for_website
 from erpnext.stock.doctype.item.test_item import make_item_variant
diff --git a/erpnext/portal/product_configurator/utils.py b/erpnext/portal/product_configurator/utils.py
index 61c50e5..3a373a4 100644
--- a/erpnext/portal/product_configurator/utils.py
+++ b/erpnext/portal/product_configurator/utils.py
@@ -313,13 +313,25 @@
 
 	search_condition = ''
 	if search:
+		# Default fields to search from
+		default_fields = {'name', 'item_name', 'description', 'item_group'}
+
+		# Get meta search fields
+		meta = frappe.get_meta("Item")
+		meta_fields = set(meta.get_search_fields())
+
+		# Join the meta fields and default fields set
+		search_fields = default_fields.union(meta_fields)
+		try:
+			if frappe.db.count('Item', cache=True) > 50000:
+				search_fields.remove('description')
+		except KeyError:
+			pass
+
+		# Build or filters for query
 		search = '%{}%'.format(search)
-		or_filters = [
-			['name', 'like', search],
-			['item_name', 'like', search],
-			['description', 'like', search],
-			['item_group', 'like', search]
-		]
+		or_filters = [[field, 'like', search] for field in search_fields]
+
 		search_condition = get_conditions(or_filters, 'or')
 
 	filter_condition = get_conditions(filters, 'and')
diff --git a/erpnext/projects/doctype/project/project.js b/erpnext/projects/doctype/project/project.js
index 25c97d1..3570a0f 100644
--- a/erpnext/projects/doctype/project/project.js
+++ b/erpnext/projects/doctype/project/project.js
@@ -4,20 +4,16 @@
 	setup(frm) {
 		frm.make_methods = {
 			'Timesheet': () => {
-				let doctype = 'Timesheet';
-				frappe.model.with_doctype(doctype, () => {
-					let new_doc = frappe.model.get_new_doc(doctype);
-
-					// add a new row and set the project
-					let time_log = frappe.model.get_new_doc('Timesheet Detail');
-					time_log.project = frm.doc.name;
-					time_log.parent = new_doc.name;
-					time_log.parentfield = 'time_logs';
-					time_log.parenttype = 'Timesheet';
-					new_doc.time_logs = [time_log];
-
-					frappe.ui.form.make_quick_entry(doctype, null, null, new_doc);
-				});
+				open_form(frm, "Timesheet", "Timesheet Detail", "time_logs");
+			},
+			'Purchase Order': () => {
+				open_form(frm, "Purchase Order", "Purchase Order Item", "items");
+			},
+			'Purchase Receipt': () => {
+				open_form(frm, "Purchase Receipt", "Purchase Receipt Item", "items");
+			},
+			'Purchase Invoice': () => {
+				open_form(frm, "Purchase Invoice", "Purchase Invoice Item", "items");
 			},
 		};
 	},
@@ -80,7 +76,7 @@
 				frm.events.set_status(frm, 'Cancelled');
 			}, __('Set Status'));
 		}
-		
+
 		if (frappe.model.can_read("Task")) {
 			frm.add_custom_button(__("Gantt Chart"), function () {
 				frappe.route_options = {
@@ -123,3 +119,20 @@
 	},
 
 });
+
+function open_form(frm, doctype, child_doctype, parentfield) {
+	frappe.model.with_doctype(doctype, () => {
+		let new_doc = frappe.model.get_new_doc(doctype);
+
+		// add a new row and set the project
+		let new_child_doc = frappe.model.get_new_doc(child_doctype);
+		new_child_doc.project = frm.doc.name;
+		new_child_doc.parent = new_doc.name;
+		new_child_doc.parentfield = parentfield;
+		new_child_doc.parenttype = doctype;
+		new_doc[parentfield] = [new_child_doc];
+
+		frappe.ui.form.make_quick_entry(doctype, null, null, new_doc);
+	});
+
+}
\ No newline at end of file
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index 54fce8d..7083d69 100755
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -7,7 +7,7 @@
 
 import frappe
 from frappe import _, throw
-from frappe.utils import add_days, cstr, date_diff, get_link_to_form, getdate
+from frappe.utils import add_days, cstr, date_diff, get_link_to_form, getdate, today
 from frappe.utils.nestedset import NestedSet
 from frappe.desk.form.assign_to import close_all_assignments, clear
 from frappe.utils import date_diff
@@ -212,8 +212,11 @@
 		task.save()
 
 def set_tasks_as_overdue():
-	tasks = frappe.get_all("Task", filters={'status':['not in',['Cancelled', 'Completed']]})
+	tasks = frappe.get_all("Task", filters={'status':['not in',['Cancelled', 'Closed']]})
 	for task in tasks:
+		if frappe.db.get_value("Task", task.name, "status") in 'Pending Review':
+			if getdate(frappe.db.get_value("Task", task.name, "review_date")) < getdate(today()):
+				continue
 		frappe.get_doc("Task", task.name).update_status()
 
 @frappe.whitelist()
diff --git a/erpnext/projects/doctype/timesheet/timesheet.py b/erpnext/projects/doctype/timesheet/timesheet.py
index c4481c9..e908216 100644
--- a/erpnext/projects/doctype/timesheet/timesheet.py
+++ b/erpnext/projects/doctype/timesheet/timesheet.py
@@ -188,7 +188,8 @@
 			}, as_dict=True)
 		# check internal overlap
 		for time_log in self.time_logs:
-			if not (time_log.from_time or time_log.to_time): continue
+			if not (time_log.from_time and time_log.to_time
+				and args.from_time and args.to_time): continue
 
 			if (fieldname != 'workstation' or args.get(fieldname) == time_log.get(fieldname)) and \
 				args.idx != time_log.idx and ((args.from_time > time_log.from_time and args.from_time < time_log.to_time) or
diff --git a/erpnext/public/images/illustrations/customers-onboard.png b/erpnext/public/images/illustrations/customers-onboard.png
new file mode 100644
index 0000000..4a517bd
--- /dev/null
+++ b/erpnext/public/images/illustrations/customers-onboard.png
Binary files differ
diff --git a/erpnext/public/images/illustrations/desk-onboard.png b/erpnext/public/images/illustrations/desk-onboard.png
new file mode 100644
index 0000000..74b632d
--- /dev/null
+++ b/erpnext/public/images/illustrations/desk-onboard.png
Binary files differ
diff --git a/erpnext/public/images/illustrations/letterhead-onboard.png b/erpnext/public/images/illustrations/letterhead-onboard.png
new file mode 100644
index 0000000..fdfd16a
--- /dev/null
+++ b/erpnext/public/images/illustrations/letterhead-onboard.png
Binary files differ
diff --git a/erpnext/public/images/illustrations/products-onboard.png b/erpnext/public/images/illustrations/products-onboard.png
new file mode 100644
index 0000000..2dee203
--- /dev/null
+++ b/erpnext/public/images/illustrations/products-onboard.png
Binary files differ
diff --git a/erpnext/public/images/illustrations/supplier-onboard.png b/erpnext/public/images/illustrations/supplier-onboard.png
new file mode 100644
index 0000000..30335f2
--- /dev/null
+++ b/erpnext/public/images/illustrations/supplier-onboard.png
Binary files differ
diff --git a/erpnext/public/js/controllers/accounts.js b/erpnext/public/js/controllers/accounts.js
index 3dfc891..f4eaad5 100644
--- a/erpnext/public/js/controllers/accounts.js
+++ b/erpnext/public/js/controllers/accounts.js
@@ -64,7 +64,7 @@
 				}
 			})
 		}
-	}	
+	}
 });
 
 frappe.ui.form.on('Sales Invoice Payment', {
@@ -355,4 +355,4 @@
 		out += '</table></td></tr></table></div>';
 	}
 	return out;
-}
+}
\ No newline at end of file
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index 5da9493..46a58fb 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -1716,6 +1716,14 @@
 		}
 	},
 
+	against_blanket_order: function(doc, cdt, cdn) {
+		var item = locals[cdt][cdn];
+		if(!item.against_blanket_order) {
+			frappe.model.set_value(this.frm.doctype + " Item", item.name, "blanket_order", null);
+			frappe.model.set_value(this.frm.doctype + " Item", item.name, "blanket_order_rate", 0.00);
+		}
+	},
+
 	blanket_order: function(doc, cdt, cdn) {
 		var me = this;
 		var item = locals[cdt][cdn];
diff --git a/erpnext/public/js/hub/PageContainer.vue b/erpnext/public/js/hub/PageContainer.vue
index f151add..54c3597 100644
--- a/erpnext/public/js/hub/PageContainer.vue
+++ b/erpnext/public/js/hub/PageContainer.vue
@@ -24,7 +24,7 @@
 function get_route_map() {
 	const read_only_routes = {
 		'marketplace/home': Home,
-		'marketplace/search/:keyword': Search,
+		'marketplace/search/:category/:keyword': Search,
 		'marketplace/category/:category': Category,
 		'marketplace/item/:item': Item,
 		'marketplace/seller/:seller': Seller,
diff --git a/erpnext/public/js/hub/pages/Category.vue b/erpnext/public/js/hub/pages/Category.vue
index 3a0e6bf..057fe8b 100644
--- a/erpnext/public/js/hub/pages/Category.vue
+++ b/erpnext/public/js/hub/pages/Category.vue
@@ -3,6 +3,12 @@
 		class="marketplace-page"
 		:data-page-name="page_name"
 	>
+		<search-input
+			:placeholder="search_placeholder"
+			:on_search="set_search_route"
+			v-model="search_value"
+		/>
+
 		<h5>{{ page_title }}</h5>
 
 		<item-cards-container
@@ -26,7 +32,13 @@
 			item_id_fieldname: 'name',
 
 			// Constants
-			empty_state_message: __(`No items in this category yet.`)
+			empty_state_message: __(`No items in this category yet.`),
+
+			search_value: '',
+
+			// Constants
+			search_placeholder: __('Search for anything ...'),
+
 		};
 	},
 	computed: {
@@ -35,6 +47,7 @@
 		}
 	},
 	created() {
+		this.search_value = '';
 		this.get_items();
 	},
 	methods: {
@@ -51,7 +64,11 @@
 
 		go_to_item_details_page(hub_item_name) {
 			frappe.set_route(`marketplace/item/${hub_item_name}`);
-		}
+		},
+
+		set_search_route() {
+			frappe.set_route('marketplace', 'search', this.category, this.search_value);
+		},
 	}
 }
 </script>
diff --git a/erpnext/public/js/hub/pages/Home.vue b/erpnext/public/js/hub/pages/Home.vue
index 3536569..aaeaa7e 100644
--- a/erpnext/public/js/hub/pages/Home.vue
+++ b/erpnext/public/js/hub/pages/Home.vue
@@ -98,7 +98,7 @@
 		},
 
 		set_search_route() {
-			frappe.set_route('marketplace', 'search', this.search_value);
+			frappe.set_route('marketplace', 'search', 'All', this.search_value);
 		},
 	}
 }
diff --git a/erpnext/public/js/hub/pages/Search.vue b/erpnext/public/js/hub/pages/Search.vue
index 5118a81..1032842 100644
--- a/erpnext/public/js/hub/pages/Search.vue
+++ b/erpnext/public/js/hub/pages/Search.vue
@@ -29,8 +29,10 @@
 		return {
 			page_name: frappe.get_route()[1],
 			items: [],
-			search_value: frappe.get_route()[2],
+			category: frappe.get_route()[2],
+			search_value: frappe.get_route()[3],
 			item_id_fieldname: 'name',
+			filters: {},
 
 			// Constants
 			search_placeholder: __('Search for anything ...'),
@@ -40,7 +42,7 @@
 	computed: {
 		page_title() {
 			return this.items.length
-				? __(`Results for "${this.search_value}"`)
+				? __(`Results for "${this.search_value}" ${this.category !== 'All'? `in category ${this.category}` : ''}`)
 				: __('No Items found.');
 		}
 	},
@@ -49,14 +51,20 @@
 	},
 	methods: {
 		get_items() {
-			hub.call('get_items', { keyword: this.search_value })
+			if (this.category !== 'All') {
+				this.filters['hub_category'] = this.category;
+			}
+			hub.call('get_items', {
+				keyword: this.search_value,
+				filters: this.filters
+			})
 			.then((items) => {
 				this.items = items;
 			})
 		},
 
 		set_route_and_get_items() {
-			frappe.set_route('marketplace', 'search', this.search_value);
+			frappe.set_route('marketplace', 'search', this.category, this.search_value);
 			this.get_items();
 		},
 
diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js
index 6f43d9e..d5a78d4 100755
--- a/erpnext/public/js/utils.js
+++ b/erpnext/public/js/utils.js
@@ -74,6 +74,22 @@
 			);
 		});
 	},
+
+	route_to_adjustment_jv: (args) => {
+		frappe.model.with_doctype('Journal Entry', () => {
+			// route to adjustment Journal Entry to handle Account Balance and Stock Value mismatch
+			let journal_entry = frappe.model.get_new_doc('Journal Entry');
+
+			args.accounts.forEach((je_account) => {
+				let child_row = frappe.model.add_child(journal_entry, "accounts");
+				child_row.account = je_account.account;
+				child_row.debit_in_account_currency = je_account.debit_in_account_currency;
+				child_row.credit_in_account_currency = je_account.credit_in_account_currency;
+				child_row.party_type = "" ;
+			});
+			frappe.set_route('Form','Journal Entry', journal_entry.name);
+		});
+	}
 });
 
 
diff --git a/erpnext/public/less/erpnext.less b/erpnext/public/less/erpnext.less
index 8ed5f1a..abe4868 100644
--- a/erpnext/public/less/erpnext.less
+++ b/erpnext/public/less/erpnext.less
@@ -426,7 +426,7 @@
 	.collapse-btn {
 		cursor: pointer;
 	}
-	
+
 	@media (max-width: @screen-xs) {
 		.page-actions {
 			max-width: 110px;
diff --git a/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.js b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.js
index e7cc919..7ff4de4 100644
--- a/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.js
+++ b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.js
@@ -3,6 +3,26 @@
 
 frappe.ui.form.on('GST HSN Code', {
 	refresh: function(frm) {
-
+		if(! frm.doc.__islocal && frm.doc.taxes.length){
+			frm.add_custom_button(__('Update Taxes for Items'), function(){
+				frappe.confirm(
+					'Are you sure? It will overwrite taxes for all items with HSN Code <b>'+frm.doc.name+'</b>.',
+					function(){
+						frappe.call({
+							args:{
+								taxes: frm.doc.taxes,
+								hsn_code: frm.doc.name
+							},
+							method: 'erpnext.regional.doctype.gst_hsn_code.gst_hsn_code.update_taxes_in_item_master',
+							callback: function(r) {
+								if(r.message){
+									frappe.show_alert(__('Item taxes updated'));
+								}
+							}
+						});
+					}
+				);
+			});
+		}
 	}
-});
+});
\ No newline at end of file
diff --git a/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.json b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.json
index 2a2145c..06dab37 100644
--- a/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.json
+++ b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.json
@@ -1,104 +1,46 @@
 {
- "allow_copy": 0, 
- "allow_guest_to_view": 0, 
- "allow_import": 0, 
- "allow_rename": 0, 
- "autoname": "field:hsn_code", 
- "beta": 0, 
- "creation": "2017-06-21 10:48:56.422086", 
- "custom": 0, 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "", 
- "editable_grid": 1, 
- "engine": "InnoDB", 
+ "autoname": "field:hsn_code",
+ "creation": "2017-06-21 10:48:56.422086",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "hsn_code",
+  "description",
+  "taxes"
+ ],
  "fields": [
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "hsn_code", 
-   "fieldtype": "Data", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "HSN Code", 
-   "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": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "hsn_code",
+   "fieldtype": "Data",
+   "in_list_view": 1,
+   "label": "HSN Code",
+   "reqd": 1,
+   "unique": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "description", 
-   "fieldtype": "Small Text", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Description", 
-   "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, 
-   "unique": 0
+   "fieldname": "description",
+   "fieldtype": "Small Text",
+   "in_list_view": 1,
+   "label": "Description"
+  },
+  {
+   "fieldname": "taxes",
+   "fieldtype": "Table",
+   "label": "Taxes",
+   "options": "Item Tax"
   }
- ], 
- "has_web_view": 0, 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "idx": 0, 
- "image_view": 0, 
- "in_create": 0, 
- "is_submittable": 0, 
- "issingle": 0, 
- "istable": 0, 
- "max_attachments": 0, 
- "modified": "2017-09-29 14:38:52.220743", 
- "modified_by": "Administrator", 
- "module": "Regional", 
- "name": "GST HSN Code", 
- "name_case": "", 
- "owner": "Administrator", 
- "permissions": [], 
- "quick_entry": 1, 
- "read_only": 0, 
- "read_only_onload": 0, 
- "search_fields": "hsn_code, description", 
- "show_name_in_global_search": 0, 
- "sort_field": "modified", 
- "sort_order": "DESC", 
- "title_field": "hsn_code", 
- "track_changes": 1, 
- "track_seen": 0
+ ],
+ "modified": "2019-11-01 11:18:59.556931",
+ "modified_by": "Administrator",
+ "module": "Regional",
+ "name": "GST HSN Code",
+ "owner": "Administrator",
+ "permissions": [],
+ "quick_entry": 1,
+ "search_fields": "hsn_code, description",
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "title_field": "hsn_code",
+ "track_changes": 1
 }
\ No newline at end of file
diff --git a/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.py b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.py
index 9637c2e..fa2cb12 100644
--- a/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.py
+++ b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.py
@@ -8,3 +8,22 @@
 
 class GSTHSNCode(Document):
 	pass
+
+@frappe.whitelist()
+def update_taxes_in_item_master(taxes, hsn_code):
+	items = frappe.get_list("Item", filters={
+		'gst_hsn_code': hsn_code
+	})
+
+	taxes = frappe.parse_json(taxes)
+	frappe.enqueue(update_item_document, items=items, taxes=taxes)
+	return 1
+
+def update_item_document(items, taxes):
+	for item in items:
+		item_to_be_updated=frappe.get_doc("Item", item.name)
+		item_to_be_updated.taxes = []
+		for tax in taxes:
+			tax = frappe._dict(tax)
+			item_to_be_updated.append("taxes", {'item_tax_template': tax.item_tax_template, 'tax_category': tax.tax_category})
+			item_to_be_updated.save()
\ No newline at end of file
diff --git a/erpnext/regional/italy/e-invoice.xml b/erpnext/regional/italy/e-invoice.xml
index 049a7eb..69b8e3e 100644
--- a/erpnext/regional/italy/e-invoice.xml
+++ b/erpnext/regional/italy/e-invoice.xml
@@ -205,7 +205,9 @@
         {%- endif %}
         <ImponibileImporto>{{ format_float(data.taxable_amount, item_meta.get_field("tax_amount").precision) }}</ImponibileImporto>
         <Imposta>{{ format_float(data.tax_amount, item_meta.get_field("tax_amount").precision) }}</Imposta>
-        <EsigibilitaIVA>{{ doc.vat_collectability.split("-")[0] }}</EsigibilitaIVA>
+        {%- if data.vat_collectability %}
+          <EsigibilitaIVA>{{ doc.vat_collectability.split("-")[0] }}</EsigibilitaIVA>
+        {%- endif %}
         {%- if data.tax_exemption_law %}
         <RiferimentoNormativo>{{ data.tax_exemption_law }}</RiferimentoNormativo>
         {%- endif %}
diff --git a/erpnext/regional/report/datev/datev.py b/erpnext/regional/report/datev/datev.py
index ee8735f..bd70639 100644
--- a/erpnext/regional/report/datev/datev.py
+++ b/erpnext/regional/report/datev/datev.py
@@ -10,17 +10,26 @@
 from __future__ import unicode_literals
 import datetime
 import json
+import zlib
+import zipfile
+import six
+from six import BytesIO
 from six import string_types
 import frappe
 from frappe import _
 import pandas as pd
+from .datev_constants import DataCategory
+from .datev_constants import Transactions
+from .datev_constants import DebtorsCreditors
+from .datev_constants import AccountNames
+from .datev_constants import QUERY_REPORT_COLUMNS
 
 
 def execute(filters=None):
 	"""Entry point for frappe."""
 	validate(filters)
-	result = get_gl_entries(filters, as_dict=0)
-	columns = get_columns()
+	result = get_transactions(filters, as_dict=0)
+	columns = QUERY_REPORT_COLUMNS
 
 	return columns, result
 
@@ -41,65 +50,8 @@
 	except frappe.DoesNotExistError:
 		frappe.throw(_('Please create <b>DATEV Settings</b> for Company <b>{}</b>.').format(filters.get('company')))
 
-def get_columns():
-	"""Return the list of columns that will be shown in query report."""
-	columns = [
-		{
-			"label": "Umsatz (ohne Soll/Haben-Kz)",
-			"fieldname": "Umsatz (ohne Soll/Haben-Kz)",
-			"fieldtype": "Currency",
-		},
-		{
-			"label": "Soll/Haben-Kennzeichen",
-			"fieldname": "Soll/Haben-Kennzeichen",
-			"fieldtype": "Data",
-		},
-		{
-			"label": "Kontonummer",
-			"fieldname": "Kontonummer",
-			"fieldtype": "Data",
-		},
-		{
-			"label": "Gegenkonto (ohne BU-Schlüssel)",
-			"fieldname": "Gegenkonto (ohne BU-Schlüssel)",
-			"fieldtype": "Data",
-		},
-		{
-			"label": "Belegdatum",
-			"fieldname": "Belegdatum",
-			"fieldtype": "Date",
-		},
-		{
-			"label": "Buchungstext",
-			"fieldname": "Buchungstext",
-			"fieldtype": "Text",
-		},
-		{
-			"label": "Beleginfo - Art 1",
-			"fieldname": "Beleginfo - Art 1",
-			"fieldtype": "Data",
-		},
-		{
-			"label": "Beleginfo - Inhalt 1",
-			"fieldname": "Beleginfo - Inhalt 1",
-			"fieldtype": "Data",
-		},
-		{
-			"label": "Beleginfo - Art 2",
-			"fieldname": "Beleginfo - Art 2",
-			"fieldtype": "Data",
-		},
-		{
-			"label": "Beleginfo - Inhalt 2",
-			"fieldname": "Beleginfo - Inhalt 2",
-			"fieldtype": "Data",
-		}
-	]
 
-	return columns
-
-
-def get_gl_entries(filters, as_dict):
+def get_transactions(filters, as_dict=1):
 	"""
 	Get a list of accounting entries.
 
@@ -111,7 +63,7 @@
 	as_dict -- return as list of dicts [0,1]
 	"""
 	gl_entries = frappe.db.sql("""
-		select
+		SELECT
 
 			/* either debit or credit amount; always positive */
 			case gl.debit when 0 then gl.credit else gl.debit end as 'Umsatz (ohne Soll/Haben-Kz)',
@@ -132,7 +84,7 @@
 			gl.against_voucher_type as 'Beleginfo - Art 2',
 			gl.against_voucher as 'Beleginfo - Inhalt 2'
 
-		from `tabGL Entry` gl
+		FROM `tabGL Entry` gl
 
 			/* Statistisches Konto (Debitoren/Kreditoren) */
 			left join `tabParty Account` pa
@@ -155,15 +107,127 @@
 			left join `tabAccount` acc_against_pa 
 			on pa.account = acc_against_pa.name
 
-		where gl.company = %(company)s 
-		and DATE(gl.posting_date) >= %(from_date)s
-		and DATE(gl.posting_date) <= %(to_date)s
-		order by 'Belegdatum', gl.voucher_no""", filters, as_dict=as_dict)
+		WHERE gl.company = %(company)s 
+		AND DATE(gl.posting_date) >= %(from_date)s
+		AND DATE(gl.posting_date) <= %(to_date)s
+		ORDER BY 'Belegdatum', gl.voucher_no""", filters, as_dict=as_dict, as_utf8=1)
 
 	return gl_entries
 
 
-def get_datev_csv(data, filters):
+def get_customers(filters):
+	"""
+	Get a list of Customers.
+
+	Arguments:
+	filters -- dict of filters to be passed to the sql query
+	"""
+	return frappe.db.sql("""
+		SELECT
+
+			acc.account_number as 'Konto',
+			cus.customer_name as 'Name (Adressatentyp Unternehmen)',
+			case cus.customer_type when 'Individual' then 1 when 'Company' then 2 else 0 end as 'Adressatentyp',
+			adr.address_line1 as 'Straße',
+			adr.pincode as 'Postleitzahl',
+			adr.city as 'Ort',
+			UPPER(country.code) as 'Land',
+			adr.address_line2 as 'Adresszusatz',
+			con.email_id as 'E-Mail',
+			coalesce(con.mobile_no, con.phone) as 'Telefon',
+			cus.website as 'Internet',
+			cus.tax_id as 'Steuernummer',
+			ccl.credit_limit as 'Kreditlimit (Debitor)'
+
+		FROM `tabParty Account` par
+
+			left join `tabAccount` acc
+			on acc.name = par.account
+
+			left join `tabCustomer` cus
+			on cus.name = par.parent
+
+			left join `tabAddress` adr
+			on adr.name = cus.customer_primary_address
+
+			left join `tabCountry` country
+			on country.name = adr.country
+
+			left join `tabContact` con
+			on con.name = cus.customer_primary_contact
+
+			left join `tabCustomer Credit Limit` ccl
+			on ccl.parent = cus.name
+			and ccl.company = par.company
+
+		WHERE par.company = %(company)s
+		AND par.parenttype = 'Customer'""", filters, as_dict=1, as_utf8=1)
+
+
+def get_suppliers(filters):
+	"""
+	Get a list of Suppliers.
+
+	Arguments:
+	filters -- dict of filters to be passed to the sql query
+	"""
+	return frappe.db.sql("""
+		SELECT
+
+			acc.account_number as 'Konto',
+			sup.supplier_name as 'Name (Adressatentyp Unternehmen)',
+			case sup.supplier_type when 'Individual' then '1' when 'Company' then '2' else '0' end as 'Adressatentyp',
+			adr.address_line1 as 'Straße',
+			adr.pincode as 'Postleitzahl',
+			adr.city as 'Ort',
+			UPPER(country.code) as 'Land',
+			adr.address_line2 as 'Adresszusatz',
+			con.email_id as 'E-Mail',
+			coalesce(con.mobile_no, con.phone) as 'Telefon',
+			sup.website as 'Internet',
+			sup.tax_id as 'Steuernummer',
+			case sup.on_hold when 1 then sup.release_date else null end as 'Zahlungssperre bis'
+
+		FROM `tabParty Account` par
+
+			left join `tabAccount` acc
+			on acc.name = par.account
+
+			left join `tabSupplier` sup
+			on sup.name = par.parent
+
+			left join `tabDynamic Link` dyn_adr
+			on dyn_adr.link_name = sup.name
+			and dyn_adr.link_doctype = 'Supplier'
+			and dyn_adr.parenttype = 'Address'
+			
+			left join `tabAddress` adr
+			on adr.name = dyn_adr.parent
+			and adr.is_primary_address = '1'
+
+			left join `tabCountry` country
+			on country.name = adr.country
+
+			left join `tabDynamic Link` dyn_con
+			on dyn_con.link_name = sup.name
+			and dyn_con.link_doctype = 'Supplier'
+			and dyn_con.parenttype = 'Contact'
+
+			left join `tabContact` con
+			on con.name = dyn_con.parent
+			and con.is_primary_contact = '1'
+
+		WHERE par.company = %(company)s
+		AND par.parenttype = 'Supplier'""", filters, as_dict=1, as_utf8=1)
+
+
+def get_account_names(filters):
+	return frappe.get_list("Account", 
+		fields=["account_number as Konto", "name as Kontenbeschriftung"], 
+		filters={"company": filters.get("company"), "is_group": "0"})
+
+
+def get_datev_csv(data, filters, csv_class):
 	"""
 	Fill in missing columns and return a CSV in DATEV Format.
 
@@ -174,7 +238,46 @@
 	Arguments:
 	data -- array of dictionaries
 	filters -- dict
+	csv_class -- defines DATA_CATEGORY, FORMAT_NAME and COLUMNS
 	"""
+	header = get_header(filters, csv_class)
+
+	empty_df = pd.DataFrame(columns=csv_class.COLUMNS)
+	data_df = pd.DataFrame.from_records(data)
+
+	result = empty_df.append(data_df, sort=True)
+
+	if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS:
+		result['Belegdatum'] = pd.to_datetime(result['Belegdatum'])
+
+	if csv_class.DATA_CATEGORY == DataCategory.ACCOUNT_NAMES:
+		result['Sprach-ID'] = 'de-DE'
+
+	header = ';'.join(header).encode('latin_1')
+	data = result.to_csv(
+		# Reason for str(';'): https://github.com/pandas-dev/pandas/issues/6035
+		sep=str(';'),
+		# European decimal seperator
+		decimal=',',
+		# Windows "ANSI" encoding
+		encoding='latin_1',
+		# format date as DDMM
+		date_format='%d%m',
+		# Windows line terminator
+		line_terminator='\r\n',
+		# Do not number rows
+		index=False,
+		# Use all columns defined above
+		columns=csv_class.COLUMNS
+	)
+
+	if not six.PY2:
+		data = data.encode('latin_1')
+
+	return header + b'\r\n' + data
+
+
+def get_header(filters, csv_class):
 	header = [
 		# A = DATEV format
 		#   DTVF = created by DATEV software,
@@ -185,18 +288,8 @@
 		#   510 = 5.10,
 		#   720 = 7.20
 		"510",
-		# C = Data category
-		#   21 = Transaction batch (Buchungsstapel),
-		#   67 = Buchungstextkonstanten,
-		#   16 = Debitors/Creditors,
-		#   20 = Account names (Kontenbeschriftungen)
-		"21",
-		# D = Format name
-		#   Buchungsstapel,
-		#   Buchungstextkonstanten,
-		#   Debitoren/Kreditoren,
-		#   Kontenbeschriftungen
-		"Buchungsstapel",
+		csv_class.DATA_CATEGORY,
+		csv_class.FORMAT_NAME,
 		# E = Format version (regarding format name)
 		"",
 		# F = Generated on
@@ -224,16 +317,17 @@
 		# P = Transaction batch end date (YYYYMMDD)
 		frappe.utils.formatdate(filters.get('to_date'), "yyyyMMdd"),
 		# Q = Description (for example, "January - February 2019 Transactions")
-		"{} - {} Buchungsstapel".format(
-			frappe.utils.formatdate(filters.get('from_date'), "MMMM yyyy"),
-			frappe.utils.formatdate(filters.get('to_date'), "MMMM yyyy")
+		"{} - {} {}".format(
+				frappe.utils.formatdate(filters.get('from_date'), "MMMM yyyy"),
+				frappe.utils.formatdate(filters.get('to_date'), "MMMM yyyy"),
+				csv_class.FORMAT_NAME
 		),
 		# R = Diktatkürzel
 		"",
 		# S = Buchungstyp
 		#   1 = Transaction batch (Buchungsstapel),
 		#   2 = Annual financial statement (Jahresabschluss)
-		"1",
+		"1" if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS else "",
 		# T = Rechnungslegungszweck
 		"",
 		# U = Festschreibung
@@ -241,185 +335,8 @@
 		# V = Kontoführungs-Währungskennzeichen des Geldkontos
 		frappe.get_value("Company", filters.get("company"), "default_currency")
 	]
-	columns = [
-		# All possible columns must tbe listed here, because DATEV requires them to
-		# be present in the CSV.
-		# ---
-		# Umsatz
-		"Umsatz (ohne Soll/Haben-Kz)",
-		"Soll/Haben-Kennzeichen",
-		"WKZ Umsatz",
-		"Kurs",
-		"Basis-Umsatz",
-		"WKZ Basis-Umsatz",
-		# Konto/Gegenkonto
-		"Kontonummer",
-		"Gegenkonto (ohne BU-Schlüssel)",
-		"BU-Schlüssel",
-		# Datum
-		"Belegdatum",
-		# Belegfelder
-		"Belegfeld 1",
-		"Belegfeld 2",
-		# Weitere Felder
-		"Skonto",
-		"Buchungstext",
-		# OPOS-Informationen
-		"Postensperre",
-		"Diverse Adressnummer",
-		"Geschäftspartnerbank",
-		"Sachverhalt",
-		"Zinssperre",
-		# Digitaler Beleg
-		"Beleglink",
-		# Beleginfo
-		"Beleginfo - Art 1",
-		"Beleginfo - Inhalt 1",
-		"Beleginfo - Art 2",
-		"Beleginfo - Inhalt 2",
-		"Beleginfo - Art 3",
-		"Beleginfo - Inhalt 3",
-		"Beleginfo - Art 4",
-		"Beleginfo - Inhalt 4",
-		"Beleginfo - Art 5",
-		"Beleginfo - Inhalt 5",
-		"Beleginfo - Art 6",
-		"Beleginfo - Inhalt 6",
-		"Beleginfo - Art 7",
-		"Beleginfo - Inhalt 7",
-		"Beleginfo - Art 8",
-		"Beleginfo - Inhalt 8",
-		# Kostenrechnung
-		"Kost 1 - Kostenstelle",
-		"Kost 2 - Kostenstelle",
-		"Kost-Menge",
-		# Steuerrechnung
-		"EU-Land u. UStID",
-		"EU-Steuersatz",
-		"Abw. Versteuerungsart",
-		# L+L Sachverhalt
-		"Sachverhalt L+L",
-		"Funktionsergänzung L+L",
-		# Funktion Steuerschlüssel 49
-		"BU 49 Hauptfunktionstyp",
-		"BU 49 Hauptfunktionsnummer",
-		"BU 49 Funktionsergänzung",
-		# Zusatzinformationen
-		"Zusatzinformation - Art 1",
-		"Zusatzinformation - Inhalt 1",
-		"Zusatzinformation - Art 2",
-		"Zusatzinformation - Inhalt 2",
-		"Zusatzinformation - Art 3",
-		"Zusatzinformation - Inhalt 3",
-		"Zusatzinformation - Art 4",
-		"Zusatzinformation - Inhalt 4",
-		"Zusatzinformation - Art 5",
-		"Zusatzinformation - Inhalt 5",
-		"Zusatzinformation - Art 6",
-		"Zusatzinformation - Inhalt 6",
-		"Zusatzinformation - Art 7",
-		"Zusatzinformation - Inhalt 7",
-		"Zusatzinformation - Art 8",
-		"Zusatzinformation - Inhalt 8",
-		"Zusatzinformation - Art 9",
-		"Zusatzinformation - Inhalt 9",
-		"Zusatzinformation - Art 10",
-		"Zusatzinformation - Inhalt 10",
-		"Zusatzinformation - Art 11",
-		"Zusatzinformation - Inhalt 11",
-		"Zusatzinformation - Art 12",
-		"Zusatzinformation - Inhalt 12",
-		"Zusatzinformation - Art 13",
-		"Zusatzinformation - Inhalt 13",
-		"Zusatzinformation - Art 14",
-		"Zusatzinformation - Inhalt 14",
-		"Zusatzinformation - Art 15",
-		"Zusatzinformation - Inhalt 15",
-		"Zusatzinformation - Art 16",
-		"Zusatzinformation - Inhalt 16",
-		"Zusatzinformation - Art 17",
-		"Zusatzinformation - Inhalt 17",
-		"Zusatzinformation - Art 18",
-		"Zusatzinformation - Inhalt 18",
-		"Zusatzinformation - Art 19",
-		"Zusatzinformation - Inhalt 19",
-		"Zusatzinformation - Art 20",
-		"Zusatzinformation - Inhalt 20",
-		# Mengenfelder LuF
-		"Stück",
-		"Gewicht",
-		# Forderungsart
-		"Zahlweise",
-		"Forderungsart",
-		"Veranlagungsjahr",
-		"Zugeordnete Fälligkeit",
-		# Weitere Felder
-		"Skontotyp",
-		# Anzahlungen
-		"Auftragsnummer",
-		"Buchungstyp",
-		"USt-Schlüssel (Anzahlungen)",
-		"EU-Land (Anzahlungen)",
-		"Sachverhalt L+L (Anzahlungen)",
-		"EU-Steuersatz (Anzahlungen)",
-		"Erlöskonto (Anzahlungen)",
-		# Stapelinformationen
-		"Herkunft-Kz",
-		# Technische Identifikation
-		"Buchungs GUID",
-		# Kostenrechnung
-		"Kost-Datum",
-		# OPOS-Informationen
-		"SEPA-Mandatsreferenz",
-		"Skontosperre",
-		# Gesellschafter und Sonderbilanzsachverhalt
-		"Gesellschaftername",
-		"Beteiligtennummer",
-		"Identifikationsnummer",
-		"Zeichnernummer",
-		# OPOS-Informationen
-		"Postensperre bis",
-		# Gesellschafter und Sonderbilanzsachverhalt
-		"Bezeichnung SoBil-Sachverhalt",
-		"Kennzeichen SoBil-Buchung",
-		# Stapelinformationen
-		"Festschreibung",
-		# Datum
-		"Leistungsdatum",
-		"Datum Zuord. Steuerperiode",
-		# OPOS-Informationen
-		"Fälligkeit",
-		# Konto/Gegenkonto
-		"Generalumkehr (GU)",
-		# Steuersatz für Steuerschlüssel
-		"Steuersatz",
-		"Land"
-	]
+	return header
 
-	empty_df = pd.DataFrame(columns=columns)
-	data_df = pd.DataFrame.from_records(data)
-
-	result = empty_df.append(data_df)
-	result['Belegdatum'] = pd.to_datetime(result['Belegdatum'])
-
-	header = ';'.join(header).encode('latin_1')
-	data = result.to_csv(
-		sep=b';',
-		# European decimal seperator
-		decimal=',',
-		# Windows "ANSI" encoding
-		encoding='latin_1',
-		# format date as DDMM
-		date_format='%d%m',
-		# Windows line terminator
-		line_terminator=b'\r\n',
-		# Do not number rows
-		index=False,
-		# Use all columns defined above
-		columns=columns
-	)
-
-	return header + b'\r\n' + data
 
 @frappe.whitelist()
 def download_datev_csv(filters=None):
@@ -438,8 +355,31 @@
 		filters = json.loads(filters)
 
 	validate(filters)
-	data = get_gl_entries(filters, as_dict=1)
 
-	frappe.response['result'] = get_datev_csv(data, filters)
-	frappe.response['doctype'] = 'EXTF_Buchungsstapel'
-	frappe.response['type'] = 'csv'
+	# This is where my zip will be written
+	zip_buffer = BytesIO()
+	# This is my zip file
+	datev_zip = zipfile.ZipFile(zip_buffer, mode='w', compression=zipfile.ZIP_DEFLATED)
+
+	transactions = get_transactions(filters)
+	transactions_csv = get_datev_csv(transactions, filters, csv_class=Transactions)
+	datev_zip.writestr('EXTF_Buchungsstapel.csv', transactions_csv)
+
+	account_names = get_account_names(filters)
+	account_names_csv = get_datev_csv(account_names, filters, csv_class=AccountNames)
+	datev_zip.writestr('EXTF_Kontenbeschriftungen.csv', account_names_csv)
+
+	customers = get_customers(filters)
+	customers_csv = get_datev_csv(customers, filters, csv_class=DebtorsCreditors)
+	datev_zip.writestr('EXTF_Kunden.csv', customers_csv)
+
+	suppliers = get_suppliers(filters)
+	suppliers_csv = get_datev_csv(suppliers, filters, csv_class=DebtorsCreditors)
+	datev_zip.writestr('EXTF_Lieferanten.csv', suppliers_csv)
+	
+	# You must call close() before exiting your program or essential records will not be written.
+	datev_zip.close()
+
+	frappe.response['filecontent'] = zip_buffer.getvalue()
+	frappe.response['filename'] = 'DATEV.zip'
+	frappe.response['type'] = 'binary'
diff --git a/erpnext/regional/report/datev/datev_constants.py b/erpnext/regional/report/datev/datev_constants.py
new file mode 100644
index 0000000..1c9bd23
--- /dev/null
+++ b/erpnext/regional/report/datev/datev_constants.py
@@ -0,0 +1,512 @@
+# coding: utf-8
+"""Constants used in datev.py."""
+
+TRANSACTION_COLUMNS = [
+	# All possible columns must tbe listed here, because DATEV requires them to
+	# be present in the CSV.
+	# ---
+	# Umsatz
+	"Umsatz (ohne Soll/Haben-Kz)",
+	"Soll/Haben-Kennzeichen",
+	"WKZ Umsatz",
+	"Kurs",
+	"Basis-Umsatz",
+	"WKZ Basis-Umsatz",
+	# Konto/Gegenkonto
+	"Kontonummer",
+	"Gegenkonto (ohne BU-Schlüssel)",
+	"BU-Schlüssel",
+	# Datum
+	"Belegdatum",
+	# Belegfelder
+	"Belegfeld 1",
+	"Belegfeld 2",
+	# Weitere Felder
+	"Skonto",
+	"Buchungstext",
+	# OPOS-Informationen
+	"Postensperre",
+	"Diverse Adressnummer",
+	"Geschäftspartnerbank",
+	"Sachverhalt",
+	"Zinssperre",
+	# Digitaler Beleg
+	"Beleglink",
+	# Beleginfo
+	"Beleginfo - Art 1",
+	"Beleginfo - Inhalt 1",
+	"Beleginfo - Art 2",
+	"Beleginfo - Inhalt 2",
+	"Beleginfo - Art 3",
+	"Beleginfo - Inhalt 3",
+	"Beleginfo - Art 4",
+	"Beleginfo - Inhalt 4",
+	"Beleginfo - Art 5",
+	"Beleginfo - Inhalt 5",
+	"Beleginfo - Art 6",
+	"Beleginfo - Inhalt 6",
+	"Beleginfo - Art 7",
+	"Beleginfo - Inhalt 7",
+	"Beleginfo - Art 8",
+	"Beleginfo - Inhalt 8",
+	# Kostenrechnung
+	"Kost 1 - Kostenstelle",
+	"Kost 2 - Kostenstelle",
+	"Kost-Menge",
+	# Steuerrechnung
+	"EU-Land u. UStID",
+	"EU-Steuersatz",
+	"Abw. Versteuerungsart",
+	# L+L Sachverhalt
+	"Sachverhalt L+L",
+	"Funktionsergänzung L+L",
+	# Funktion Steuerschlüssel 49
+	"BU 49 Hauptfunktionstyp",
+	"BU 49 Hauptfunktionsnummer",
+	"BU 49 Funktionsergänzung",
+	# Zusatzinformationen
+	"Zusatzinformation - Art 1",
+	"Zusatzinformation - Inhalt 1",
+	"Zusatzinformation - Art 2",
+	"Zusatzinformation - Inhalt 2",
+	"Zusatzinformation - Art 3",
+	"Zusatzinformation - Inhalt 3",
+	"Zusatzinformation - Art 4",
+	"Zusatzinformation - Inhalt 4",
+	"Zusatzinformation - Art 5",
+	"Zusatzinformation - Inhalt 5",
+	"Zusatzinformation - Art 6",
+	"Zusatzinformation - Inhalt 6",
+	"Zusatzinformation - Art 7",
+	"Zusatzinformation - Inhalt 7",
+	"Zusatzinformation - Art 8",
+	"Zusatzinformation - Inhalt 8",
+	"Zusatzinformation - Art 9",
+	"Zusatzinformation - Inhalt 9",
+	"Zusatzinformation - Art 10",
+	"Zusatzinformation - Inhalt 10",
+	"Zusatzinformation - Art 11",
+	"Zusatzinformation - Inhalt 11",
+	"Zusatzinformation - Art 12",
+	"Zusatzinformation - Inhalt 12",
+	"Zusatzinformation - Art 13",
+	"Zusatzinformation - Inhalt 13",
+	"Zusatzinformation - Art 14",
+	"Zusatzinformation - Inhalt 14",
+	"Zusatzinformation - Art 15",
+	"Zusatzinformation - Inhalt 15",
+	"Zusatzinformation - Art 16",
+	"Zusatzinformation - Inhalt 16",
+	"Zusatzinformation - Art 17",
+	"Zusatzinformation - Inhalt 17",
+	"Zusatzinformation - Art 18",
+	"Zusatzinformation - Inhalt 18",
+	"Zusatzinformation - Art 19",
+	"Zusatzinformation - Inhalt 19",
+	"Zusatzinformation - Art 20",
+	"Zusatzinformation - Inhalt 20",
+	# Mengenfelder LuF
+	"Stück",
+	"Gewicht",
+	# Forderungsart
+	"Zahlweise",
+	"Forderungsart",
+	"Veranlagungsjahr",
+	"Zugeordnete Fälligkeit",
+	# Weitere Felder
+	"Skontotyp",
+	# Anzahlungen
+	"Auftragsnummer",
+	"Buchungstyp",
+	"USt-Schlüssel (Anzahlungen)",
+	"EU-Land (Anzahlungen)",
+	"Sachverhalt L+L (Anzahlungen)",
+	"EU-Steuersatz (Anzahlungen)",
+	"Erlöskonto (Anzahlungen)",
+	# Stapelinformationen
+	"Herkunft-Kz",
+	# Technische Identifikation
+	"Buchungs GUID",
+	# Kostenrechnung
+	"Kost-Datum",
+	# OPOS-Informationen
+	"SEPA-Mandatsreferenz",
+	"Skontosperre",
+	# Gesellschafter und Sonderbilanzsachverhalt
+	"Gesellschaftername",
+	"Beteiligtennummer",
+	"Identifikationsnummer",
+	"Zeichnernummer",
+	# OPOS-Informationen
+	"Postensperre bis",
+	# Gesellschafter und Sonderbilanzsachverhalt
+	"Bezeichnung SoBil-Sachverhalt",
+	"Kennzeichen SoBil-Buchung",
+	# Stapelinformationen
+	"Festschreibung",
+	# Datum
+	"Leistungsdatum",
+	"Datum Zuord. Steuerperiode",
+	# OPOS-Informationen
+	"Fälligkeit",
+	# Konto/Gegenkonto
+	"Generalumkehr (GU)",
+	# Steuersatz für Steuerschlüssel
+	"Steuersatz",
+	"Land"
+]
+
+DEBTOR_CREDITOR_COLUMNS = [
+	# All possible columns must tbe listed here, because DATEV requires them to
+	# be present in the CSV.
+	# Columns "Leerfeld" have been replaced with "Leerfeld #" to not confuse pandas
+	# ---
+	"Konto",
+	"Name (Adressatentyp Unternehmen)",
+	"Unternehmensgegenstand",
+	"Name (Adressatentyp natürl. Person)",
+	"Vorname (Adressatentyp natürl. Person)",
+	"Name (Adressatentyp keine Angabe)",
+	"Adressatentyp",
+	"Kurzbezeichnung",
+	"EU-Land",
+	"EU-USt-IdNr.",
+	"Anrede",
+	"Titel/Akad. Grad",
+	"Adelstitel",
+	"Namensvorsatz",
+	"Adressart",
+	"Straße",
+	"Postfach",
+	"Postleitzahl",
+	"Ort",
+	"Land",
+	"Versandzusatz",
+	"Adresszusatz",
+	"Abweichende Anrede",
+	"Abw. Zustellbezeichnung 1",
+	"Abw. Zustellbezeichnung 2",
+	"Kennz. Korrespondenzadresse",
+	"Adresse gültig von",
+	"Adresse gültig bis",
+	"Telefon",
+	"Bemerkung (Telefon)",
+	"Telefon Geschäftsleitung",
+	"Bemerkung (Telefon GL)",
+	"E-Mail",
+	"Bemerkung (E-Mail)",
+	"Internet",
+	"Bemerkung (Internet)",
+	"Fax",
+	"Bemerkung (Fax)",
+	"Sonstige",
+	"Bemerkung (Sonstige)",
+	"Bankleitzahl 1",
+	"Bankbezeichnung 1",
+	"Bankkonto-Nummer 1",
+	"Länderkennzeichen 1",
+	"IBAN 1",
+	"Leerfeld 1",
+	"SWIFT-Code 1",
+	"Abw. Kontoinhaber 1",
+	"Kennz. Haupt-Bankverb. 1",
+	"Bankverb. 1 Gültig von",
+	"Bankverb. 1 Gültig bis",
+	"Bankleitzahl 2",
+	"Bankbezeichnung 2",
+	"Bankkonto-Nummer 2",
+	"Länderkennzeichen 2",
+	"IBAN 2",
+	"Leerfeld 2",
+	"SWIFT-Code 2",
+	"Abw. Kontoinhaber 2",
+	"Kennz. Haupt-Bankverb. 2",
+	"Bankverb. 2 gültig von",
+	"Bankverb. 2 gültig bis",
+	"Bankleitzahl 3",
+	"Bankbezeichnung 3",
+	"Bankkonto-Nummer 3",
+	"Länderkennzeichen 3",
+	"IBAN 3",
+	"Leerfeld 3",
+	"SWIFT-Code 3",
+	"Abw. Kontoinhaber 3",
+	"Kennz. Haupt-Bankverb. 3",
+	"Bankverb. 3 gültig von",
+	"Bankverb. 3 gültig bis",
+	"Bankleitzahl 4",
+	"Bankbezeichnung 4",
+	"Bankkonto-Nummer 4",
+	"Länderkennzeichen 4",
+	"IBAN 4",
+	"Leerfeld 4",
+	"SWIFT-Code 4",
+	"Abw. Kontoinhaber 4",
+	"Kennz. Haupt-Bankverb. 4",
+	"Bankverb. 4 Gültig von",
+	"Bankverb. 4 Gültig bis",
+	"Bankleitzahl 5",
+	"Bankbezeichnung 5",
+	"Bankkonto-Nummer 5",
+	"Länderkennzeichen 5",
+	"IBAN 5",
+	"Leerfeld 5",
+	"SWIFT-Code 5",
+	"Abw. Kontoinhaber 5",
+	"Kennz. Haupt-Bankverb. 5",
+	"Bankverb. 5 gültig von",
+	"Bankverb. 5 gültig bis",
+	"Leerfeld 6",
+	"Briefanrede",
+	"Grußformel",
+	"Kundennummer",
+	"Steuernummer",
+	"Sprache",
+	"Ansprechpartner",
+	"Vertreter",
+	"Sachbearbeiter",
+	"Diverse-Konto",
+	"Ausgabeziel",
+	"Währungssteuerung",
+	"Kreditlimit (Debitor)",
+	"Zahlungsbedingung",
+	"Fälligkeit in Tagen (Debitor)",
+	"Skonto in Prozent (Debitor)",
+	"Kreditoren-Ziel 1 (Tage)",
+	"Kreditoren-Skonto 1 (%)",
+	"Kreditoren-Ziel 2 (Tage)",
+	"Kreditoren-Skonto 2 (%)",
+	"Kreditoren-Ziel 3 Brutto (Tage)",
+	"Kreditoren-Ziel 4 (Tage)",
+	"Kreditoren-Skonto 4 (%)",
+	"Kreditoren-Ziel 5 (Tage)",
+	"Kreditoren-Skonto 5 (%)",
+	"Mahnung",
+	"Kontoauszug",
+	"Mahntext 1",
+	"Mahntext 2",
+	"Mahntext 3",
+	"Kontoauszugstext",
+	"Mahnlimit Betrag",
+	"Mahnlimit %",
+	"Zinsberechnung",
+	"Mahnzinssatz 1",
+	"Mahnzinssatz 2",
+	"Mahnzinssatz 3",
+	"Lastschrift",
+	"Verfahren",
+	"Mandantenbank",
+	"Zahlungsträger",
+	"Indiv. Feld 1",
+	"Indiv. Feld 2",
+	"Indiv. Feld 3",
+	"Indiv. Feld 4",
+	"Indiv. Feld 5",
+	"Indiv. Feld 6",
+	"Indiv. Feld 7",
+	"Indiv. Feld 8",
+	"Indiv. Feld 9",
+	"Indiv. Feld 10",
+	"Indiv. Feld 11",
+	"Indiv. Feld 12",
+	"Indiv. Feld 13",
+	"Indiv. Feld 14",
+	"Indiv. Feld 15",
+	"Abweichende Anrede (Rechnungsadresse)",
+	"Adressart (Rechnungsadresse)",
+	"Straße (Rechnungsadresse)",
+	"Postfach (Rechnungsadresse)",
+	"Postleitzahl (Rechnungsadresse)",
+	"Ort (Rechnungsadresse)",
+	"Land (Rechnungsadresse)",
+	"Versandzusatz (Rechnungsadresse)",
+	"Adresszusatz (Rechnungsadresse)",
+	"Abw. Zustellbezeichnung 1 (Rechnungsadresse)",
+	"Abw. Zustellbezeichnung 2 (Rechnungsadresse)",
+	"Adresse Gültig von (Rechnungsadresse)",
+	"Adresse Gültig bis (Rechnungsadresse)",
+	"Bankleitzahl 6",
+	"Bankbezeichnung 6",
+	"Bankkonto-Nummer 6",
+	"Länderkennzeichen 6",
+	"IBAN 6",
+	"Leerfeld 7",
+	"SWIFT-Code 6",
+	"Abw. Kontoinhaber 6",
+	"Kennz. Haupt-Bankverb. 6",
+	"Bankverb 6 gültig von",
+	"Bankverb 6 gültig bis",
+	"Bankleitzahl 7",
+	"Bankbezeichnung 7",
+	"Bankkonto-Nummer 7",
+	"Länderkennzeichen 7",
+	"IBAN 7",
+	"Leerfeld 8",
+	"SWIFT-Code 7",
+	"Abw. Kontoinhaber 7",
+	"Kennz. Haupt-Bankverb. 7",
+	"Bankverb 7 gültig von",
+	"Bankverb 7 gültig bis",
+	"Bankleitzahl 8",
+	"Bankbezeichnung 8",
+	"Bankkonto-Nummer 8",
+	"Länderkennzeichen 8",
+	"IBAN 8",
+	"Leerfeld 9",
+	"SWIFT-Code 8",
+	"Abw. Kontoinhaber 8",
+	"Kennz. Haupt-Bankverb. 8",
+	"Bankverb 8 gültig von",
+	"Bankverb 8 gültig bis",
+	"Bankleitzahl 9",
+	"Bankbezeichnung 9",
+	"Bankkonto-Nummer 9",
+	"Länderkennzeichen 9",
+	"IBAN 9",
+	"Leerfeld 10",
+	"SWIFT-Code 9",
+	"Abw. Kontoinhaber 9",
+	"Kennz. Haupt-Bankverb. 9",
+	"Bankverb 9 gültig von",
+	"Bankverb 9 gültig bis",
+	"Bankleitzahl 10",
+	"Bankbezeichnung 10",
+	"Bankkonto-Nummer 10",
+	"Länderkennzeichen 10",
+	"IBAN 10",
+	"Leerfeld 11",
+	"SWIFT-Code 10",
+	"Abw. Kontoinhaber 10",
+	"Kennz. Haupt-Bankverb. 10",
+	"Bankverb 10 gültig von",
+	"Bankverb 10 gültig bis",
+	"Nummer Fremdsystem",
+	"Insolvent",
+	"SEPA-Mandatsreferenz 1",
+	"SEPA-Mandatsreferenz 2",
+	"SEPA-Mandatsreferenz 3",
+	"SEPA-Mandatsreferenz 4",
+	"SEPA-Mandatsreferenz 5",
+	"SEPA-Mandatsreferenz 6",
+	"SEPA-Mandatsreferenz 7",
+	"SEPA-Mandatsreferenz 8",
+	"SEPA-Mandatsreferenz 9",
+	"SEPA-Mandatsreferenz 10",
+	"Verknüpftes OPOS-Konto",
+	"Mahnsperre bis",
+	"Lastschriftsperre bis",
+	"Zahlungssperre bis",
+	"Gebührenberechnung",
+	"Mahngebühr 1",
+	"Mahngebühr 2",
+	"Mahngebühr 3",
+	"Pauschalberechnung",
+	"Verzugspauschale 1",
+	"Verzugspauschale 2",
+	"Verzugspauschale 3",
+	"Alternativer Suchname",
+	"Status",
+	"Anschrift manuell geändert (Korrespondenzadresse)",
+	"Anschrift individuell (Korrespondenzadresse)",
+	"Anschrift manuell geändert (Rechnungsadresse)",
+	"Anschrift individuell (Rechnungsadresse)",
+	"Fristberechnung bei Debitor",
+	"Mahnfrist 1",
+	"Mahnfrist 2",
+	"Mahnfrist 3",
+	"Letzte Frist"
+]
+
+ACCOUNT_NAME_COLUMNS = [
+	# Account number
+	"Konto",
+	# Account name
+	"Kontenbeschriftung",
+	# Language of the account name 
+	# "de-DE" or "en-GB"
+	"Sprach-ID"
+]
+
+QUERY_REPORT_COLUMNS = [
+	{
+		"label": "Umsatz (ohne Soll/Haben-Kz)",
+		"fieldname": "Umsatz (ohne Soll/Haben-Kz)",
+		"fieldtype": "Currency",
+	},
+	{
+		"label": "Soll/Haben-Kennzeichen",
+		"fieldname": "Soll/Haben-Kennzeichen",
+		"fieldtype": "Data",
+	},
+	{
+		"label": "Kontonummer",
+		"fieldname": "Kontonummer",
+		"fieldtype": "Data",
+	},
+	{
+		"label": "Gegenkonto (ohne BU-Schlüssel)",
+		"fieldname": "Gegenkonto (ohne BU-Schlüssel)",
+		"fieldtype": "Data",
+	},
+	{
+		"label": "Belegdatum",
+		"fieldname": "Belegdatum",
+		"fieldtype": "Date",
+	},
+	{
+		"label": "Buchungstext",
+		"fieldname": "Buchungstext",
+		"fieldtype": "Text",
+	},
+	{
+		"label": "Beleginfo - Art 1",
+		"fieldname": "Beleginfo - Art 1",
+		"fieldtype": "Data",
+	},
+	{
+		"label": "Beleginfo - Inhalt 1",
+		"fieldname": "Beleginfo - Inhalt 1",
+		"fieldtype": "Data",
+	},
+	{
+		"label": "Beleginfo - Art 2",
+		"fieldname": "Beleginfo - Art 2",
+		"fieldtype": "Data",
+	},
+	{
+		"label": "Beleginfo - Inhalt 2",
+		"fieldname": "Beleginfo - Inhalt 2",
+		"fieldtype": "Data",
+	}
+]
+
+class DataCategory():
+	"""Field of the CSV Header."""
+
+	DEBTORS_CREDITORS = "16"
+	ACCOUNT_NAMES = "20"
+	TRANSACTIONS = "21"
+	POSTING_TEXT_CONSTANTS = "67"
+
+class FormatName():
+	"""Field of the CSV Header, corresponds to DataCategory."""
+
+	DEBTORS_CREDITORS = "Debitoren/Kreditoren"
+	ACCOUNT_NAMES = "Kontenbeschriftungen"
+	TRANSACTIONS = "Buchungsstapel"
+	POSTING_TEXT_CONSTANTS = "Buchungstextkonstanten"
+
+class Transactions():
+	DATA_CATEGORY = DataCategory.TRANSACTIONS
+	FORMAT_NAME = FormatName.TRANSACTIONS
+	COLUMNS = TRANSACTION_COLUMNS
+
+class DebtorsCreditors():
+	DATA_CATEGORY = DataCategory.DEBTORS_CREDITORS
+	FORMAT_NAME = FormatName.DEBTORS_CREDITORS
+	COLUMNS = DEBTOR_CREDITOR_COLUMNS
+
+class AccountNames():
+	DATA_CATEGORY = DataCategory.ACCOUNT_NAMES
+	FORMAT_NAME = FormatName.ACCOUNT_NAMES
+	COLUMNS = ACCOUNT_NAME_COLUMNS
diff --git a/erpnext/regional/report/datev/test_datev.py b/erpnext/regional/report/datev/test_datev.py
new file mode 100644
index 0000000..3cc65fe
--- /dev/null
+++ b/erpnext/regional/report/datev/test_datev.py
@@ -0,0 +1,244 @@
+# coding=utf-8
+from __future__ import unicode_literals
+
+import os
+import json
+import zipfile
+from six import BytesIO
+from unittest import TestCase
+
+import frappe
+from frappe.utils import getdate, today, now_datetime, cstr
+from frappe.test_runner import make_test_objects
+from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
+from erpnext.accounts.doctype.account.chart_of_accounts.chart_of_accounts import create_charts
+
+from erpnext.regional.report.datev.datev import validate
+from erpnext.regional.report.datev.datev import get_transactions
+from erpnext.regional.report.datev.datev import get_customers
+from erpnext.regional.report.datev.datev import get_suppliers
+from erpnext.regional.report.datev.datev import get_account_names
+from erpnext.regional.report.datev.datev import get_datev_csv
+from erpnext.regional.report.datev.datev import get_header
+from erpnext.regional.report.datev.datev import download_datev_csv
+
+from erpnext.regional.report.datev.datev_constants import DataCategory
+from erpnext.regional.report.datev.datev_constants import Transactions
+from erpnext.regional.report.datev.datev_constants import DebtorsCreditors
+from erpnext.regional.report.datev.datev_constants import AccountNames
+from erpnext.regional.report.datev.datev_constants import QUERY_REPORT_COLUMNS
+
+def make_company(company_name, abbr):
+	if not frappe.db.exists("Company", company_name):
+		company = frappe.get_doc({
+			"doctype": "Company",
+			"company_name": company_name,
+			"abbr": abbr,
+			"default_currency": "EUR",
+			"country": "Germany",
+			"create_chart_of_accounts_based_on": "Standard Template",
+			"chart_of_accounts": "SKR04 mit Kontonummern"
+		})
+		company.insert()
+	else:
+		company = frappe.get_doc("Company", company_name)
+
+	# indempotent
+	company.create_default_warehouses()
+
+	if not frappe.db.get_value("Cost Center", {"is_group": 0, "company": company.name}):
+		company.create_default_cost_center()
+
+	company.save()
+	return company
+
+def setup_fiscal_year():
+	fiscal_year = None
+	year = cstr(now_datetime().year)
+	if not frappe.db.get_value("Fiscal Year", {"year": year}, "name"):
+		try:
+			fiscal_year = frappe.get_doc({
+				"doctype": "Fiscal Year",
+				"year": year,
+				"year_start_date": "{0}-01-01".format(year),
+				"year_end_date": "{0}-12-31".format(year)
+			})
+			fiscal_year.insert()
+		except frappe.NameError:
+			pass
+
+	if fiscal_year:
+		fiscal_year.set_as_default()
+
+def make_customer_with_account(customer_name, company):
+	acc_name = frappe.db.get_value("Account", {
+			"account_name": customer_name,
+			"company": company.name
+		}, "name")
+
+	if not acc_name:
+		acc = frappe.get_doc({
+			"doctype": "Account",
+			"parent_account": "1 - Forderungen aus Lieferungen und Leistungen - _TG",
+			"account_name": customer_name,
+			"company": company.name,
+			"account_type": "Receivable",
+			"account_number": "10001"
+		})
+		acc.insert()
+		acc_name = acc.name
+
+	if not frappe.db.exists("Customer", customer_name):
+		customer = frappe.get_doc({
+			"doctype": "Customer",		
+			"customer_name": customer_name,
+			"customer_type": "Company",
+			"accounts": [{
+				"company": company.name,
+				"account": acc_name
+			}]
+		})
+		customer.insert()
+	else:
+		customer = frappe.get_doc("Customer", customer_name)
+
+	return customer
+
+def make_item(item_code, company):
+	warehouse_name = frappe.db.get_value("Warehouse", {
+			"warehouse_name": "Stores",
+			"company": company.name
+		}, "name")
+
+	if not frappe.db.exists("Item", item_code):
+		item = frappe.get_doc({
+			"doctype": "Item",
+			"item_code": item_code,
+			"item_name": item_code,
+			"description": item_code,
+			"item_group": "All Item Groups",
+			"is_stock_item": 0,
+			"is_purchase_item": 0,
+			"is_customer_provided_item": 0,
+			"item_defaults": [{
+				"default_warehouse": warehouse_name,
+				"company": company.name
+			}]
+		})
+		item.insert()
+	else:
+		item = frappe.get_doc("Item", item_code)
+	return item
+
+def make_datev_settings(company):
+	if not frappe.db.exists("DATEV Settings", company.name):
+		frappe.get_doc({
+			"doctype": "DATEV Settings",
+			"client": company.name,
+			"client_number": "12345",
+			"consultant_number": "67890"
+		}).insert()
+
+
+class TestDatev(TestCase):
+	def setUp(self):
+		self.company = make_company("_Test GmbH", "_TG")
+		self.customer = make_customer_with_account("_Test Kunde GmbH", self.company)
+		self.filters = {
+			"company": self.company.name,
+			"from_date": today(),
+			"to_date": today()
+		}
+
+		make_datev_settings(self.company)
+		item = make_item("_Test Item", self.company)
+		setup_fiscal_year()
+
+		warehouse = frappe.db.get_value("Item Default", {
+				"parent": item.name, 
+				"company": self.company.name
+			}, "default_warehouse")
+
+		income_account = frappe.db.get_value("Account", {
+				"account_number": "4200", 
+				"company": self.company.name
+			}, "name")
+
+		tax_account = frappe.db.get_value("Account", {
+				"account_number": "3806", 
+				"company": self.company.name
+			}, "name")
+
+		si = create_sales_invoice(
+			company=self.company.name,
+			customer=self.customer.name,
+			currency=self.company.default_currency,
+			debit_to=self.customer.accounts[0].account,
+			income_account="4200 - Erlöse - _TG",
+			expense_account="6990 - Herstellungskosten - _TG",
+			cost_center=self.company.cost_center,
+			warehouse=warehouse,
+			item=item.name,
+			do_not_save=1
+		)
+
+		si.append("taxes", {
+			"charge_type": "On Net Total",
+			"account_head": tax_account,
+			"description": "Umsatzsteuer 19 %",
+			"rate": 19
+		})
+
+		si.save()
+		si.submit()
+
+	def test_columns(self):
+		def is_subset(get_data, allowed_keys):
+			"""
+			Validate that the dict contains only allowed keys.
+			
+			Params:
+			get_data -- Function that returns a list of dicts.
+			allowed_keys -- List of allowed keys
+			"""
+			data = get_data(self.filters)
+			if data == []:
+				# No data and, therefore, no columns is okay
+				return True
+			actual_set = set(data[0].keys())
+			# allowed set must be interpreted as unicode to match the actual set
+			allowed_set = set({frappe.as_unicode(key) for key in allowed_keys})
+			return actual_set.issubset(allowed_set)
+
+		self.assertTrue(is_subset(get_transactions, Transactions.COLUMNS))
+		self.assertTrue(is_subset(get_customers, DebtorsCreditors.COLUMNS))
+		self.assertTrue(is_subset(get_suppliers, DebtorsCreditors.COLUMNS))
+		self.assertTrue(is_subset(get_account_names, AccountNames.COLUMNS))
+
+	def test_header(self):
+		self.assertTrue(Transactions.DATA_CATEGORY in get_header(self.filters, Transactions))
+		self.assertTrue(AccountNames.DATA_CATEGORY in get_header(self.filters, AccountNames))
+		self.assertTrue(DebtorsCreditors.DATA_CATEGORY in get_header(self.filters, DebtorsCreditors))
+
+	def test_csv(self):
+		test_data = [{
+			"Umsatz (ohne Soll/Haben-Kz)": 100,
+			"Soll/Haben-Kennzeichen": "H",
+			"Kontonummer": "4200",
+			"Gegenkonto (ohne BU-Schlüssel)": "10000",
+			"Belegdatum": today(),
+			"Buchungstext": "No remark",
+			"Beleginfo - Art 1": "Sales Invoice",
+			"Beleginfo - Inhalt 1": "SINV-0001"
+		}]
+		get_datev_csv(data=test_data, filters=self.filters, csv_class=Transactions)
+
+	def test_download(self):
+		"""Assert that the returned file is a ZIP file."""
+		download_datev_csv(self.filters)
+
+		# zipfile.is_zipfile() expects a file-like object
+		zip_buffer = BytesIO()
+		zip_buffer.write(frappe.response['filecontent'])
+
+		self.assertTrue(zipfile.is_zipfile(zip_buffer))
diff --git a/erpnext/regional/report/gstr_1/gstr_1.js b/erpnext/regional/report/gstr_1/gstr_1.js
index 9682768..1a7ff2b 100644
--- a/erpnext/regional/report/gstr_1/gstr_1.js
+++ b/erpnext/regional/report/gstr_1/gstr_1.js
@@ -52,17 +52,28 @@
 	],
 	onload: function (report) {
 
-		report.page.add_inner_button(__("Download as Json"), function () {
+		report.page.add_inner_button(__("Download as JSON"), function () {
 			var filters = report.get_values();
 
-			const args = {
-				cmd: 'erpnext.regional.report.gstr_1.gstr_1.get_json',
-				data: report.data,
-				report_name: report.report_name,
-				filters: filters
-			};
-
-			open_url_post(frappe.request.url, args);
+			frappe.call({
+				method: 'erpnext.regional.report.gstr_1.gstr_1.get_json',
+				args: {
+					data: report.data,
+					report_name: report.report_name,
+					filters: filters
+				},
+				callback: function(r) {
+					if (r.message) {
+						const args = {
+							cmd: 'erpnext.regional.report.gstr_1.gstr_1.download_json_file',
+							data: r.message.data,
+							report_name: r.message.report_name,
+							report_type: r.message.report_type
+						};
+						open_url_post(frappe.request.url, args);
+					}
+				}
+			});
 		});
 	}
 }
diff --git a/erpnext/regional/report/gstr_1/gstr_1.py b/erpnext/regional/report/gstr_1/gstr_1.py
index 090616b..4f9cc7f 100644
--- a/erpnext/regional/report/gstr_1/gstr_1.py
+++ b/erpnext/regional/report/gstr_1/gstr_1.py
@@ -532,16 +532,9 @@
 		self.columns = self.invoice_columns + self.tax_columns + self.other_columns
 
 @frappe.whitelist()
-def get_json():
-	data = frappe._dict(frappe.local.form_dict)
-
-	del data["cmd"]
-	if "csrf_token" in data:
-		del data["csrf_token"]
-
-	filters = json.loads(data["filters"])
-	report_data = json.loads(data["data"])
-	report_name = data["report_name"]
+def get_json(filters, report_name, data):
+	filters = json.loads(filters)
+	report_data = json.loads(data)
 	gstin = get_company_gstin_number(filters["company"])
 
 	fp = "%02d%s" % (getdate(filters["to_date"]).month, getdate(filters["to_date"]).year)
@@ -575,7 +568,11 @@
 		out = get_export_json(res)
 		gst_json["exp"] = out
 
-	download_json_file(report_name, filters["type_of_business"], gst_json)
+	return {
+		'report_name': report_name,
+		'report_type': filters['type_of_business'],
+		'data': gst_json
+	}
 
 def get_b2b_json(res, gstin):
 	inv_type, out = {"Registered Regular": "R", "Deemed Export": "DE", "URD": "URD", "SEZ": "SEZ"}, []
@@ -722,11 +719,15 @@
 	if gstin:
 		return gstin[0]["gstin"]
 	else:
-		frappe.throw(_("Please set valid GSTIN No. in Company Address"))
+		frappe.throw(_("Please set valid GSTIN No. in Company Address for company {0}".format(
+			frappe.bold(company)
+		)))
 
-def download_json_file(filename, report_type, data):
+@frappe.whitelist()
+def download_json_file():
 	''' download json content in a file '''
-	frappe.response['filename'] = frappe.scrub("{0} {1}".format(filename, report_type)) + '.json'
-	frappe.response['filecontent'] = json.dumps(data)
+	data = frappe._dict(frappe.local.form_dict)
+	frappe.response['filename'] = frappe.scrub("{0} {1}".format(data['report_name'], data['report_type'])) + '.json'
+	frappe.response['filecontent'] = data['data']
 	frappe.response['content_type'] = 'application/json'
 	frappe.response['type'] = 'download'
diff --git a/erpnext/selling/doctype/customer/customer.js b/erpnext/selling/doctype/customer/customer.js
index 458a56c..cca8efe 100644
--- a/erpnext/selling/doctype/customer/customer.js
+++ b/erpnext/selling/doctype/customer/customer.js
@@ -49,9 +49,9 @@
 		})
 		frm.set_query('customer_primary_address', function(doc) {
 			return {
-				query: "erpnext.selling.doctype.customer.customer.get_customer_primary_address",
 				filters: {
-					'customer': doc.name
+					'link_doctype': 'Customer',
+					'link_name': doc.name
 				}
 			}
 		})
diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py
index a8e3ce4..57308ce 100644
--- a/erpnext/selling/doctype/customer/customer.py
+++ b/erpnext/selling/doctype/customer/customer.py
@@ -204,6 +204,40 @@
 		else:
 			frappe.msgprint(_("Multiple Loyalty Program found for the Customer. Please select manually."))
 
+	def create_onboarding_docs(self, args):
+		defaults = frappe.defaults.get_defaults()
+		for i in range(1, args.get('max_count')):
+			customer = args.get('customer_name_' + str(i))
+			if customer:
+				try:
+					doc = frappe.get_doc({
+						'doctype': self.doctype,
+						'customer_name': customer,
+						'customer_type': 'Company',
+						'customer_group': _('Commercial'),
+						'territory': defaults.get('country'),
+						'company': defaults.get('company')
+					}).insert()
+
+					if args.get('customer_email_' + str(i)):
+						create_contact(customer, self.doctype,
+							doc.name, args.get("customer_email_" + str(i)))
+				except frappe.NameError:
+					pass
+
+def create_contact(contact, party_type, party, email):
+	"""Create contact based on given contact name"""
+	contact = contact.split(' ')
+
+	contact = frappe.get_doc({
+		'doctype': 'Contact',
+		'first_name': contact[0],
+		'last_name': len(contact) > 1 and contact[1] or ""
+	})
+	contact.append('email_ids', dict(email_id=email, is_primary=1))
+	contact.append('links', dict(link_doctype=party_type, link_name=party))
+	contact.insert()
+
 @frappe.whitelist()
 def get_loyalty_programs(doc):
 	''' returns applicable loyalty programs for a customer '''
@@ -397,15 +431,3 @@
 			'customer': customer,
 			'txt': '%%%s%%' % txt
 		})
-
-def get_customer_primary_address(doctype, txt, searchfield, start, page_len, filters):
-	customer = frappe.db.escape(filters.get('customer'))
-	return frappe.db.sql("""
-		select `tabAddress`.name from `tabAddress`, `tabDynamic Link`
-			where `tabAddress`.name = `tabDynamic Link`.parent and `tabDynamic Link`.link_name = %(customer)s
-			and `tabDynamic Link`.link_doctype = 'Customer'
-			and `tabAddress`.name like %(txt)s
-		""", {
-			'customer': customer,
-			'txt': '%%%s%%' % txt
-		})
diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json
index ea04715..64ad1b5 100644
--- a/erpnext/selling/doctype/quotation/quotation.json
+++ b/erpnext/selling/doctype/quotation/quotation.json
@@ -1,3509 +1,1027 @@
 {
-   "allow_copy": 0,
-   "allow_events_in_timeline": 0,
-   "allow_guest_to_view": 0,
-   "allow_import": 1,
-   "allow_rename": 0,
-   "autoname": "naming_series:",
-   "beta": 0,
-   "creation": "2013-05-24 19:29:08",
-   "custom": 0,
-   "docstatus": 0,
-   "doctype": "DocType",
-   "document_type": "Document",
-   "editable_grid": 1,
-   "fields": [
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "customer_section",
-     "fieldtype": "Section 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,
-     "label": "",
-     "length": 0,
-     "no_copy": 0,
-     "options": "fa fa-user",
-     "permlevel": 0,
-     "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": 1,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "default": "{customer_name}",
-     "fieldname": "title",
-     "fieldtype": "Data",
-     "hidden": 1,
-     "ignore_user_permissions": 0,
-     "ignore_xss_filter": 0,
-     "in_filter": 0,
-     "in_global_search": 0,
-     "in_list_view": 0,
-     "in_standard_filter": 0,
-     "label": "Title",
-     "length": 0,
-     "no_copy": 1,
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "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,
-     "default": "",
-     "fieldname": "naming_series",
-     "fieldtype": "Select",
-     "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": "Series",
-     "length": 0,
-     "no_copy": 1,
-     "oldfieldname": "naming_series",
-     "oldfieldtype": "Select",
-     "options": "SAL-QTN-.YYYY.-",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 1,
-     "search_index": 0,
-     "set_only_once": 1,
-     "translatable": 0,
-     "unique": 0
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "default": "Customer",
-     "fetch_if_empty": 0,
-     "fieldname": "quotation_to",
-     "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": 1,
-     "label": "Quotation To",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "quotation_to",
-     "oldfieldtype": "Select",
-     "options": "DocType",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 1,
-     "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": 1,
-     "collapsible": 0,
-     "columns": 0,
-     "depends_on": "",
-     "fetch_if_empty": 0,
-     "fieldname": "party_name",
-     "fieldtype": "Dynamic Link",
-     "hidden": 0,
-     "ignore_user_permissions": 0,
-     "ignore_xss_filter": 0,
-     "in_filter": 0,
-     "in_global_search": 1,
-     "in_list_view": 0,
-     "in_standard_filter": 1,
-     "label": "Party",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "customer",
-     "oldfieldtype": "Link",
-     "options": "quotation_to",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 0,
-     "search_index": 1,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 1,
-     "collapsible": 0,
-     "columns": 0,
-     "fetch_from": "",
-     "fieldname": "customer_name",
-     "fieldtype": "Data",
-     "hidden": 1,
-     "ignore_user_permissions": 0,
-     "ignore_xss_filter": 0,
-     "in_filter": 0,
-     "in_global_search": 1,
-     "in_list_view": 0,
-     "in_standard_filter": 0,
-     "label": "Customer Name",
-     "length": 0,
-     "no_copy": 0,
-     "options": "",
-     "permlevel": 0,
-     "print_hide": 0,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "column_break1",
-     "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,
-     "oldfieldtype": "Column Break",
-     "permlevel": 0,
-     "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,
-     "width": "50%"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "amended_from",
-     "fieldtype": "Link",
-     "hidden": 0,
-     "ignore_user_permissions": 1,
-     "ignore_xss_filter": 0,
-     "in_filter": 0,
-     "in_global_search": 0,
-     "in_list_view": 0,
-     "in_standard_filter": 0,
-     "label": "Amended From",
-     "length": 0,
-     "no_copy": 1,
-     "oldfieldname": "amended_from",
-     "oldfieldtype": "Data",
-     "options": "Quotation",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 0,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "150px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "description": "",
-     "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,
-     "oldfieldname": "company",
-     "oldfieldtype": "Link",
-     "options": "Company",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 1,
-     "report_hide": 0,
-     "reqd": 1,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "150px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "default": "Today",
-     "fieldname": "transaction_date",
-     "fieldtype": "Date",
-     "hidden": 0,
-     "ignore_user_permissions": 0,
-     "ignore_xss_filter": 0,
-     "in_filter": 0,
-     "in_global_search": 0,
-     "in_list_view": 1,
-     "in_standard_filter": 1,
-     "label": "Date",
-     "length": 0,
-     "no_copy": 1,
-     "oldfieldname": "transaction_date",
-     "oldfieldtype": "Date",
-     "permlevel": 0,
-     "print_hide": 0,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 1,
-     "search_index": 1,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "100px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "valid_till",
-     "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": "Valid Till",
-     "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,
-     "default": "Sales",
-     "fieldname": "order_type",
-     "fieldtype": "Select",
-     "hidden": 0,
-     "ignore_user_permissions": 0,
-     "ignore_xss_filter": 0,
-     "in_filter": 0,
-     "in_global_search": 0,
-     "in_list_view": 0,
-     "in_standard_filter": 1,
-     "label": "Order Type",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "order_type",
-     "oldfieldtype": "Select",
-     "options": "\nSales\nMaintenance\nShopping Cart",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 1,
-     "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": 1,
-     "collapsible_depends_on": "",
-     "columns": 0,
-     "depends_on": "party_name",
-     "fieldname": "contact_section",
-     "fieldtype": "Section 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,
-     "label": "Address and Contact",
-     "length": 0,
-     "no_copy": 0,
-     "options": "fa fa-bullhorn",
-     "permlevel": 0,
-     "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": "customer_address",
-     "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": "Customer Address",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Address",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": "address_display",
-     "fieldtype": "Small Text",
-     "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": "Address",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "customer_address",
-     "oldfieldtype": "Small Text",
-     "permlevel": 0,
-     "print_hide": 0,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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,
-     "depends_on": "",
-     "fieldname": "contact_person",
-     "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": "Contact Person",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "contact_person",
-     "oldfieldtype": "Link",
-     "options": "Contact",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": "contact_display",
-     "fieldtype": "Small Text",
-     "hidden": 0,
-     "ignore_user_permissions": 0,
-     "ignore_xss_filter": 0,
-     "in_filter": 0,
-     "in_global_search": 1,
-     "in_list_view": 0,
-     "in_standard_filter": 0,
-     "label": "Contact",
-     "length": 0,
-     "no_copy": 0,
-     "permlevel": 0,
-     "print_hide": 0,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "contact_mobile",
-     "fieldtype": "Small Text",
-     "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": "Mobile No",
-     "length": 0,
-     "no_copy": 0,
-     "permlevel": 0,
-     "print_hide": 0,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "contact_email",
-     "fieldtype": "Data",
-     "hidden": 1,
-     "ignore_user_permissions": 0,
-     "ignore_xss_filter": 0,
-     "in_filter": 0,
-     "in_global_search": 0,
-     "in_list_view": 0,
-     "in_standard_filter": 0,
-     "label": "Contact Email",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Email",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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,
-     "depends_on": "eval:doc.quotaion_to=='Customer' && doc.party_name",
-     "fieldname": "col_break98",
-     "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,
-     "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,
-     "width": "50%"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "shipping_address_name",
-     "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": "Shipping Address",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Address",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": "shipping_address",
-     "fieldtype": "Small Text",
-     "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": "Shipping Address",
-     "length": 0,
-     "no_copy": 0,
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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,
-     "depends_on": "eval:doc.quotaion_to=='Customer' && doc.party_name",
-     "description": "",
-     "fieldname": "customer_group",
-     "fieldtype": "Link",
-     "hidden": 1,
-     "ignore_user_permissions": 0,
-     "ignore_xss_filter": 0,
-     "in_filter": 0,
-     "in_global_search": 0,
-     "in_list_view": 0,
-     "in_standard_filter": 0,
-     "label": "Customer Group",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "customer_group",
-     "oldfieldtype": "Link",
-     "options": "Customer Group",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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,
-     "description": "",
-     "fieldname": "territory",
-     "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": "Territory",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Territory",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": 1,
-     "columns": 0,
-     "fieldname": "currency_and_price_list",
-     "fieldtype": "Section 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,
-     "label": "Currency and Price List",
-     "length": 0,
-     "no_copy": 0,
-     "options": "fa fa-tag",
-     "permlevel": 0,
-     "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": "currency",
-     "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": "Currency",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "currency",
-     "oldfieldtype": "Select",
-     "options": "Currency",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 1,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "100px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "description": "Rate at which customer's currency is converted to company's base currency",
-     "fieldname": "conversion_rate",
-     "fieldtype": "Float",
-     "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": "Exchange Rate",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "conversion_rate",
-     "oldfieldtype": "Currency",
-     "permlevel": 0,
-     "precision": "9",
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 1,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "100px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "column_break2",
-     "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,
-     "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,
-     "width": "50%"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "selling_price_list",
-     "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": "Price List",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "price_list_name",
-     "oldfieldtype": "Select",
-     "options": "Price List",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 1,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "100px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "price_list_currency",
-     "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": "Price List Currency",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Currency",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 1,
-     "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,
-     "description": "Rate at which Price list currency is converted to company's base currency",
-     "fieldname": "plc_conversion_rate",
-     "fieldtype": "Float",
-     "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": "Price List Exchange Rate",
-     "length": 0,
-     "no_copy": 0,
-     "permlevel": 0,
-     "precision": "9",
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 1,
-     "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": "ignore_pricing_rule",
-     "fieldtype": "Check",
-     "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": "Ignore Pricing Rule",
-     "length": 0,
-     "no_copy": 1,
-     "permlevel": 1,
-     "print_hide": 1,
-     "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": "items_section",
-     "fieldtype": "Section 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,
-     "label": "",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldtype": "Section Break",
-     "options": "fa fa-shopping-cart",
-     "permlevel": 0,
-     "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": 1,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "items",
-     "fieldtype": "Table",
-     "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": "Items",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "quotation_details",
-     "oldfieldtype": "Table",
-     "options": "Quotation Item",
-     "permlevel": 0,
-     "print_hide": 0,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 1,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "40px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "pricing_rule_details",
-     "fieldtype": "Section 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,
-     "label": "Pricing Rules",
-     "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": "pricing_rules",
-     "fieldtype": "Table",
-     "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": "Pricing Rule Detail",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Pricing Rule Detail",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 0,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "sec_break23",
-     "fieldtype": "Section 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,
-     "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": "total_qty",
-     "fieldtype": "Float",
-     "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": "Total Quantity",
-     "length": 0,
-     "no_copy": 0,
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 0,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "base_total",
-     "fieldtype": "Currency",
-     "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": "Total (Company Currency)",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Company:company:default_currency",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "base_net_total",
-     "fieldtype": "Currency",
-     "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": "Net Total (Company Currency)",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "net_total",
-     "oldfieldtype": "Currency",
-     "options": "Company:company:default_currency",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 0,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "100px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "column_break_28",
-     "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,
-     "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": "total",
-     "fieldtype": "Currency",
-     "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": "Total",
-     "length": 0,
-     "no_copy": 0,
-     "options": "currency",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 0,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "net_total",
-     "fieldtype": "Currency",
-     "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": "Net Total",
-     "length": 0,
-     "no_copy": 0,
-     "options": "currency",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "total_net_weight",
-     "fieldtype": "Float",
-     "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": "Total Net Weight",
-     "length": 0,
-     "no_copy": 0,
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "taxes_section",
-     "fieldtype": "Section 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,
-     "label": "Taxes and Charges",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldtype": "Section Break",
-     "options": "fa fa-money",
-     "permlevel": 0,
-     "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": "tax_category",
-     "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": "Tax Category",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Tax Category",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "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": "column_break_34",
-     "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,
-     "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": "shipping_rule",
-     "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": "Shipping Rule",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldtype": "Button",
-     "options": "Shipping Rule",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": "section_break_36",
-     "fieldtype": "Section 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,
-     "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": "taxes_and_charges",
-     "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": "Sales Taxes and Charges Template",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "charge",
-     "oldfieldtype": "Link",
-     "options": "Sales Taxes and Charges Template",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": "taxes",
-     "fieldtype": "Table",
-     "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": "Sales Taxes and Charges",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "other_charges",
-     "oldfieldtype": "Table",
-     "options": "Sales Taxes and Charges",
-     "permlevel": 0,
-     "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": 1,
-     "columns": 0,
-     "fieldname": "sec_tax_breakup",
-     "fieldtype": "Section 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,
-     "label": "Tax Breakup",
-     "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": "other_charges_calculation",
-     "fieldtype": "Text",
-     "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": "Taxes and Charges Calculation",
-     "length": 0,
-     "no_copy": 1,
-     "oldfieldtype": "HTML",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "section_break_39",
-     "fieldtype": "Section 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,
-     "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": "base_total_taxes_and_charges",
-     "fieldtype": "Currency",
-     "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": "Total Taxes and Charges (Company Currency)",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "other_charges_total",
-     "oldfieldtype": "Currency",
-     "options": "Company:company:default_currency",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "column_break_42",
-     "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,
-     "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": "total_taxes_and_charges",
-     "fieldtype": "Currency",
-     "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": "Total Taxes and Charges",
-     "length": 0,
-     "no_copy": 0,
-     "options": "currency",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": 1,
-     "collapsible_depends_on": "discount_amount",
-     "columns": 0,
-     "fieldname": "section_break_44",
-     "fieldtype": "Section 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,
-     "label": "Additional Discount and Coupon Code",
-     "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, 
-     "fetch_if_empty": 0, 
-     "fieldname": "coupon_code", 
-     "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": "Coupon Code", 
-     "length": 0, 
-     "no_copy": 0, 
-     "options": "Coupon Code", 
-     "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, 
-     "fetch_if_empty": 0, 
-     "fieldname": "referral_sales_partner", 
-     "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": "Referral Sales Partner", 
-     "length": 0, 
-     "no_copy": 0, 
-     "options": "Sales Partner", 
-     "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,
-     "default": "Grand Total",
-     "fieldname": "apply_discount_on",
-     "fieldtype": "Select",
-     "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": "Apply Additional Discount On",
-     "length": 0,
-     "no_copy": 0,
-     "options": "\nGrand Total\nNet Total",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "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": "base_discount_amount",
-     "fieldtype": "Currency",
-     "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": "Additional Discount Amount (Company Currency)",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Company:company:default_currency",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "column_break_46",
-     "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": "additional_discount_percentage",
-     "fieldtype": "Float",
-     "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": "Additional Discount Percentage",
-     "length": 0,
-     "no_copy": 0,
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "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": "discount_amount",
-     "fieldtype": "Currency",
-     "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": "Additional Discount Amount",
-     "length": 0,
-     "no_copy": 0,
-     "options": "currency",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": "totals",
-     "fieldtype": "Section 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,
-     "label": "",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldtype": "Section Break",
-     "options": "fa fa-money",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": "base_grand_total",
-     "fieldtype": "Currency",
-     "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": "Grand Total (Company Currency)",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "grand_total",
-     "oldfieldtype": "Currency",
-     "options": "Company:company:default_currency",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 0,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "200px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "base_rounding_adjustment",
-     "fieldtype": "Currency",
-     "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": "Rounding Adjustment (Company Currency)",
-     "length": 0,
-     "no_copy": 1,
-     "options": "Company:company:default_currency",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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,
-     "description": "In Words will be visible once you save the Quotation.",
-     "fieldname": "base_in_words",
-     "fieldtype": "Data",
-     "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": "In Words (Company Currency)",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "in_words",
-     "oldfieldtype": "Data",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 0,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "200px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "base_rounded_total",
-     "fieldtype": "Currency",
-     "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": "Rounded Total (Company Currency)",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "rounded_total",
-     "oldfieldtype": "Currency",
-     "options": "Company:company:default_currency",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 0,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "200px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "column_break3",
-     "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,
-     "oldfieldtype": "Column Break",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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,
-     "width": "50%"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "grand_total",
-     "fieldtype": "Currency",
-     "hidden": 0,
-     "ignore_user_permissions": 0,
-     "ignore_xss_filter": 0,
-     "in_filter": 0,
-     "in_global_search": 0,
-     "in_list_view": 1,
-     "in_standard_filter": 0,
-     "label": "Grand Total",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "grand_total_export",
-     "oldfieldtype": "Currency",
-     "options": "currency",
-     "permlevel": 0,
-     "print_hide": 0,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 0,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "200px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "rounding_adjustment",
-     "fieldtype": "Currency",
-     "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": "Rounding Adjustment",
-     "length": 0,
-     "no_copy": 1,
-     "options": "currency",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": 1,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "rounded_total",
-     "fieldtype": "Currency",
-     "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": "Rounded Total",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "rounded_total_export",
-     "oldfieldtype": "Currency",
-     "options": "currency",
-     "permlevel": 0,
-     "print_hide": 0,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 0,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "200px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "in_words",
-     "fieldtype": "Data",
-     "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": "In Words",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "in_words_export",
-     "oldfieldtype": "Data",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 0,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0,
-     "width": "200px"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "collapsible_depends_on": "",
-     "columns": 0,
-     "depends_on": "",
-     "fieldname": "payment_schedule_section",
-     "fieldtype": "Section 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,
-     "label": "Payment Terms",
-     "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": "payment_terms_template",
-     "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": "Payment Terms Template",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Payment Terms Template",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "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": "payment_schedule",
-     "fieldtype": "Table",
-     "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": "Payment Schedule",
-     "length": 0,
-     "no_copy": 1,
-     "options": "Payment Schedule",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "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": 1,
-     "collapsible_depends_on": "terms",
-     "columns": 0,
-     "fieldname": "terms_section_break",
-     "fieldtype": "Section 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,
-     "label": "Terms and Conditions",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldtype": "Section Break",
-     "options": "fa fa-legal",
-     "permlevel": 0,
-     "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": "tc_name",
-     "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": "Terms",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "tc_name",
-     "oldfieldtype": "Link",
-     "options": "Terms and Conditions",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 0,
-     "report_hide": 1,
-     "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": "terms",
-     "fieldtype": "Text Editor",
-     "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": "Term Details",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "terms",
-     "oldfieldtype": "Text Editor",
-     "permlevel": 0,
-     "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": 1,
-     "columns": 0,
-     "fieldname": "print_settings",
-     "fieldtype": "Section 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,
-     "label": "Print Settings",
-     "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": 1,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "letter_head",
-     "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": "Letter Head",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "letter_head",
-     "oldfieldtype": "Select",
-     "options": "Letter Head",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": 1,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "group_same_items",
-     "fieldtype": "Check",
-     "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": "Group same items",
-     "length": 0,
-     "no_copy": 0,
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "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": "column_break_73",
-     "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": 1,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "select_print_heading",
-     "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": "Print Heading",
-     "length": 0,
-     "no_copy": 1,
-     "oldfieldname": "select_print_heading",
-     "oldfieldtype": "Link",
-     "options": "Print Heading",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 0,
-     "remember_last_selected_value": 0,
-     "report_hide": 1,
-     "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": "language",
-     "fieldtype": "Data",
-     "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": "Print Language",
-     "length": 0,
-     "no_copy": 0,
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "subscription_section",
-     "fieldtype": "Section 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,
-     "label": "Auto Repeat Section",
-     "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": "auto_repeat",
-     "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": "Auto Repeat",
-     "length": 0,
-     "no_copy": 1,
-     "options": "Auto Repeat",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": 1,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "depends_on": "eval: doc.auto_repeat",
-     "fieldname": "update_auto_repeat_reference",
-     "fieldtype": "Button",
-     "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": "Update Auto Repeat Reference",
-     "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": 1,
-     "columns": 0,
-     "fieldname": "more_info",
-     "fieldtype": "Section 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,
-     "label": "More Information",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldtype": "Section Break",
-     "options": "fa fa-file-text",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": "campaign",
-     "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": "Campaign",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "campaign",
-     "oldfieldtype": "Link",
-     "options": "Campaign",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": "source",
-     "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": "Source",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "source",
-     "oldfieldtype": "Select",
-     "options": "Lead Source",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": 1,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "depends_on": "eval:doc.status===\"Lost\"",
-     "fieldname": "order_lost_reason",
-     "fieldtype": "Small Text",
-     "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": "Detailed Reason",
-     "length": 0,
-     "no_copy": 1,
-     "oldfieldname": "order_lost_reason",
-     "oldfieldtype": "Small Text",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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": "column_break4",
-     "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,
-     "oldfieldtype": "Column Break",
-     "permlevel": 0,
-     "print_hide": 1,
-     "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,
-     "width": "50%"
-    },
-    {
-     "allow_bulk_edit": 0,
-     "allow_in_quick_entry": 0,
-     "allow_on_submit": 0,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "default": "Draft",
-     "fieldname": "status",
-     "fieldtype": "Select",
-     "hidden": 0,
-     "ignore_user_permissions": 0,
-     "ignore_xss_filter": 0,
-     "in_filter": 0,
-     "in_global_search": 0,
-     "in_list_view": 1,
-     "in_standard_filter": 0,
-     "label": "Status",
-     "length": 0,
-     "no_copy": 1,
-     "oldfieldname": "status",
-     "oldfieldtype": "Select",
-     "options": "Draft\nOpen\nReplied\nOrdered\nLost\nCancelled",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 1,
-     "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": "enq_det",
-     "fieldtype": "Text",
-     "hidden": 1,
-     "ignore_user_permissions": 0,
-     "ignore_xss_filter": 0,
-     "in_filter": 0,
-     "in_global_search": 0,
-     "in_list_view": 0,
-     "in_standard_filter": 0,
-     "label": "Opportunity Item",
-     "length": 0,
-     "no_copy": 0,
-     "oldfieldname": "enq_det",
-     "oldfieldtype": "Text",
-     "permlevel": 0,
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": "supplier_quotation",
-     "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": "Supplier Quotation",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Supplier Quotation",
-     "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": "opportunity",
-     "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": "Opportunity",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Opportunity",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 1,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "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": 1,
-     "bold": 0,
-     "collapsible": 0,
-     "columns": 0,
-     "fieldname": "lost_reasons",
-     "fieldtype": "Table MultiSelect",
-     "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": "Lost Reasons",
-     "length": 0,
-     "no_copy": 0,
-     "options": "Lost Reason Detail",
-     "permlevel": 0,
-     "precision": "",
-     "print_hide": 0,
-     "print_hide_if_no_value": 0,
-     "read_only": 1,
-     "remember_last_selected_value": 0,
-     "report_hide": 0,
-     "reqd": 0,
-     "search_index": 0,
-     "set_only_once": 0,
-     "translatable": 0,
-     "unique": 0
-    }
-   ],
-   "has_web_view": 0,
-   "hide_heading": 0,
-   "hide_toolbar": 0,
-   "icon": "fa fa-shopping-cart",
-   "idx": 82,
-   "image_view": 0,
-   "in_create": 0,
-   "is_submittable": 1,
-   "issingle": 0,
-   "istable": 0,
-   "max_attachments": 1,
-   "menu_index": 0,
-   "modified": "2019-10-14 01:00:21.545591",
-   "modified_by": "Administrator",
-   "module": "Selling",
-   "name": "Quotation",
-   "owner": "Administrator",
-   "permissions": [
-    {
-     "amend": 1,
-     "cancel": 1,
-     "create": 1,
-     "delete": 1,
-     "email": 1,
-     "export": 0,
-     "if_owner": 0,
-     "import": 0,
-     "permlevel": 0,
-     "print": 1,
-     "read": 1,
-     "report": 1,
-     "role": "Sales User",
-     "set_user_permissions": 0,
-     "share": 1,
-     "submit": 1,
-     "write": 1
-    },
-    {
-     "amend": 0,
-     "cancel": 0,
-     "create": 0,
-     "delete": 0,
-     "email": 0,
-     "export": 0,
-     "if_owner": 0,
-     "import": 0,
-     "match": "",
-     "permlevel": 1,
-     "print": 0,
-     "read": 1,
-     "report": 1,
-     "role": "Sales User",
-     "set_user_permissions": 0,
-     "share": 0,
-     "submit": 0,
-     "write": 0
-    },
-    {
-     "amend": 0,
-     "cancel": 0,
-     "create": 0,
-     "delete": 0,
-     "email": 0,
-     "export": 0,
-     "if_owner": 0,
-     "import": 0,
-     "match": "",
-     "permlevel": 1,
-     "print": 0,
-     "read": 1,
-     "report": 1,
-     "role": "Sales Manager",
-     "set_user_permissions": 0,
-     "share": 0,
-     "submit": 0,
-     "write": 1
-    },
-    {
-     "amend": 1,
-     "cancel": 1,
-     "create": 1,
-     "delete": 1,
-     "email": 1,
-     "export": 1,
-     "if_owner": 0,
-     "import": 1,
-     "permlevel": 0,
-     "print": 1,
-     "read": 1,
-     "report": 1,
-     "role": "Sales Manager",
-     "set_user_permissions": 0,
-     "share": 1,
-     "submit": 1,
-     "write": 1
-    },
-    {
-     "amend": 1,
-     "cancel": 1,
-     "create": 1,
-     "delete": 1,
-     "email": 1,
-     "export": 0,
-     "if_owner": 0,
-     "import": 0,
-     "permlevel": 0,
-     "print": 1,
-     "read": 1,
-     "report": 1,
-     "role": "Maintenance Manager",
-     "set_user_permissions": 0,
-     "share": 1,
-     "submit": 1,
-     "write": 1
-    },
-    {
-     "amend": 0,
-     "cancel": 0,
-     "create": 0,
-     "delete": 0,
-     "email": 0,
-     "export": 0,
-     "if_owner": 0,
-     "import": 0,
-     "match": "",
-     "permlevel": 1,
-     "print": 0,
-     "read": 1,
-     "report": 1,
-     "role": "Maintenance Manager",
-     "set_user_permissions": 0,
-     "share": 0,
-     "submit": 0,
-     "write": 0
-    },
-    {
-     "amend": 1,
-     "cancel": 1,
-     "create": 1,
-     "delete": 1,
-     "email": 1,
-     "export": 0,
-     "if_owner": 0,
-     "import": 0,
-     "permlevel": 0,
-     "print": 1,
-     "read": 1,
-     "report": 1,
-     "role": "Maintenance User",
-     "set_user_permissions": 0,
-     "share": 1,
-     "submit": 1,
-     "write": 1
-    },
-    {
-     "amend": 0,
-     "cancel": 0,
-     "create": 0,
-     "delete": 0,
-     "email": 0,
-     "export": 0,
-     "if_owner": 0,
-     "import": 0,
-     "match": "",
-     "permlevel": 1,
-     "print": 0,
-     "read": 1,
-     "report": 1,
-     "role": "Maintenance User",
-     "set_user_permissions": 0,
-     "share": 0,
-     "submit": 0,
-     "write": 0
-    }
-   ],
-   "quick_entry": 0,
-   "read_only": 0,
-   "read_only_onload": 1,
-   "search_fields": "status,transaction_date,party_name,order_type",
-   "show_name_in_global_search": 1,
-   "sort_field": "modified",
-   "sort_order": "DESC",
-   "timeline_field": "party_name",
-   "title_field": "title",
-   "track_changes": 0,
-   "track_seen": 0,
-   "track_views": 0
+ "allow_import": 1,
+ "autoname": "naming_series:",
+ "creation": "2013-05-24 19:29:08",
+ "doctype": "DocType",
+ "document_type": "Document",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "customer_section",
+  "title",
+  "naming_series",
+  "quotation_to",
+  "party_name",
+  "customer_name",
+  "column_break1",
+  "amended_from",
+  "company",
+  "transaction_date",
+  "valid_till",
+  "order_type",
+  "contact_section",
+  "customer_address",
+  "address_display",
+  "contact_person",
+  "contact_display",
+  "contact_mobile",
+  "contact_email",
+  "col_break98",
+  "shipping_address_name",
+  "shipping_address",
+  "customer_group",
+  "territory",
+  "currency_and_price_list",
+  "currency",
+  "conversion_rate",
+  "column_break2",
+  "selling_price_list",
+  "price_list_currency",
+  "plc_conversion_rate",
+  "ignore_pricing_rule",
+  "items_section",
+  "items",
+  "pricing_rule_details",
+  "pricing_rules",
+  "sec_break23",
+  "total_qty",
+  "base_total",
+  "base_net_total",
+  "column_break_28",
+  "total",
+  "net_total",
+  "total_net_weight",
+  "taxes_section",
+  "tax_category",
+  "column_break_34",
+  "shipping_rule",
+  "section_break_36",
+  "taxes_and_charges",
+  "taxes",
+  "sec_tax_breakup",
+  "other_charges_calculation",
+  "section_break_39",
+  "base_total_taxes_and_charges",
+  "column_break_42",
+  "total_taxes_and_charges",
+  "section_break_44",
+  "coupon_code",
+  "referral_sales_partner",
+  "apply_discount_on",
+  "base_discount_amount",
+  "column_break_46",
+  "additional_discount_percentage",
+  "discount_amount",
+  "totals",
+  "base_grand_total",
+  "base_rounding_adjustment",
+  "base_in_words",
+  "base_rounded_total",
+  "column_break3",
+  "grand_total",
+  "rounding_adjustment",
+  "rounded_total",
+  "in_words",
+  "payment_schedule_section",
+  "payment_terms_template",
+  "payment_schedule",
+  "terms_section_break",
+  "tc_name",
+  "terms",
+  "print_settings",
+  "letter_head",
+  "group_same_items",
+  "column_break_73",
+  "select_print_heading",
+  "language",
+  "subscription_section",
+  "auto_repeat",
+  "update_auto_repeat_reference",
+  "more_info",
+  "campaign",
+  "source",
+  "order_lost_reason",
+  "column_break4",
+  "status",
+  "enq_det",
+  "supplier_quotation",
+  "opportunity",
+  "lost_reasons"
+ ],
+ "fields": [
+  {
+   "fieldname": "customer_section",
+   "fieldtype": "Section Break",
+   "options": "fa fa-user"
+  },
+  {
+   "allow_on_submit": 1,
+   "default": "{customer_name}",
+   "fieldname": "title",
+   "fieldtype": "Data",
+   "hidden": 1,
+   "label": "Title",
+   "no_copy": 1,
+   "print_hide": 1
+  },
+  {
+   "fieldname": "naming_series",
+   "fieldtype": "Select",
+   "label": "Series",
+   "no_copy": 1,
+   "oldfieldname": "naming_series",
+   "oldfieldtype": "Select",
+   "options": "SAL-QTN-.YYYY.-",
+   "print_hide": 1,
+   "reqd": 1,
+   "set_only_once": 1
+  },
+  {
+   "default": "Customer",
+   "fieldname": "quotation_to",
+   "fieldtype": "Link",
+   "in_standard_filter": 1,
+   "label": "Quotation To",
+   "oldfieldname": "quotation_to",
+   "oldfieldtype": "Select",
+   "options": "DocType",
+   "print_hide": 1,
+   "reqd": 1
+  },
+  {
+   "bold": 1,
+   "fieldname": "party_name",
+   "fieldtype": "Dynamic Link",
+   "in_global_search": 1,
+   "in_standard_filter": 1,
+   "label": "Party",
+   "oldfieldname": "customer",
+   "oldfieldtype": "Link",
+   "options": "quotation_to",
+   "print_hide": 1,
+   "search_index": 1
+  },
+  {
+   "bold": 1,
+   "fieldname": "customer_name",
+   "fieldtype": "Data",
+   "hidden": 1,
+   "in_global_search": 1,
+   "label": "Customer Name",
+   "read_only": 1
+  },
+  {
+   "fieldname": "column_break1",
+   "fieldtype": "Column Break",
+   "oldfieldtype": "Column Break",
+   "width": "50%"
+  },
+  {
+   "fieldname": "amended_from",
+   "fieldtype": "Link",
+   "ignore_user_permissions": 1,
+   "label": "Amended From",
+   "no_copy": 1,
+   "oldfieldname": "amended_from",
+   "oldfieldtype": "Data",
+   "options": "Quotation",
+   "print_hide": 1,
+   "read_only": 1,
+   "width": "150px"
+  },
+  {
+   "fieldname": "company",
+   "fieldtype": "Link",
+   "label": "Company",
+   "oldfieldname": "company",
+   "oldfieldtype": "Link",
+   "options": "Company",
+   "print_hide": 1,
+   "remember_last_selected_value": 1,
+   "reqd": 1,
+   "width": "150px"
+  },
+  {
+   "default": "Today",
+   "fieldname": "transaction_date",
+   "fieldtype": "Date",
+   "in_list_view": 1,
+   "in_standard_filter": 1,
+   "label": "Date",
+   "no_copy": 1,
+   "oldfieldname": "transaction_date",
+   "oldfieldtype": "Date",
+   "reqd": 1,
+   "search_index": 1,
+   "width": "100px"
+  },
+  {
+   "fieldname": "valid_till",
+   "fieldtype": "Date",
+   "label": "Valid Till"
+  },
+  {
+   "default": "Sales",
+   "fieldname": "order_type",
+   "fieldtype": "Select",
+   "in_standard_filter": 1,
+   "label": "Order Type",
+   "oldfieldname": "order_type",
+   "oldfieldtype": "Select",
+   "options": "\nSales\nMaintenance\nShopping Cart",
+   "print_hide": 1,
+   "reqd": 1
+  },
+  {
+   "collapsible": 1,
+   "depends_on": "party_name",
+   "fieldname": "contact_section",
+   "fieldtype": "Section Break",
+   "label": "Address and Contact",
+   "options": "fa fa-bullhorn"
+  },
+  {
+   "fieldname": "customer_address",
+   "fieldtype": "Link",
+   "label": "Customer Address",
+   "options": "Address",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "address_display",
+   "fieldtype": "Small Text",
+   "label": "Address",
+   "oldfieldname": "customer_address",
+   "oldfieldtype": "Small Text",
+   "read_only": 1
+  },
+  {
+   "fieldname": "contact_person",
+   "fieldtype": "Link",
+   "label": "Contact Person",
+   "oldfieldname": "contact_person",
+   "oldfieldtype": "Link",
+   "options": "Contact",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "contact_display",
+   "fieldtype": "Small Text",
+   "in_global_search": 1,
+   "label": "Contact",
+   "read_only": 1
+  },
+  {
+   "fieldname": "contact_mobile",
+   "fieldtype": "Small Text",
+   "label": "Mobile No",
+   "read_only": 1
+  },
+  {
+   "fieldname": "contact_email",
+   "fieldtype": "Data",
+   "hidden": 1,
+   "label": "Contact Email",
+   "options": "Email",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "depends_on": "eval:doc.quotaion_to=='Customer' && doc.party_name",
+   "fieldname": "col_break98",
+   "fieldtype": "Column Break",
+   "width": "50%"
+  },
+  {
+   "fieldname": "shipping_address_name",
+   "fieldtype": "Link",
+   "label": "Shipping Address",
+   "options": "Address",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "shipping_address",
+   "fieldtype": "Small Text",
+   "label": "Shipping Address",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "depends_on": "eval:doc.quotaion_to=='Customer' && doc.party_name",
+   "fieldname": "customer_group",
+   "fieldtype": "Link",
+   "hidden": 1,
+   "label": "Customer Group",
+   "oldfieldname": "customer_group",
+   "oldfieldtype": "Link",
+   "options": "Customer Group",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "territory",
+   "fieldtype": "Link",
+   "label": "Territory",
+   "options": "Territory",
+   "print_hide": 1
+  },
+  {
+   "collapsible": 1,
+   "fieldname": "currency_and_price_list",
+   "fieldtype": "Section Break",
+   "label": "Currency and Price List",
+   "options": "fa fa-tag"
+  },
+  {
+   "fieldname": "currency",
+   "fieldtype": "Link",
+   "label": "Currency",
+   "oldfieldname": "currency",
+   "oldfieldtype": "Select",
+   "options": "Currency",
+   "print_hide": 1,
+   "reqd": 1,
+   "width": "100px"
+  },
+  {
+   "description": "Rate at which customer's currency is converted to company's base currency",
+   "fieldname": "conversion_rate",
+   "fieldtype": "Float",
+   "label": "Exchange Rate",
+   "oldfieldname": "conversion_rate",
+   "oldfieldtype": "Currency",
+   "precision": "9",
+   "print_hide": 1,
+   "reqd": 1,
+   "width": "100px"
+  },
+  {
+   "fieldname": "column_break2",
+   "fieldtype": "Column Break",
+   "width": "50%"
+  },
+  {
+   "fieldname": "selling_price_list",
+   "fieldtype": "Link",
+   "label": "Price List",
+   "oldfieldname": "price_list_name",
+   "oldfieldtype": "Select",
+   "options": "Price List",
+   "print_hide": 1,
+   "reqd": 1,
+   "width": "100px"
+  },
+  {
+   "fieldname": "price_list_currency",
+   "fieldtype": "Link",
+   "label": "Price List Currency",
+   "options": "Currency",
+   "print_hide": 1,
+   "read_only": 1,
+   "reqd": 1
+  },
+  {
+   "description": "Rate at which Price list currency is converted to company's base currency",
+   "fieldname": "plc_conversion_rate",
+   "fieldtype": "Float",
+   "label": "Price List Exchange Rate",
+   "precision": "9",
+   "print_hide": 1,
+   "reqd": 1
+  },
+  {
+   "default": "0",
+   "fieldname": "ignore_pricing_rule",
+   "fieldtype": "Check",
+   "label": "Ignore Pricing Rule",
+   "no_copy": 1,
+   "permlevel": 1,
+   "print_hide": 1
+  },
+  {
+   "fieldname": "items_section",
+   "fieldtype": "Section Break",
+   "oldfieldtype": "Section Break",
+   "options": "fa fa-shopping-cart"
+  },
+  {
+   "allow_bulk_edit": 1,
+   "fieldname": "items",
+   "fieldtype": "Table",
+   "label": "Items",
+   "oldfieldname": "quotation_details",
+   "oldfieldtype": "Table",
+   "options": "Quotation Item",
+   "reqd": 1,
+   "width": "40px"
+  },
+  {
+   "fieldname": "pricing_rule_details",
+   "fieldtype": "Section Break",
+   "label": "Pricing Rules"
+  },
+  {
+   "fieldname": "pricing_rules",
+   "fieldtype": "Table",
+   "label": "Pricing Rule Detail",
+   "options": "Pricing Rule Detail",
+   "read_only": 1
+  },
+  {
+   "fieldname": "sec_break23",
+   "fieldtype": "Section Break"
+  },
+  {
+   "fieldname": "total_qty",
+   "fieldtype": "Float",
+   "label": "Total Quantity",
+   "read_only": 1
+  },
+  {
+   "fieldname": "base_total",
+   "fieldtype": "Currency",
+   "label": "Total (Company Currency)",
+   "options": "Company:company:default_currency",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "fieldname": "base_net_total",
+   "fieldtype": "Currency",
+   "label": "Net Total (Company Currency)",
+   "oldfieldname": "net_total",
+   "oldfieldtype": "Currency",
+   "options": "Company:company:default_currency",
+   "print_hide": 1,
+   "read_only": 1,
+   "width": "100px"
+  },
+  {
+   "fieldname": "column_break_28",
+   "fieldtype": "Column Break"
+  },
+  {
+   "fieldname": "total",
+   "fieldtype": "Currency",
+   "label": "Total",
+   "options": "currency",
+   "read_only": 1
+  },
+  {
+   "fieldname": "net_total",
+   "fieldtype": "Currency",
+   "label": "Net Total",
+   "options": "currency",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "fieldname": "total_net_weight",
+   "fieldtype": "Float",
+   "label": "Total Net Weight",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "fieldname": "taxes_section",
+   "fieldtype": "Section Break",
+   "label": "Taxes and Charges",
+   "oldfieldtype": "Section Break",
+   "options": "fa fa-money"
+  },
+  {
+   "fieldname": "tax_category",
+   "fieldtype": "Link",
+   "label": "Tax Category",
+   "options": "Tax Category",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "column_break_34",
+   "fieldtype": "Column Break"
+  },
+  {
+   "fieldname": "shipping_rule",
+   "fieldtype": "Link",
+   "label": "Shipping Rule",
+   "oldfieldtype": "Button",
+   "options": "Shipping Rule",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "section_break_36",
+   "fieldtype": "Section Break"
+  },
+  {
+   "fieldname": "taxes_and_charges",
+   "fieldtype": "Link",
+   "label": "Sales Taxes and Charges Template",
+   "oldfieldname": "charge",
+   "oldfieldtype": "Link",
+   "options": "Sales Taxes and Charges Template",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "taxes",
+   "fieldtype": "Table",
+   "label": "Sales Taxes and Charges",
+   "oldfieldname": "other_charges",
+   "oldfieldtype": "Table",
+   "options": "Sales Taxes and Charges"
+  },
+  {
+   "collapsible": 1,
+   "fieldname": "sec_tax_breakup",
+   "fieldtype": "Section Break",
+   "label": "Tax Breakup"
+  },
+  {
+   "fieldname": "other_charges_calculation",
+   "fieldtype": "Text",
+   "label": "Taxes and Charges Calculation",
+   "no_copy": 1,
+   "oldfieldtype": "HTML",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "fieldname": "section_break_39",
+   "fieldtype": "Section Break"
+  },
+  {
+   "fieldname": "base_total_taxes_and_charges",
+   "fieldtype": "Currency",
+   "label": "Total Taxes and Charges (Company Currency)",
+   "oldfieldname": "other_charges_total",
+   "oldfieldtype": "Currency",
+   "options": "Company:company:default_currency",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "fieldname": "column_break_42",
+   "fieldtype": "Column Break"
+  },
+  {
+   "fieldname": "total_taxes_and_charges",
+   "fieldtype": "Currency",
+   "label": "Total Taxes and Charges",
+   "options": "currency",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "collapsible": 1,
+   "collapsible_depends_on": "discount_amount",
+   "fieldname": "section_break_44",
+   "fieldtype": "Section Break",
+   "label": "Additional Discount and Coupon Code"
+  },
+  {
+   "fieldname": "coupon_code",
+   "fieldtype": "Link",
+   "label": "Coupon Code",
+   "options": "Coupon Code"
+  },
+  {
+   "fieldname": "referral_sales_partner",
+   "fieldtype": "Link",
+   "label": "Referral Sales Partner",
+   "options": "Sales Partner"
+  },
+  {
+   "default": "Grand Total",
+   "fieldname": "apply_discount_on",
+   "fieldtype": "Select",
+   "label": "Apply Additional Discount On",
+   "options": "\nGrand Total\nNet Total",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "base_discount_amount",
+   "fieldtype": "Currency",
+   "label": "Additional Discount Amount (Company Currency)",
+   "options": "Company:company:default_currency",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "fieldname": "column_break_46",
+   "fieldtype": "Column Break"
+  },
+  {
+   "fieldname": "additional_discount_percentage",
+   "fieldtype": "Float",
+   "label": "Additional Discount Percentage",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "discount_amount",
+   "fieldtype": "Currency",
+   "label": "Additional Discount Amount",
+   "options": "currency",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "totals",
+   "fieldtype": "Section Break",
+   "oldfieldtype": "Section Break",
+   "options": "fa fa-money",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "base_grand_total",
+   "fieldtype": "Currency",
+   "label": "Grand Total (Company Currency)",
+   "oldfieldname": "grand_total",
+   "oldfieldtype": "Currency",
+   "options": "Company:company:default_currency",
+   "print_hide": 1,
+   "read_only": 1,
+   "width": "200px"
+  },
+  {
+   "fieldname": "base_rounding_adjustment",
+   "fieldtype": "Currency",
+   "label": "Rounding Adjustment (Company Currency)",
+   "no_copy": 1,
+   "options": "Company:company:default_currency",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "description": "In Words will be visible once you save the Quotation.",
+   "fieldname": "base_in_words",
+   "fieldtype": "Data",
+   "label": "In Words (Company Currency)",
+   "oldfieldname": "in_words",
+   "oldfieldtype": "Data",
+   "print_hide": 1,
+   "read_only": 1,
+   "width": "200px"
+  },
+  {
+   "fieldname": "base_rounded_total",
+   "fieldtype": "Currency",
+   "label": "Rounded Total (Company Currency)",
+   "oldfieldname": "rounded_total",
+   "oldfieldtype": "Currency",
+   "options": "Company:company:default_currency",
+   "print_hide": 1,
+   "read_only": 1,
+   "width": "200px"
+  },
+  {
+   "fieldname": "column_break3",
+   "fieldtype": "Column Break",
+   "oldfieldtype": "Column Break",
+   "print_hide": 1,
+   "width": "50%"
+  },
+  {
+   "fieldname": "grand_total",
+   "fieldtype": "Currency",
+   "in_list_view": 1,
+   "label": "Grand Total",
+   "oldfieldname": "grand_total_export",
+   "oldfieldtype": "Currency",
+   "options": "currency",
+   "read_only": 1,
+   "width": "200px"
+  },
+  {
+   "fieldname": "rounding_adjustment",
+   "fieldtype": "Currency",
+   "label": "Rounding Adjustment",
+   "no_copy": 1,
+   "options": "currency",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "bold": 1,
+   "fieldname": "rounded_total",
+   "fieldtype": "Currency",
+   "label": "Rounded Total",
+   "oldfieldname": "rounded_total_export",
+   "oldfieldtype": "Currency",
+   "options": "currency",
+   "read_only": 1,
+   "width": "200px"
+  },
+  {
+   "fieldname": "in_words",
+   "fieldtype": "Data",
+   "label": "In Words",
+   "oldfieldname": "in_words_export",
+   "oldfieldtype": "Data",
+   "print_hide": 1,
+   "read_only": 1,
+   "width": "200px"
+  },
+  {
+   "fieldname": "payment_schedule_section",
+   "fieldtype": "Section Break",
+   "label": "Payment Terms"
+  },
+  {
+   "fieldname": "payment_terms_template",
+   "fieldtype": "Link",
+   "label": "Payment Terms Template",
+   "options": "Payment Terms Template",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "payment_schedule",
+   "fieldtype": "Table",
+   "label": "Payment Schedule",
+   "no_copy": 1,
+   "options": "Payment Schedule",
+   "print_hide": 1
+  },
+  {
+   "collapsible": 1,
+   "collapsible_depends_on": "terms",
+   "fieldname": "terms_section_break",
+   "fieldtype": "Section Break",
+   "label": "Terms and Conditions",
+   "oldfieldtype": "Section Break",
+   "options": "fa fa-legal"
+  },
+  {
+   "fieldname": "tc_name",
+   "fieldtype": "Link",
+   "label": "Terms",
+   "oldfieldname": "tc_name",
+   "oldfieldtype": "Link",
+   "options": "Terms and Conditions",
+   "print_hide": 1,
+   "report_hide": 1
+  },
+  {
+   "fieldname": "terms",
+   "fieldtype": "Text Editor",
+   "label": "Term Details",
+   "oldfieldname": "terms",
+   "oldfieldtype": "Text Editor"
+  },
+  {
+   "collapsible": 1,
+   "fieldname": "print_settings",
+   "fieldtype": "Section Break",
+   "label": "Print Settings"
+  },
+  {
+   "allow_on_submit": 1,
+   "fieldname": "letter_head",
+   "fieldtype": "Link",
+   "label": "Letter Head",
+   "oldfieldname": "letter_head",
+   "oldfieldtype": "Select",
+   "options": "Letter Head",
+   "print_hide": 1
+  },
+  {
+   "allow_on_submit": 1,
+   "default": "0",
+   "fieldname": "group_same_items",
+   "fieldtype": "Check",
+   "label": "Group same items",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "column_break_73",
+   "fieldtype": "Column Break"
+  },
+  {
+   "allow_on_submit": 1,
+   "fieldname": "select_print_heading",
+   "fieldtype": "Link",
+   "label": "Print Heading",
+   "no_copy": 1,
+   "oldfieldname": "select_print_heading",
+   "oldfieldtype": "Link",
+   "options": "Print Heading",
+   "print_hide": 1,
+   "report_hide": 1
+  },
+  {
+   "fieldname": "language",
+   "fieldtype": "Data",
+   "label": "Print Language",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "fieldname": "subscription_section",
+   "fieldtype": "Section Break",
+   "label": "Auto Repeat Section"
+  },
+  {
+   "fieldname": "auto_repeat",
+   "fieldtype": "Link",
+   "label": "Auto Repeat",
+   "no_copy": 1,
+   "options": "Auto Repeat",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "allow_on_submit": 1,
+   "depends_on": "eval: doc.auto_repeat",
+   "fieldname": "update_auto_repeat_reference",
+   "fieldtype": "Button",
+   "label": "Update Auto Repeat Reference"
+  },
+  {
+   "collapsible": 1,
+   "fieldname": "more_info",
+   "fieldtype": "Section Break",
+   "label": "More Information",
+   "oldfieldtype": "Section Break",
+   "options": "fa fa-file-text",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "campaign",
+   "fieldtype": "Link",
+   "label": "Campaign",
+   "oldfieldname": "campaign",
+   "oldfieldtype": "Link",
+   "options": "Campaign",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "source",
+   "fieldtype": "Link",
+   "label": "Source",
+   "oldfieldname": "source",
+   "oldfieldtype": "Select",
+   "options": "Lead Source",
+   "print_hide": 1
+  },
+  {
+   "allow_on_submit": 1,
+   "depends_on": "eval:doc.status===\"Lost\"",
+   "fieldname": "order_lost_reason",
+   "fieldtype": "Small Text",
+   "label": "Detailed Reason",
+   "no_copy": 1,
+   "oldfieldname": "order_lost_reason",
+   "oldfieldtype": "Small Text",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "column_break4",
+   "fieldtype": "Column Break",
+   "oldfieldtype": "Column Break",
+   "print_hide": 1,
+   "width": "50%"
+  },
+  {
+   "default": "Draft",
+   "fieldname": "status",
+   "fieldtype": "Select",
+   "in_list_view": 1,
+   "label": "Status",
+   "no_copy": 1,
+   "oldfieldname": "status",
+   "oldfieldtype": "Select",
+   "options": "Draft\nOpen\nReplied\nOrdered\nLost\nCancelled\nExpired",
+   "print_hide": 1,
+   "read_only": 1,
+   "reqd": 1
+  },
+  {
+   "fieldname": "enq_det",
+   "fieldtype": "Text",
+   "hidden": 1,
+   "label": "Opportunity Item",
+   "oldfieldname": "enq_det",
+   "oldfieldtype": "Text",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "fieldname": "supplier_quotation",
+   "fieldtype": "Link",
+   "label": "Supplier Quotation",
+   "options": "Supplier Quotation"
+  },
+  {
+   "fieldname": "opportunity",
+   "fieldtype": "Link",
+   "label": "Opportunity",
+   "options": "Opportunity",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "allow_on_submit": 1,
+   "fieldname": "lost_reasons",
+   "fieldtype": "Table MultiSelect",
+   "label": "Lost Reasons",
+   "options": "Lost Reason Detail",
+   "read_only": 1
   }
+ ],
+ "icon": "fa fa-shopping-cart",
+ "idx": 82,
+ "is_submittable": 1,
+ "max_attachments": 1,
+ "modified": "2019-11-12 13:19:11.895715",
+ "modified_by": "Administrator",
+ "module": "Selling",
+ "name": "Quotation",
+ "owner": "Administrator",
+ "permissions": [
+  {
+   "amend": 1,
+   "cancel": 1,
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Sales User",
+   "share": 1,
+   "submit": 1,
+   "write": 1
+  },
+  {
+   "permlevel": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Sales User"
+  },
+  {
+   "permlevel": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Sales Manager",
+   "write": 1
+  },
+  {
+   "amend": 1,
+   "cancel": 1,
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "export": 1,
+   "import": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Sales Manager",
+   "share": 1,
+   "submit": 1,
+   "write": 1
+  },
+  {
+   "amend": 1,
+   "cancel": 1,
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Maintenance Manager",
+   "share": 1,
+   "submit": 1,
+   "write": 1
+  },
+  {
+   "permlevel": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Maintenance Manager"
+  },
+  {
+   "amend": 1,
+   "cancel": 1,
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Maintenance User",
+   "share": 1,
+   "submit": 1,
+   "write": 1
+  },
+  {
+   "permlevel": 1,
+   "read": 1,
+   "report": 1,
+   "role": "Maintenance User"
+  }
+ ],
+ "search_fields": "status,transaction_date,party_name,order_type",
+ "show_name_in_global_search": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "timeline_field": "party_name",
+ "title_field": "title"
+}
\ No newline at end of file
diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py
index 4a56e40..790b2f0 100644
--- a/erpnext/selling/doctype/quotation/quotation.py
+++ b/erpnext/selling/doctype/quotation/quotation.py
@@ -185,6 +185,10 @@
 
 	return doclist
 
+def set_expired_status():
+	frappe.db.sql("""UPDATE `tabQuotation` SET `status` = 'Expired'
+		WHERE `status` != "Expired" AND `valid_till` < %s""", (nowdate()))
+
 @frappe.whitelist()
 def make_sales_invoice(source_name, target_doc=None):
 	return _make_sales_invoice(source_name, target_doc)
diff --git a/erpnext/selling/doctype/quotation/quotation_list.js b/erpnext/selling/doctype/quotation/quotation_list.js
index 5f4e254..802c0ba 100644
--- a/erpnext/selling/doctype/quotation/quotation_list.js
+++ b/erpnext/selling/doctype/quotation/quotation_list.js
@@ -14,15 +14,13 @@
 
 	get_indicator: function(doc) {
 		if(doc.status==="Open") {
-			if (doc.valid_till && doc.valid_till < frappe.datetime.nowdate()) {
-				return [__("Expired"), "darkgrey", "valid_till,<," + frappe.datetime.nowdate()];
-			} else {
-				return [__("Open"), "orange", "status,=,Open"];
-			}
+			return [__("Open"), "orange", "status,=,Open"];
 		} else if(doc.status==="Ordered") {
 			return [__("Ordered"), "green", "status,=,Ordered"];
 		} else if(doc.status==="Lost") {
 			return [__("Lost"), "darkgrey", "status,=,Lost"];
+		} else if(doc.status==="Expired") {
+			return [__("Expired"), "darkgrey", "status,=,Expired"];
 		}
 	}
 };
diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py
index 7ee4a76..ee6b429 100644
--- a/erpnext/selling/doctype/quotation/test_quotation.py
+++ b/erpnext/selling/doctype/quotation/test_quotation.py
@@ -201,6 +201,28 @@
 		sec_qo = make_quotation(item_list=qo_item2, do_not_submit=True)
 		sec_qo.submit()
 
+	def test_quotation_expiry(self):
+		from erpnext.selling.doctype.quotation.quotation import set_expired_status
+
+		quotation_item = [
+			{
+				"item_code": "_Test Item",
+				"warehouse":"",
+				"qty": 1,
+				"rate": 500
+			}
+		]
+
+		yesterday = add_days(nowdate(), -1)
+		expired_quotation = make_quotation(item_list=quotation_item, transaction_date=yesterday, do_not_submit=True)
+		expired_quotation.valid_till = yesterday
+		expired_quotation.save()
+		expired_quotation.submit()
+		set_expired_status()
+		expired_quotation.reload()
+		self.assertEqual(expired_quotation.status, "Expired")
+
+
 test_records = frappe.get_test_records('Quotation')
 
 def get_quotation_dict(party_name=None, item_code=None):
@@ -258,3 +280,5 @@
 			qo.submit()
 
 	return qo
+
+
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index 85e8143..2dae0d8 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -112,7 +112,6 @@
 		let allow_delivery = false;
 
 		if (doc.docstatus==1) {
-			this.frm.add_custom_button(__('Pick List'), () => this.create_pick_list(), __('Create'));
 
 			if(this.frm.has_perm("submit")) {
 				if(doc.status === 'On Hold') {
@@ -136,7 +135,7 @@
 			if(doc.status !== 'Closed') {
 				if(doc.status !== 'On Hold') {
 
-					allow_delivery = this.frm.doc.items.some(item => item.delivered_by_supplier === 0 && item.qty > flt(item.delivered_qty)) 
+					allow_delivery = this.frm.doc.items.some(item => item.delivered_by_supplier === 0 && item.qty > flt(item.delivered_qty))
 						&& !this.frm.doc.skip_delivery_note
 
 					if (this.frm.has_perm("submit")) {
@@ -148,6 +147,8 @@
 						}
 					}
 
+					this.frm.add_custom_button(__('Pick List'), () => this.create_pick_list(), __('Create'));
+
 					// delivery note
 					if(flt(doc.per_delivered, 6) < 100 && ["Sales", "Shopping Cart"].indexOf(doc.order_type)!==-1 && allow_delivery) {
 						this.frm.add_custom_button(__('Delivery Note'), () => this.make_delivery_note_based_on_delivery_date(), __('Create'));
@@ -202,7 +203,7 @@
 					}
 				}
 				// payment request
-				if(flt(doc.per_billed)==0) {
+				if(flt(doc.per_billed)<100) {
 					this.frm.add_custom_button(__('Payment Request'), () => this.make_payment_request(), __('Create'));
 					this.frm.add_custom_button(__('Payment'), () => this.make_payment_entry(), __('Create'));
 				}
@@ -361,7 +362,7 @@
 	},
 
 	toggle_delivery_date: function() {
-		this.frm.fields_dict.items.grid.toggle_reqd("delivery_date", 
+		this.frm.fields_dict.items.grid.toggle_reqd("delivery_date",
 			(this.frm.doc.order_type == "Sales" && !this.frm.doc.skip_delivery_note));
 	},
 
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index e12b359..e97a4ee 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -834,6 +834,10 @@
 		for item in sales_order.items:
 			if item.supplier and item.supplier not in suppliers:
 				suppliers.append(item.supplier)
+
+	if not suppliers:
+		frappe.throw(_("Please set a Supplier against the Items to be considered in the Purchase Order."))
+
 	for supplier in suppliers:
 		po =frappe.get_list("Purchase Order", filters={"sales_order":source_name, "supplier":supplier, "docstatus": ("<", "2")})
 		if len(po) == 0:
diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py
index bd07841..feb6b76 100644
--- a/erpnext/selling/doctype/sales_order/test_sales_order.py
+++ b/erpnext/selling/doctype/sales_order/test_sales_order.py
@@ -12,6 +12,7 @@
 from erpnext.controllers.accounts_controller import update_child_qty_rate
 import json
 from erpnext.selling.doctype.sales_order.sales_order import make_raw_material_request
+from erpnext.manufacturing.doctype.blanket_order.test_blanket_order import make_blanket_order
 
 class TestSalesOrder(unittest.TestCase):
 	def tearDown(self):
@@ -819,6 +820,25 @@
 		mr_doc = frappe.get_doc('Material Request',mr.get('name'))
 		self.assertEqual(mr_doc.items[0].sales_order, so.name)
 
+	def test_so_optional_blanket_order(self):
+		"""
+			Expected result: Blanket order Ordered Quantity should only be affected on Sales Order with against_blanket_order = 1.
+			Second Sales Order should not add on to Blanket Orders Ordered Quantity.
+		"""
+
+		bo = make_blanket_order(blanket_order_type = "Selling", quantity = 10, rate = 10)
+
+		so = make_sales_order(item_code= "_Test Item", qty = 5, against_blanket_order = 1)
+		so_doc = frappe.get_doc('Sales Order', so.get('name'))
+		# To test if the SO has a Blanket Order
+		self.assertTrue(so_doc.items[0].blanket_order)
+
+		so = make_sales_order(item_code= "_Test Item", qty = 5, against_blanket_order = 0)
+		so_doc = frappe.get_doc('Sales Order', so.get('name'))
+		# To test if the SO does NOT have a Blanket Order
+		self.assertEqual(so_doc.items[0].blanket_order, None)
+
+
 def make_sales_order(**args):
 	so = frappe.new_doc("Sales Order")
 	args = frappe._dict(args)
@@ -845,7 +865,8 @@
 			"warehouse": args.warehouse,
 			"qty": args.qty or 10,
 			"uom": args.uom or None,
-			"rate": args.rate or 100
+			"rate": args.rate or 100,
+			"against_blanket_order": args.against_blanket_order
 		})
 
 	so.delivery_date = add_days(so.transaction_date, 10)
diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json
index 3fd1e64..86b09c2 100644
--- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json
+++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json
@@ -68,6 +68,7 @@
   "target_warehouse",
   "prevdoc_docname",
   "col_break4",
+  "against_blanket_order",
   "blanket_order",
   "blanket_order_rate",
   "planning_section",
@@ -574,6 +575,7 @@
    "report_hide": 1
   },
   {
+   "depends_on": "eval:doc.against_blanket_order",
    "fieldname": "blanket_order",
    "fieldtype": "Link",
    "label": "Blanket Order",
@@ -581,6 +583,7 @@
    "options": "Blanket Order"
   },
   {
+   "depends_on": "eval:doc.against_blanket_order",
    "fieldname": "blanket_order_rate",
    "fieldtype": "Currency",
    "label": "Blanket Order Rate",
@@ -741,11 +744,17 @@
    "fieldname": "image_section",
    "fieldtype": "Section Break",
    "label": "Image"
+  },
+  {
+   "default": "0",
+   "fieldname": "against_blanket_order",
+   "fieldtype": "Check",
+   "label": "Against Blanket Order"
   }
  ],
  "idx": 1,
  "istable": 1,
- "modified": "2019-10-10 08:46:26.244823",
+ "modified": "2019-11-19 14:19:29.491945",
  "modified_by": "Administrator",
  "module": "Selling",
  "name": "Sales Order Item",
diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.json b/erpnext/selling/doctype/selling_settings/selling_settings.json
index dc2c4ce..c04bfd2 100644
--- a/erpnext/selling/doctype/selling_settings/selling_settings.json
+++ b/erpnext/selling/doctype/selling_settings/selling_settings.json
@@ -1,611 +1,158 @@
 {
- "allow_copy": 0, 
- "allow_guest_to_view": 0, 
- "allow_import": 0, 
- "allow_rename": 0, 
- "beta": 0, 
- "creation": "2013-06-25 10:25:16", 
- "custom": 0, 
- "description": "Settings for Selling Module", 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "Other", 
- "editable_grid": 0, 
- "engine": "InnoDB", 
+ "creation": "2013-06-25 10:25:16",
+ "description": "Settings for Selling Module",
+ "doctype": "DocType",
+ "document_type": "Other",
+ "engine": "InnoDB",
+ "field_order": [
+  "cust_master_name",
+  "campaign_naming_by",
+  "customer_group",
+  "territory",
+  "selling_price_list",
+  "close_opportunity_after_days",
+  "default_valid_till",
+  "column_break_5",
+  "so_required",
+  "dn_required",
+  "sales_update_frequency",
+  "maintain_same_sales_rate",
+  "editable_price_list_rate",
+  "allow_multiple_items",
+  "allow_against_multiple_purchase_orders",
+  "validate_selling_price",
+  "hide_tax_id"
+ ],
  "fields": [
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "default": "Customer Name", 
-   "fieldname": "cust_master_name", 
-   "fieldtype": "Select", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Customer Naming By", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Customer Name\nNaming Series", 
-   "permlevel": 0, 
-   "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
-  }, 
+   "default": "Customer Name",
+   "fieldname": "cust_master_name",
+   "fieldtype": "Select",
+   "in_list_view": 1,
+   "label": "Customer Naming By",
+   "options": "Customer Name\nNaming Series"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "campaign_naming_by", 
-   "fieldtype": "Select", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Campaign Naming By", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Campaign Name\nNaming Series", 
-   "permlevel": 0, 
-   "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
-  }, 
+   "fieldname": "campaign_naming_by",
+   "fieldtype": "Select",
+   "in_list_view": 1,
+   "label": "Campaign Naming By",
+   "options": "Campaign Name\nNaming Series"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "", 
-   "fieldname": "customer_group", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Default Customer Group", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Customer Group", 
-   "permlevel": 0, 
-   "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
-  }, 
+   "fieldname": "customer_group",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Default Customer Group",
+   "options": "Customer Group"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "description": "", 
-   "fieldname": "territory", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Default Territory", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Territory", 
-   "permlevel": 0, 
-   "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
-  }, 
+   "fieldname": "territory",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Default Territory",
+   "options": "Territory"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "selling_price_list", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Default Price List", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Price List", 
-   "permlevel": 0, 
-   "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
-  }, 
+   "fieldname": "selling_price_list",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Default Price List",
+   "options": "Price List"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "default": "15", 
-   "description": "Auto close Opportunity after 15 days", 
-   "fieldname": "close_opportunity_after_days", 
-   "fieldtype": "Int", 
-   "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": "Close Opportunity After Days", 
-   "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
-  }, 
+   "default": "15",
+   "description": "Auto close Opportunity after 15 days",
+   "fieldname": "close_opportunity_after_days",
+   "fieldtype": "Int",
+   "label": "Close Opportunity After Days"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "default_valid_till", 
-   "fieldtype": "Data", 
-   "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": "Default Quotation Validity Days", 
-   "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
-  }, 
+   "fieldname": "default_valid_till",
+   "fieldtype": "Data",
+   "label": "Default Quotation Validity Days"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "column_break_5", 
-   "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, 
-   "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
-  }, 
+   "fieldname": "column_break_5",
+   "fieldtype": "Column Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "so_required", 
-   "fieldtype": "Select", 
-   "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": "Sales Order Required", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "No\nYes", 
-   "permlevel": 0, 
-   "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
-  }, 
+   "fieldname": "so_required",
+   "fieldtype": "Select",
+   "label": "Sales Order Required",
+   "options": "No\nYes"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "dn_required", 
-   "fieldtype": "Select", 
-   "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": "Delivery Note Required", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "No\nYes", 
-   "permlevel": 0, 
-   "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
-  }, 
+   "fieldname": "dn_required",
+   "fieldtype": "Select",
+   "label": "Delivery Note Required",
+   "options": "No\nYes"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "default": "Each Transaction", 
-   "description": "How often should project and company be updated based on Sales Transactions.", 
-   "fieldname": "sales_update_frequency", 
-   "fieldtype": "Select", 
-   "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": "Sales Update Frequency", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Each Transaction\nDaily\nMonthly", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "default": "Each Transaction",
+   "description": "How often should project and company be updated based on Sales Transactions.",
+   "fieldname": "sales_update_frequency",
+   "fieldtype": "Select",
+   "label": "Sales Update Frequency",
+   "options": "Each Transaction\nDaily\nMonthly",
+   "reqd": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "maintain_same_sales_rate", 
-   "fieldtype": "Check", 
-   "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": "Maintain Same Rate Throughout Sales Cycle", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "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
-  }, 
+   "default": "0",
+   "fieldname": "maintain_same_sales_rate",
+   "fieldtype": "Check",
+   "label": "Maintain Same Rate Throughout Sales Cycle"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "editable_price_list_rate", 
-   "fieldtype": "Check", 
-   "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": "Allow user to edit Price List Rate in transactions", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "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
-  }, 
+   "default": "0",
+   "fieldname": "editable_price_list_rate",
+   "fieldtype": "Check",
+   "label": "Allow user to edit Price List Rate in transactions"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "allow_multiple_items", 
-   "fieldtype": "Check", 
-   "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": "Allow Item to be added multiple times in a transaction", 
-   "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
-  }, 
+   "default": "0",
+   "fieldname": "allow_multiple_items",
+   "fieldtype": "Check",
+   "label": "Allow Item to be added multiple times in a transaction"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "allow_against_multiple_purchase_orders", 
-   "fieldtype": "Check", 
-   "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": "Allow multiple Sales Orders against a Customer's Purchase Order", 
-   "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
-  }, 
+   "default": "0",
+   "fieldname": "allow_against_multiple_purchase_orders",
+   "fieldtype": "Check",
+   "label": "Allow multiple Sales Orders against a Customer's Purchase Order"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "validate_selling_price", 
-   "fieldtype": "Check", 
-   "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": "Validate Selling Price for Item against Purchase Rate or Valuation Rate", 
-   "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
-  }, 
+   "default": "0",
+   "fieldname": "validate_selling_price",
+   "fieldtype": "Check",
+   "label": "Validate Selling Price for Item against Purchase Rate or Valuation Rate"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "hide_tax_id", 
-   "fieldtype": "Check", 
-   "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": "Hide Customer's Tax Id from Sales Transactions", 
-   "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
+   "default": "0",
+   "fieldname": "hide_tax_id",
+   "fieldtype": "Check",
+   "label": "Hide Customer's Tax Id from Sales Transactions"
   }
- ], 
- "has_web_view": 0, 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "icon": "fa fa-cog", 
- "idx": 1, 
- "image_view": 0, 
- "in_create": 0, 
- "is_submittable": 0, 
- "issingle": 1, 
- "istable": 0, 
- "max_attachments": 0, 
- "modified": "2018-06-25 12:56:16.332039", 
- "modified_by": "Administrator", 
- "module": "Selling", 
- "name": "Selling Settings", 
- "owner": "Administrator", 
+ ],
+ "icon": "fa fa-cog",
+ "idx": 1,
+ "issingle": 1,
+ "modified": "2019-12-09 13:38:36.486298",
+ "modified_by": "Administrator",
+ "module": "Selling",
+ "name": "Selling Settings",
+ "owner": "Administrator",
  "permissions": [
   {
-   "amend": 0, 
-   "cancel": 0, 
-   "create": 1, 
-   "delete": 0, 
-   "email": 1, 
-   "export": 0, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 0, 
-   "role": "System Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 0, 
+   "create": 1,
+   "email": 1,
+   "print": 1,
+   "read": 1,
+   "role": "System Manager",
+   "share": 1,
    "write": 1
   }
- ], 
- "quick_entry": 0, 
- "read_only": 0, 
- "read_only_onload": 0, 
- "show_name_in_global_search": 0, 
- "sort_field": "modified", 
- "sort_order": "DESC", 
- "track_changes": 0, 
- "track_seen": 0, 
- "track_views": 0
-}
+ ],
+ "sort_field": "modified",
+ "sort_order": "DESC"
+}
\ No newline at end of file
diff --git a/erpnext/selling/doctype/selling_settings/test_selling_settings.py b/erpnext/selling/doctype/selling_settings/test_selling_settings.py
new file mode 100644
index 0000000..961a54d
--- /dev/null
+++ b/erpnext/selling/doctype/selling_settings/test_selling_settings.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+# import frappe
+import unittest
+
+class TestSellingSettings(unittest.TestCase):
+	pass
diff --git a/erpnext/selling/onboarding_slide/add_a_few_customers/add_a_few_customers.json b/erpnext/selling/onboarding_slide/add_a_few_customers/add_a_few_customers.json
new file mode 100644
index 0000000..f39fea4
--- /dev/null
+++ b/erpnext/selling/onboarding_slide/add_a_few_customers/add_a_few_customers.json
@@ -0,0 +1,48 @@
+{
+ "add_more_button": 1,
+ "app": "ERPNext",
+ "creation": "2019-11-15 14:44:10.065014",
+ "docstatus": 0,
+ "doctype": "Onboarding Slide",
+ "domains": [],
+ "help_links": [
+  {
+   "label": "Learn More",
+   "video_id": "zsrrVDk6VBs"
+  }
+ ],
+ "idx": 0,
+ "image_src": "/assets/erpnext/images/illustrations/customers-onboard.png",
+ "max_count": 3,
+ "modified": "2019-12-03 22:54:28.959549",
+ "modified_by": "Administrator",
+ "name": "Add A Few Customers",
+ "owner": "Administrator",
+ "ref_doctype": "Customer",
+ "slide_desc": "",
+ "slide_fields": [
+  {
+   "align": "",
+   "fieldname": "customer_name",
+   "fieldtype": "Data",
+   "label": "Customer Name",
+   "placeholder": "",
+   "reqd": 1
+  },
+  {
+   "align": "",
+   "fieldtype": "Column Break",
+   "reqd": 0
+  },
+  {
+   "align": "",
+   "fieldname": "customer_email",
+   "fieldtype": "Data",
+   "label": "Email ID",
+   "reqd": 1
+  }
+ ],
+ "slide_order": 40,
+ "slide_title": "Add A Few Customers",
+ "slide_type": "Create"
+}
\ No newline at end of file
diff --git a/erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.py b/erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.py
index 32711b2..056492a 100644
--- a/erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.py
+++ b/erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.py
@@ -7,7 +7,7 @@
 
 def execute(filters=None):
 	if not filters: filters = {}
-	
+
 	columns = get_columns()
 	iwq_map = get_item_warehouse_quantity_map()
 	item_map = get_item_details()
@@ -15,22 +15,23 @@
 	for sbom, warehouse in iwq_map.items():
 		total = 0
 		total_qty = 0
-		
+
 		for wh, item_qty in warehouse.items():
 			total += 1
-			row = [sbom, item_map.get(sbom).item_name, item_map.get(sbom).description, 
-					item_map.get(sbom).stock_uom, wh]
-			available_qty = item_qty
-			total_qty += flt(available_qty)
-			row += [available_qty]
-			
-			if available_qty:
-				data.append(row)
-				if (total == len(warehouse)):
-					row = ["", "", "Total", "", "", total_qty]
+			if item_map.get(sbom):
+				row = [sbom, item_map.get(sbom).item_name, item_map.get(sbom).description,
+						item_map.get(sbom).stock_uom, wh]
+				available_qty = item_qty
+				total_qty += flt(available_qty)
+				row += [available_qty]
+
+				if available_qty:
 					data.append(row)
+					if (total == len(warehouse)):
+						row = ["", "", "Total", "", "", total_qty]
+						data.append(row)
 	return columns, data
-		
+
 def get_columns():
 	columns = ["Item Code:Link/Item:100", "Item Name::100", "Description::120", \
 				"UOM:Link/UOM:80", "Warehouse:Link/Warehouse:100", "Quantity::100"]
diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js
index e508476..1c9b30b 100644
--- a/erpnext/selling/sales_common.js
+++ b/erpnext/selling/sales_common.js
@@ -309,7 +309,7 @@
 					child: item,
 					args: {
 						"batch_no": item.batch_no,
-						"stock_qty": item.stock_qty,
+						"stock_qty": item.stock_qty || item.qty, //if stock_qty field is not available fetch qty (in case of Packed Items table)
 						"warehouse": item.warehouse,
 						"item_code": item.item_code,
 						"has_serial_no": has_serial_no
diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js
index 81c5f02..be736d2 100644
--- a/erpnext/setup/doctype/company/company.js
+++ b/erpnext/setup/doctype/company/company.js
@@ -29,7 +29,7 @@
 
 	company_name: function(frm) {
 		if(frm.doc.__islocal) {
-			# add missing " " arg in split method
+			// add missing " " arg in split method
 			let parts = frm.doc.company_name.split(" ");
 			let abbr = $.map(parts, function (p) {
 				return p? p.substr(0, 1) : null;
diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json
index 2d181b5..dd602ec 100644
--- a/erpnext/setup/doctype/company/company.json
+++ b/erpnext/setup/doctype/company/company.json
@@ -72,7 +72,6 @@
   "stock_received_but_not_billed",
   "expenses_included_in_valuation",
   "fixed_asset_depreciation_settings",
-  "enable_cwip_accounting",
   "accumulated_depreciation_account",
   "depreciation_expense_account",
   "series_for_depreciation_entry",
@@ -721,18 +720,12 @@
    "fieldtype": "Link",
    "label": "Default Buying Terms",
    "options": "Terms and Conditions"
-  },
-  {
-   "default": "0",
-   "fieldname": "enable_cwip_accounting",
-   "fieldtype": "Check",
-   "label": "Enable Capital Work in Progress Accounting"
   }
  ],
  "icon": "fa fa-building",
  "idx": 1,
  "image_field": "company_logo",
- "modified": "2019-10-09 14:42:04.440974",
+ "modified": "2019-11-22 13:04:47.470768",
  "modified_by": "Administrator",
  "module": "Setup",
  "name": "Company",
diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py
index 0bcddc2..4d2d540 100644
--- a/erpnext/setup/doctype/email_digest/email_digest.py
+++ b/erpnext/setup/doctype/email_digest/email_digest.py
@@ -283,7 +283,7 @@
 						card.value = card.value *-1
 					card.value = self.fmt_money(card.value,False if key in ("bank_balance", "credit_balance") else True)
 
-					cache.setex(cache_key, card, 24 * 60 * 60)
+					cache.set_value(cache_key, card, expires_in_sec=24 * 60 * 60)
 
 				context.cards.append(card)
 
diff --git a/erpnext/setup/doctype/setup_progress/setup_progress.js b/erpnext/setup/doctype/setup_progress/setup_progress.js
deleted file mode 100644
index 5c78bd5..0000000
--- a/erpnext/setup/doctype/setup_progress/setup_progress.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Setup Progress', {
-	refresh: function() {
-
-	}
-});
diff --git a/erpnext/setup/doctype/setup_progress/setup_progress.json b/erpnext/setup/doctype/setup_progress/setup_progress.json
deleted file mode 100644
index 09072d4..0000000
--- a/erpnext/setup/doctype/setup_progress/setup_progress.json
+++ /dev/null
@@ -1,123 +0,0 @@
-{
- "allow_copy": 0, 
- "allow_guest_to_view": 0, 
- "allow_import": 0, 
- "allow_rename": 0, 
- "beta": 0, 
- "creation": "2017-08-27 21:01:42.032109", 
- "custom": 0, 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "", 
- "editable_grid": 1, 
- "engine": "InnoDB", 
- "fields": [
-  {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "actions_sb", 
-   "fieldtype": "Section 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, 
-   "label": "Actions", 
-   "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, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "actions", 
-   "fieldtype": "Table", 
-   "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": "Actions", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Setup Progress Action", 
-   "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, 
-   "unique": 0
-  }
- ], 
- "has_web_view": 0, 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "idx": 0, 
- "image_view": 0, 
- "in_create": 1, 
- "is_submittable": 0, 
- "issingle": 1, 
- "istable": 0, 
- "max_attachments": 0, 
- "modified": "2017-09-21 11:52:56.106659", 
- "modified_by": "Administrator", 
- "module": "Setup", 
- "name": "Setup Progress", 
- "name_case": "", 
- "owner": "Administrator", 
- "permissions": [
-  {
-   "amend": 0, 
-   "apply_user_permissions": 0, 
-   "cancel": 0, 
-   "create": 0, 
-   "delete": 0, 
-   "email": 1, 
-   "export": 0, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 0, 
-   "role": "All", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 0, 
-   "write": 1
-  }
- ], 
- "quick_entry": 1, 
- "read_only": 1, 
- "read_only_onload": 0, 
- "show_name_in_global_search": 0, 
- "sort_field": "modified", 
- "sort_order": "DESC", 
- "track_changes": 1, 
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/setup/doctype/setup_progress/setup_progress.py b/erpnext/setup/doctype/setup_progress/setup_progress.py
deleted file mode 100644
index e1402f5..0000000
--- a/erpnext/setup/doctype/setup_progress/setup_progress.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-import frappe, json
-from frappe.model.document import Document
-
-class SetupProgress(Document):
-	pass
-
-def get_setup_progress():
-	if not getattr(frappe.local, "setup_progress", None):
-		frappe.local.setup_progress = frappe.get_doc("Setup Progress", "Setup Progress")
-
-	return frappe.local.setup_progress
-
-def get_action_completed_state(action_name):
-	for d in get_setup_progress().actions:
-		if d.action_name == action_name:
-			return d.is_completed
-
-def update_action_completed_state(action_name):
-	action_table_doc = [d for d in get_setup_progress().actions
-		if d.action_name == action_name][0]
-	update_action(action_table_doc)
-
-def update_action(doc):
-	doctype = doc.action_doctype
-	docname = doc.action_document
-	field = doc.action_field
-
-	if not doc.is_completed:
-		if doc.min_doc_count:
-			if frappe.db.count(doctype) >= doc.min_doc_count:
-				doc.is_completed = 1
-				doc.save()
-		if docname and field:
-			d = frappe.get_doc(doctype, docname)
-			if d.get(field):
-				doc.is_completed = 1
-				doc.save()
-
-def update_domain_actions(domain):
-	for d in get_setup_progress().actions:
-		domains = json.loads(d.domains)
-		if domains == [] or domain in domains:
-			update_action(d)
-
-def get_domain_actions_state(domain):
-	state = {}
-	for d in get_setup_progress().actions:
-		domains = json.loads(d.domains)
-		if domains == [] or domain in domains:
-			state[d.action_name] = d.is_completed
-	return state
-
-@frappe.whitelist()
-def set_action_completed_state(action_name):
-	action_table_doc = [d for d in get_setup_progress().actions
-		if d.action_name == action_name][0]
-	action_table_doc.is_completed = 1
-	action_table_doc.save()
diff --git a/erpnext/setup/doctype/setup_progress/test_setup_progress.js b/erpnext/setup/doctype/setup_progress/test_setup_progress.js
deleted file mode 100644
index 9e84e0c..0000000
--- a/erpnext/setup/doctype/setup_progress/test_setup_progress.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Setup Progress", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(1);
-
-	frappe.run_serially([
-		// insert a new Setup Progress
-		() => frappe.tests.make('Setup Progress', [
-			// values to be set
-			{key: 'value'}
-		]),
-		() => {
-			assert.equal(cur_frm.doc.key, 'value');
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/setup/doctype/setup_progress/test_setup_progress.py b/erpnext/setup/doctype/setup_progress/test_setup_progress.py
deleted file mode 100644
index 8926219..0000000
--- a/erpnext/setup/doctype/setup_progress/test_setup_progress.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-from __future__ import unicode_literals
-
-import unittest
-
-class TestSetupProgress(unittest.TestCase):
-	pass
diff --git a/erpnext/setup/doctype/setup_progress_action/__init__.py b/erpnext/setup/doctype/setup_progress_action/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/setup/doctype/setup_progress_action/__init__.py
+++ /dev/null
diff --git a/erpnext/setup/doctype/setup_progress_action/setup_progress_action.json b/erpnext/setup/doctype/setup_progress_action/setup_progress_action.json
deleted file mode 100644
index e9abcbc..0000000
--- a/erpnext/setup/doctype/setup_progress_action/setup_progress_action.json
+++ /dev/null
@@ -1,253 +0,0 @@
-{
- "allow_copy": 0, 
- "allow_guest_to_view": 0, 
- "allow_import": 0, 
- "allow_rename": 0, 
- "beta": 0, 
- "creation": "2017-08-27 21:00:40.715360", 
- "custom": 0, 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "", 
- "editable_grid": 1, 
- "engine": "InnoDB", 
- "fields": [
-  {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "action_name", 
-   "fieldtype": "Data", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Action Name", 
-   "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": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "action_doctype", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Action Doctype", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "DocType", 
-   "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, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "action_document", 
-   "fieldtype": "Dynamic 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": "Action Document", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "action_doctype", 
-   "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, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "action_field", 
-   "fieldtype": "Data", 
-   "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": "Action Field", 
-   "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, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "min_doc_count", 
-   "fieldtype": "Int", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Min Doc Count", 
-   "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, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "domains", 
-   "fieldtype": "Code", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Domains", 
-   "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, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "is_completed", 
-   "fieldtype": "Check", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Is Completed", 
-   "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, 
-   "unique": 0
-  }
- ], 
- "has_web_view": 0, 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "idx": 0, 
- "image_view": 0, 
- "in_create": 1, 
- "is_submittable": 0, 
- "issingle": 0, 
- "istable": 1, 
- "max_attachments": 0, 
- "modified": "2017-09-01 14:34:59.685730", 
- "modified_by": "Administrator", 
- "module": "Setup", 
- "name": "Setup Progress Action", 
- "name_case": "", 
- "owner": "Administrator", 
- "permissions": [], 
- "quick_entry": 1, 
- "read_only": 1, 
- "read_only_onload": 0, 
- "show_name_in_global_search": 0, 
- "sort_field": "modified", 
- "sort_order": "DESC", 
- "track_changes": 1, 
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/setup/doctype/setup_progress_action/setup_progress_action.py b/erpnext/setup/doctype/setup_progress_action/setup_progress_action.py
deleted file mode 100644
index 24af943..0000000
--- a/erpnext/setup/doctype/setup_progress_action/setup_progress_action.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-from frappe.model.document import Document
-
-class SetupProgressAction(Document):
-	pass
diff --git "a/erpnext/setup/onboarding_slide/welcome_back_to_erpnext\041/welcome_back_to_erpnext\041.json" "b/erpnext/setup/onboarding_slide/welcome_back_to_erpnext\041/welcome_back_to_erpnext\041.json"
new file mode 100644
index 0000000..bf330d0
--- /dev/null
+++ "b/erpnext/setup/onboarding_slide/welcome_back_to_erpnext\041/welcome_back_to_erpnext\041.json"
@@ -0,0 +1,23 @@
+{
+ "add_more_button": 0,
+ "app": "ERPNext",
+ "creation": "2019-12-04 19:21:39.995776",
+ "docstatus": 0,
+ "doctype": "Onboarding Slide",
+ "domains": [],
+ "help_links": [],
+ "idx": 0,
+ "image_src": "/assets/erpnext/images/illustrations/desk-onboard.png",
+ "is_completed": 0,
+ "max_count": 3,
+ "modified": "2019-12-04 19:21:39.995776",
+ "modified_by": "Administrator",
+ "name": "Welcome back to ERPNext!",
+ "owner": "Administrator",
+ "slide_desc": "<p>Let's continue where you left from!</p>",
+ "slide_fields": [],
+ "slide_module": "Setup",
+ "slide_order": 0,
+ "slide_title": "Welcome back to ERPNext!",
+ "slide_type": "Continue"
+}
\ No newline at end of file
diff --git "a/erpnext/setup/onboarding_slide/welcome_to_erpnext\041/welcome_to_erpnext\041.json" "b/erpnext/setup/onboarding_slide/welcome_to_erpnext\041/welcome_to_erpnext\041.json"
new file mode 100644
index 0000000..4ea6985
--- /dev/null
+++ "b/erpnext/setup/onboarding_slide/welcome_to_erpnext\041/welcome_to_erpnext\041.json"
@@ -0,0 +1,22 @@
+{
+ "add_more_button": 0,
+ "app": "ERPNext",
+ "creation": "2019-11-26 17:01:26.671859",
+ "docstatus": 0,
+ "doctype": "Onboarding Slide",
+ "domains": [],
+ "help_links": [],
+ "idx": 0,
+ "image_src": "/assets/erpnext/images/illustrations/desk-onboard.png",
+ "max_count": 0,
+ "modified": "2019-12-03 22:49:12.871260",
+ "modified_by": "Administrator",
+ "name": "Welcome to ERPNext!",
+ "owner": "Administrator",
+ "slide_desc": "Setting up an ERP can be overwhelming. But don't worry, we have got your back!\nLet's setup your company.\nThis wizard will help you onboard to ERPNext in a short time!",
+ "slide_fields": [],
+ "slide_module": "Setup",
+ "slide_order": 1,
+ "slide_title": "Welcome to ERPNext!",
+ "slide_type": "Information"
+}
\ No newline at end of file
diff --git a/erpnext/setup/setup_wizard/test_setup_wizard.py b/erpnext/setup/setup_wizard/test_setup_wizard.py
deleted file mode 100644
index a489133..0000000
--- a/erpnext/setup/setup_wizard/test_setup_wizard.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-
-import frappe, time
-from frappe.utils.selenium_testdriver import TestDriver
-
-def run_setup_wizard_test():
-	driver = TestDriver()
-	frappe.db.set_default('in_selenium', '1')
-	frappe.db.commit()
-
-	driver.login('#page-setup-wizard')
-	print('Running Setup Wizard Test...')
-
-	# Language slide
-	driver.wait_for_ajax(True)
-	time.sleep(1)
-
-	driver.set_select("language", "English (United States)")
-	driver.wait_for_ajax(True)
-	time.sleep(1)
-	driver.click(".next-btn")
-
-	# Region slide
-	driver.wait_for_ajax(True)
-	driver.set_select("country", "India")
-	driver.wait_for_ajax(True)
-	time.sleep(1)
-	driver.click(".next-btn")
-
-	# Profile slide
-	driver.set_field("full_name", "Great Tester")
-	driver.set_field("email", "great@example.com")
-	driver.set_field("password", "test")
-	driver.wait_for_ajax(True)
-	time.sleep(1)
-	driver.click(".next-btn")
-	time.sleep(1)
-
-	# domain slide
-	driver.set_multicheck("domains", ["Manufacturing"])
-	time.sleep(1)
-	driver.click(".next-btn")
-
-	# Org slide
-	driver.set_field("company_name", "For Testing")
-	time.sleep(1)
-	driver.print_console()
-	driver.click(".next-btn")
-
-	driver.set_field("company_tagline", "Just for GST")
-	driver.set_field("bank_account", "HDFC")
-	time.sleep(3)
-	driver.click(".complete-btn")
-
-	# Wait for desktop
-	driver.wait_for('#page-desktop', timeout=600)
-
-	driver.print_console()
-	time.sleep(3)
-
-	frappe.db.set_default('in_selenium', None)
-	frappe.db.set_value("Company", "For Testing", "write_off_account", "Write Off - FT")
-	frappe.db.set_value("Company", "For Testing", "exchange_gain_loss_account", "Exchange Gain/Loss - FT")
-	frappe.db.commit()
-
-	driver.close()
-
-	return True
diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py
index d1c206d..1a86b79 100644
--- a/erpnext/setup/utils.py
+++ b/erpnext/setup/utils.py
@@ -106,7 +106,8 @@
 			# expire in 6 hours
 			response.raise_for_status()
 			value = response.json()["rates"][to_currency]
-			cache.setex(key, value, 6 * 60 * 60)
+
+			cache.set_value(key, value, expires_in_sec=6 * 60 * 60)
 		return flt(value)
 	except:
 		frappe.log_error(title="Get Exchange Rate")
diff --git a/erpnext/shopping_cart/cart.py b/erpnext/shopping_cart/cart.py
index 1236ade..813d0dd 100644
--- a/erpnext/shopping_cart/cart.py
+++ b/erpnext/shopping_cart/cart.py
@@ -66,6 +66,7 @@
 
 	from erpnext.selling.doctype.quotation.quotation import _make_sales_order
 	sales_order = frappe.get_doc(_make_sales_order(quotation.name, ignore_permissions=True))
+	sales_order.payment_schedule = []
 
 	if not cint(cart_settings.allow_items_not_in_stock):
 		for item in sales_order.get("items"):
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index 2f4abbc..e3d356f 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -49,7 +49,7 @@
 		if (!frm.doc.is_fixed_asset) {
 			erpnext.item.make_dashboard(frm);
 		}
-
+		
 		if (frm.doc.is_fixed_asset) {
 			frm.trigger('is_fixed_asset');
 			frm.trigger('auto_create_assets');
@@ -136,10 +136,25 @@
 		frm.toggle_reqd('customer', frm.doc.is_customer_provided_item ? 1:0);
 	},
 
+	gst_hsn_code: function(frm){
+		if(!frm.doc.taxes){
+			frappe.db.get_doc("GST HSN Code", frm.doc.gst_hsn_code).then(hsn_doc=>{
+				frm.doc.taxes = [];
+				$.each(hsn_doc.taxes || [], function(i, tax) {
+					let a = frappe.model.add_child(cur_frm.doc, 'Item Tax', 'taxes');
+					a.item_tax_template = tax.item_tax_template;
+					a.tax_category = tax.tax_category;
+					frm.refresh_field('taxes');
+				});
+			});
+		}
+	},
+
 	is_fixed_asset: function(frm) {
 		// set serial no to false & toggles its visibility
 		frm.set_value('has_serial_no', 0);
 		frm.toggle_enable(['has_serial_no', 'serial_no_series'], !frm.doc.is_fixed_asset);
+		frm.toggle_reqd(['asset_category'], frm.doc.is_fixed_asset);
 		frm.toggle_display(['has_serial_no', 'serial_no_series'], !frm.doc.is_fixed_asset);
 
 		frm.call({
@@ -150,6 +165,8 @@
 				frm.trigger("set_asset_naming_series");
 			}
 		});
+
+		frm.trigger('auto_create_assets');
 	},
 
 	set_asset_naming_series: function(frm) {
@@ -159,8 +176,8 @@
 	},
 
 	auto_create_assets: function(frm) {
-		frm.toggle_reqd(['asset_category', 'asset_naming_series'], frm.doc.auto_create_assets);
-		frm.toggle_display(['asset_category', 'asset_naming_series'], frm.doc.auto_create_assets);
+		frm.toggle_reqd(['asset_naming_series'], frm.doc.auto_create_assets);
+		frm.toggle_display(['asset_naming_series'], frm.doc.auto_create_assets);
 	},
 
 	page_name: frappe.utils.warn_page_name_change,
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 164c659..189261c 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -645,7 +645,7 @@
 											json.dumps(item_wise_tax_detail), update_modified=False)
 
 	def set_last_purchase_rate(self, new_name):
-		last_purchase_rate = get_last_purchase_details(new_name).get("base_rate", 0)
+		last_purchase_rate = get_last_purchase_details(new_name).get("base_net_rate", 0)
 		frappe.db.set_value("Item", new_name, "last_purchase_rate", last_purchase_rate)
 
 	def recalculate_bin_qty(self, new_name):
@@ -884,6 +884,54 @@
 			if not enabled:
 				frappe.msgprint(msg=_("You have to enable auto re-order in Stock Settings to maintain re-order levels."), title=_("Enable Auto Re-Order"), indicator="orange")
 
+	def create_onboarding_docs(self, args):
+		defaults = frappe.defaults.get_defaults()
+		for i in range(1, args.get('max_count')):
+			item = args.get('item_' + str(i))
+			if item:
+				default_warehouse = ''
+				default_warehouse = frappe.db.get_value('Warehouse', filters={
+					'warehouse_name': _('Finished Goods'),
+					'company': defaults.get('company_name')
+				})
+
+				try:
+					frappe.get_doc({
+						'doctype': self.doctype,
+						'item_code': item,
+						'item_name': item,
+						'description': item,
+						'show_in_website': 1,
+						'is_sales_item': 1,
+						'is_purchase_item': 1,
+						'is_stock_item': 1,
+						'item_group': _('Products'),
+						'stock_uom': _(args.get('item_uom_' + str(i))),
+						'item_defaults': [{
+							'default_warehouse': default_warehouse,
+							'company': defaults.get('company_name')
+						}]
+					}).insert()
+
+				except frappe.NameError:
+					pass
+				else:
+					if args.get('item_price_' + str(i)):
+						item_price = flt(args.get('tem_price_' + str(i)))
+
+						price_list_name = frappe.db.get_value('Price List', {'selling': 1})
+						make_item_price(item, price_list_name, item_price)
+						price_list_name = frappe.db.get_value('Price List', {'buying': 1})
+						make_item_price(item, price_list_name, item_price)
+
+def make_item_price(item, price_list_name, item_price):
+	frappe.get_doc({
+		'doctype': 'Item Price',
+		'price_list': price_list_name,
+		'item_code': item,
+		'price_list_rate': item_price
+	}).insert()
+
 def get_timeline_data(doctype, name):
 	'''returns timeline data based on stock ledger entry'''
 	out = {}
@@ -942,7 +990,7 @@
 	last_purchase_order = frappe.db.sql("""\
 		select po.name, po.transaction_date, po.conversion_rate,
 			po_item.conversion_factor, po_item.base_price_list_rate,
-			po_item.discount_percentage, po_item.base_rate
+			po_item.discount_percentage, po_item.base_rate, po_item.base_net_rate
 		from `tabPurchase Order` po, `tabPurchase Order Item` po_item
 		where po.docstatus = 1 and po_item.item_code = %s and po.name != %s and
 			po.name = po_item.parent
@@ -953,7 +1001,7 @@
 	last_purchase_receipt = frappe.db.sql("""\
 		select pr.name, pr.posting_date, pr.posting_time, pr.conversion_rate,
 			pr_item.conversion_factor, pr_item.base_price_list_rate, pr_item.discount_percentage,
-			pr_item.base_rate
+			pr_item.base_rate, pr_item.base_net_rate
 		from `tabPurchase Receipt` pr, `tabPurchase Receipt Item` pr_item
 		where pr.docstatus = 1 and pr_item.item_code = %s and pr.name != %s and
 			pr.name = pr_item.parent
@@ -984,6 +1032,7 @@
 	out = frappe._dict({
 		"base_price_list_rate": flt(last_purchase.base_price_list_rate) / conversion_factor,
 		"base_rate": flt(last_purchase.base_rate) / conversion_factor,
+		"base_net_rate": flt(last_purchase.net_rate) / conversion_factor,
 		"discount_percentage": flt(last_purchase.discount_percentage),
 		"purchase_date": purchase_date
 	})
@@ -992,7 +1041,8 @@
 	out.update({
 		"price_list_rate": out.base_price_list_rate / conversion_rate,
 		"rate": out.base_rate / conversion_rate,
-		"base_rate": out.base_rate
+		"base_rate": out.base_rate,
+		"base_net_rate": out.base_net_rate
 	})
 
 	return out
diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.json b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.json
index 46fdc8f..0149280 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.json
+++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.json
@@ -8,11 +8,11 @@
   "naming_series",
   "company",
   "purchase_receipts",
-  "sec_break1",
-  "taxes",
   "purchase_receipt_items",
   "get_items_from_purchase_receipts",
   "items",
+  "sec_break1",
+  "taxes",
   "section_break_9",
   "total_taxes_and_charges",
   "col_break1",
@@ -123,7 +123,7 @@
  ],
  "icon": "icon-usd",
  "is_submittable": 1,
- "modified": "2019-10-09 13:39:36.082777",
+ "modified": "2019-11-21 15:34:10.846093",
  "modified_by": "Administrator",
  "module": "Stock",
  "name": "Landed Cost Voucher",
diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
index 173b394..7df40fb 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
+++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
@@ -138,8 +138,8 @@
 			if item.is_fixed_asset:
 				receipt_document_type = 'purchase_invoice' if item.receipt_document_type == 'Purchase Invoice' \
 						else 'purchase_receipt'
-				docs = frappe.db.get_all('Asset', filters={ receipt_document_type: item.receipt_document }, 
-					fields=['name', 'docstatus'])
+				docs = frappe.db.get_all('Asset', filters={ receipt_document_type: item.receipt_document,
+					'item_code': item.item_code }, fields=['name', 'docstatus'])
 				if not docs or len(docs) != item.qty:
 					frappe.throw(_('There are not enough asset created or linked to {0}. \
 						Please create or link {1} Assets with respective document.').format(item.receipt_document, item.qty))
@@ -148,8 +148,7 @@
 						if d.docstatus == 1:
 							frappe.throw(_('{2} <b>{0}</b> has submitted Assets.\
 								Remove Item <b>{1}</b> from table to continue.').format(
-									item.receipt_document, item.item_code, item.receipt_document_type)
-								)
+									item.receipt_document, item.item_code, item.receipt_document_type))
 
 	def update_rate_in_serial_no_for_non_asset_items(self, receipt_document):
 		for item in receipt_document.get("items"):
diff --git a/erpnext/stock/doctype/packed_item/packed_item.json b/erpnext/stock/doctype/packed_item/packed_item.json
index b089e75..2ac5c42 100644
--- a/erpnext/stock/doctype/packed_item/packed_item.json
+++ b/erpnext/stock/doctype/packed_item/packed_item.json
@@ -18,6 +18,7 @@
   "serial_no",
   "column_break_11",
   "batch_no",
+  "actual_batch_qty",
   "section_break_13",
   "actual_qty",
   "projected_qty",
@@ -189,15 +190,26 @@
    "oldfieldtype": "Data",
    "print_hide": 1,
    "read_only": 1
+  },
+  {
+   "depends_on": "batch_no",
+   "fieldname": "actual_batch_qty",
+   "fieldtype": "Float",
+   "label": "Actual Batch Quantity",
+   "no_copy": 1,
+   "print_hide": 1,
+   "read_only": 1
   }
  ],
  "idx": 1,
  "istable": 1,
- "modified": "2019-08-27 18:17:37.167512",
+ "modified": "2019-11-26 20:09:59.400960",
  "modified_by": "Administrator",
  "module": "Stock",
  "name": "Packed Item",
  "owner": "Administrator",
  "permissions": [],
+ "sort_field": "modified",
+ "sort_order": "DESC",
  "track_changes": 1
 }
diff --git a/erpnext/stock/doctype/packed_item/packed_item.py b/erpnext/stock/doctype/packed_item/packed_item.py
index 831381c..5341f29 100644
--- a/erpnext/stock/doctype/packed_item/packed_item.py
+++ b/erpnext/stock/doctype/packed_item/packed_item.py
@@ -65,7 +65,7 @@
 	bin = get_bin_qty(packing_item_code, pi.warehouse)
 	pi.actual_qty = flt(bin.get("actual_qty"))
 	pi.projected_qty = flt(bin.get("projected_qty"))
-	if old_packed_items_map:
+	if old_packed_items_map and old_packed_items_map.get((packing_item_code, main_item_row.item_code)):
 		pi.batch_no = old_packed_items_map.get((packing_item_code, main_item_row.item_code))[0].batch_no
 		pi.serial_no = old_packed_items_map.get((packing_item_code, main_item_row.item_code))[0].serial_no
 		pi.warehouse = old_packed_items_map.get((packing_item_code, main_item_row.item_code))[0].warehouse
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
index d5914f9..6b5e40e 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
@@ -34,6 +34,12 @@
 				filters: {'company': frm.doc.company }
 			}
 		});
+
+		frm.set_query("taxes_and_charges", function() {
+			return {
+				filters: {'company': frm.doc.company }
+			}
+		});
 		
 	},
 	onload: function(frm) {
@@ -296,4 +302,4 @@
 			}
 		});
 	}
-};
\ No newline at end of file
+};
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 0cb21d7..d0fae6a 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -82,11 +82,21 @@
 		self.validate_with_previous_doc()
 		self.validate_uom_is_integer("uom", ["qty", "received_qty"])
 		self.validate_uom_is_integer("stock_uom", "stock_qty")
+		self.validate_cwip_accounts()
 
 		self.check_on_hold_or_closed_status()
 
 		if getdate(self.posting_date) > getdate(nowdate()):
 			throw(_("Posting Date cannot be future date"))
+	
+	def validate_cwip_accounts(self):
+		for item in self.get('items'):
+			if item.is_fixed_asset and is_cwip_accounting_enabled(item.asset_category):
+				# check cwip accounts before making auto assets
+				# Improves UX by not giving messages of "Assets Created" before throwing error of not finding arbnb account
+				arbnb_account = self.get_company_default("asset_received_but_not_billed")
+				cwip_account = get_asset_account("capital_work_in_progress_account", company = self.company)
+				break
 
 	def validate_with_previous_doc(self):
 		super(PurchaseReceipt, self).validate_with_previous_doc({
@@ -343,7 +353,7 @@
 	def get_asset_gl_entry(self, gl_entries):
 		for item in self.get("items"):
 			if item.is_fixed_asset:
-				if is_cwip_accounting_enabled(self.company, item.asset_category):
+				if is_cwip_accounting_enabled(item.asset_category):
 					self.add_asset_gl_entries(item, gl_entries)
 				if flt(item.landed_cost_voucher_amount):
 					self.add_lcv_gl_entries(item, gl_entries)
@@ -386,7 +396,7 @@
 	
 	def add_lcv_gl_entries(self, item, gl_entries):
 		expenses_included_in_asset_valuation = self.get_company_default("expenses_included_in_asset_valuation")
-		if not is_cwip_accounting_enabled(self.company, item.asset_category):
+		if not is_cwip_accounting_enabled(item.asset_category):
 			asset_account = get_asset_category_account(asset_category=item.asset_category, \
 					fieldname='fixed_asset_account', company=self.company)
 		else:
diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.py b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
index 738c63c..37ab807 100644
--- a/erpnext/stock/doctype/quality_inspection/quality_inspection.py
+++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
@@ -6,6 +6,7 @@
 from frappe.model.document import Document
 from erpnext.stock.doctype.quality_inspection_template.quality_inspection_template \
 	import get_template_details
+from frappe.model.mapper import get_mapped_doc
 
 class QualityInspection(Document):
 	def validate(self):
@@ -84,3 +85,37 @@
 			parent=filters.get('parent'), cond = cond, mcond = mcond, start = start,
 			page_len = page_len, qi_condition = qi_condition),
 			{'parent': filters.get('parent'), 'txt': "%%%s%%" % txt})
+
+def quality_inspection_query(doctype, txt, searchfield, start, page_len, filters):
+	return frappe.get_all('Quality Inspection',
+		limit_start=start,
+		limit_page_length=page_len,
+		filters = {
+			'docstatus': 1,
+			'name': ('like', '%%%s%%' % txt),
+			'item_code': filters.get("item_code"),
+			'reference_name': ('in', [filters.get("reference_name", ''), ''])
+		}, as_list=1)
+
+@frappe.whitelist()
+def make_quality_inspection(source_name, target_doc=None):
+	def postprocess(source, doc):
+		doc.inspected_by = frappe.session.user
+		doc.get_quality_inspection_template()
+
+	doc = get_mapped_doc("BOM", source_name, {
+		'BOM': {
+			"doctype": "Quality Inspection",
+			"validation": {
+				"docstatus": ["=", 1]
+			},
+			"field_map": {
+				"name": "bom_no",
+				"item": "item_code",
+				"stock_uom": "uom",
+				"stock_qty": "qty"
+			},
+		}
+	}, target_doc, postprocess)
+
+	return doc
\ No newline at end of file
diff --git a/erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.js b/erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.js
index a6f7343..f261fd9 100644
--- a/erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.js
+++ b/erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.js
@@ -16,7 +16,7 @@
 			frm.add_custom_button(__('Stock Balance Report'), () => {
 				frappe.set_route('query-report', 'Stock Balance',
 					{ 'item_code': frm.doc.item, 'warehouse': frm.doc.warehouse });
-			}).addClass("btn-primary");
+			});
 		}
 	},
 
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 6e78b98..4770471 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -102,11 +102,12 @@
 
 		frm.set_query("quality_inspection", "items", function(doc, cdt, cdn) {
 			var d = locals[cdt][cdn];
+
 			return {
+				query:"erpnext.stock.doctype.quality_inspection.quality_inspection.quality_inspection_query",
 				filters: {
-					docstatus: 1,
-					item_code: d.item_code,
-					reference_name: doc.name
+					'item_code': d.item_code,
+					'reference_name': doc.name
 				}
 			}
 		});
@@ -248,6 +249,8 @@
 			}, __("Get items from"));
 		}
 
+		frm.events.show_bom_custom_button(frm);
+
 		if (frm.doc.company) {
 			frm.trigger("toggle_display_account_head");
 		}
@@ -261,6 +264,11 @@
 		frm.trigger("setup_quality_inspection");
 	},
 
+	stock_entry_type: function(frm){
+		frm.remove_custom_button('Bill of Materials', "Get items from");
+		frm.events.show_bom_custom_button(frm);
+	},
+
 	purpose: function(frm) {
 		frm.trigger('validate_purpose_consumption');
 		frm.fields_dict.items.grid.refresh();
@@ -397,6 +405,85 @@
 		}
 	},
 
+	show_bom_custom_button: function(frm){
+		if (frm.doc.docstatus === 0 &&
+			['Material Issue', 'Material Receipt', 'Material Transfer', 'Send to Subcontractor'].includes(frm.doc.purpose)) {
+				frm.add_custom_button(__('Bill of Materials'), function() {
+					frm.events.get_items_from_bom(frm);
+				}, __("Get items from"));
+		}
+	},
+
+	get_items_from_bom: function(frm) {
+		let filters = function(){
+			return {filters: { docstatus:1 }};
+		}
+
+		let fields = [
+			{"fieldname":"bom", "fieldtype":"Link", "label":__("BOM"),
+			options:"BOM", reqd: 1, get_query: filters()},
+			{"fieldname":"source_warehouse", "fieldtype":"Link", "label":__("Source Warehouse"),
+			options:"Warehouse"},
+			{"fieldname":"target_warehouse", "fieldtype":"Link", "label":__("Target Warehouse"),
+			options:"Warehouse"},
+			{"fieldname":"qty", "fieldtype":"Float", "label":__("Quantity"),
+			reqd: 1, "default": 1},
+			{"fieldname":"fetch_exploded", "fieldtype":"Check",
+			"label":__("Fetch exploded BOM (including sub-assemblies)"), "default":1},
+			{"fieldname":"fetch", "label":__("Get Items from BOM"), "fieldtype":"Button"}
+		]
+
+		// Exclude field 'Target Warehouse' in case of Material Issue
+		if (frm.doc.purpose == 'Material Issue'){
+			fields.splice(2,1);
+		}
+		// Exclude field 'Source Warehouse' in case of Material Receipt
+		else if(frm.doc.purpose == 'Material Receipt'){
+			fields.splice(1,1);
+		}
+
+		let d = new frappe.ui.Dialog({
+			title: __("Get Items from BOM"),
+			fields: fields
+		});
+		d.get_input("fetch").on("click", function() {
+			let values = d.get_values();
+			if(!values) return;
+			values["company"] = frm.doc.company;
+			if(!frm.doc.company) frappe.throw(__("Company field is required"));
+			frappe.call({
+				method: "erpnext.manufacturing.doctype.bom.bom.get_bom_items",
+				args: values,
+				callback: function(r) {
+					if (!r.message) {
+						frappe.throw(__("BOM does not contain any stock item"));
+					} else {
+						erpnext.utils.remove_empty_first_row(frm, "items");
+						$.each(r.message, function(i, item) {
+							let d = frappe.model.add_child(cur_frm.doc, "Stock Entry Detail", "items");
+							d.item_code = item.item_code;
+							d.item_name = item.item_name;
+							d.item_group = item.item_group;
+							d.s_warehouse = values.source_warehouse;
+							d.t_warehouse = values.target_warehouse;
+							d.uom = item.stock_uom;
+							d.stock_uom = item.stock_uom;
+							d.conversion_factor = item.conversion_factor ? item.conversion_factor : 1;
+							d.qty = item.qty;
+							d.expense_account = item.expense_account;
+							d.project = item.project;
+							frm.events.set_basic_rate(frm, d.doctype, d.name);
+						});
+					}
+					d.hide();
+					refresh_field("items");
+				}
+			});
+
+		});
+		d.show();
+	},
+
 	calculate_basic_amount: function(frm, item) {
 		item.basic_amount = flt(flt(item.transfer_qty) * flt(item.basic_rate),
 			precision("basic_amount", item));
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 26693d2..f81fa68 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -91,6 +91,7 @@
 		self.update_cost_in_project()
 		self.validate_reserved_serial_no_consumption()
 		self.update_transferred_qty()
+		self.update_quality_inspection()
 		if self.work_order and self.purpose == "Manufacture":
 			self.update_so_in_serial_number()
 
@@ -108,6 +109,7 @@
 		self.make_gl_entries_on_cancel()
 		self.update_cost_in_project()
 		self.update_transferred_qty()
+		self.update_quality_inspection()
 
 	def set_job_card_data(self):
 		if self.job_card and not self.work_order:
@@ -1285,6 +1287,20 @@
 
 			self._update_percent_field_in_targets(args, update_modified=True)
 
+	def update_quality_inspection(self):
+		if self.inspection_required:
+			reference_type = reference_name = ''
+			if self.docstatus == 1:
+				reference_name = self.name
+				reference_type = 'Stock Entry'
+
+			for d in self.items:
+				if d.quality_inspection:
+					frappe.db.set_value("Quality Inspection", d.quality_inspection, {
+						'reference_type': reference_type,
+						'reference_name': reference_name
+					})
+
 @frappe.whitelist()
 def move_sample_to_retention_warehouse(company, items):
 	if isinstance(items, string_types):
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json
index 947f948..c9eba71 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json
@@ -1,874 +1,299 @@
 {
  "allow_copy": 1,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
  "autoname": "MAT-SLE-.YYYY.-.#####",
- "beta": 0,
  "creation": "2013-01-29 19:25:42",
- "custom": 0,
- "docstatus": 0,
  "doctype": "DocType",
  "document_type": "Other",
- "editable_grid": 0,
  "engine": "InnoDB",
+ "field_order": [
+  "item_code",
+  "serial_no",
+  "batch_no",
+  "warehouse",
+  "posting_date",
+  "posting_time",
+  "voucher_type",
+  "voucher_no",
+  "voucher_detail_no",
+  "actual_qty",
+  "incoming_rate",
+  "outgoing_rate",
+  "stock_uom",
+  "qty_after_transaction",
+  "valuation_rate",
+  "stock_value",
+  "stock_value_difference",
+  "stock_queue",
+  "project",
+  "company",
+  "fiscal_year",
+  "is_cancelled",
+  "to_rename"
+ ],
  "fields": [
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "item_code",
    "fieldtype": "Link",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
    "in_filter": 1,
-   "in_global_search": 0,
    "in_list_view": 1,
    "in_standard_filter": 1,
    "label": "Item Code",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "item_code",
    "oldfieldtype": "Link",
    "options": "Item",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "100px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
    "search_index": 1,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "100px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "serial_no",
-   "fieldtype": "Text",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
+   "fieldtype": "Long Text",
    "in_list_view": 1,
-   "in_standard_filter": 0,
    "label": "Serial No",
-   "length": 0,
-   "no_copy": 0,
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "100px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "100px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "batch_no",
    "fieldtype": "Data",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
    "in_list_view": 1,
-   "in_standard_filter": 0,
    "label": "Batch No",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "batch_no",
    "oldfieldtype": "Data",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "warehouse",
    "fieldtype": "Link",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
    "in_filter": 1,
-   "in_global_search": 0,
    "in_list_view": 1,
    "in_standard_filter": 1,
    "label": "Warehouse",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "warehouse",
    "oldfieldtype": "Link",
    "options": "Warehouse",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "100px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
    "search_index": 1,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "100px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "posting_date",
    "fieldtype": "Date",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
    "in_filter": 1,
-   "in_global_search": 0,
    "in_list_view": 1,
-   "in_standard_filter": 0,
    "label": "Posting Date",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "posting_date",
    "oldfieldtype": "Date",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "100px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
    "search_index": 1,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "100px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "posting_time",
    "fieldtype": "Time",
-   "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": "Posting Time",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "posting_time",
    "oldfieldtype": "Time",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "100px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "100px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "voucher_type",
    "fieldtype": "Link",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
    "in_filter": 1,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "Voucher Type",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "voucher_type",
    "oldfieldtype": "Data",
    "options": "DocType",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "150px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "150px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "voucher_no",
    "fieldtype": "Dynamic Link",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
    "in_filter": 1,
-   "in_global_search": 0,
-   "in_list_view": 0,
    "in_standard_filter": 1,
    "label": "Voucher No",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "voucher_no",
    "oldfieldtype": "Data",
    "options": "voucher_type",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "150px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "150px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "voucher_detail_no",
    "fieldtype": "Data",
-   "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": "Voucher Detail No",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "voucher_detail_no",
    "oldfieldtype": "Data",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "150px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "150px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "actual_qty",
    "fieldtype": "Float",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
    "in_filter": 1,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "Actual Quantity",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "actual_qty",
    "oldfieldtype": "Currency",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "150px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "150px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "incoming_rate",
    "fieldtype": "Currency",
-   "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": "Incoming Rate",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "incoming_rate",
    "oldfieldtype": "Currency",
    "options": "Company:company:default_currency",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "outgoing_rate",
    "fieldtype": "Currency",
-   "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": "Outgoing Rate",
-   "length": 0,
-   "no_copy": 0,
    "options": "Company:company:default_currency",
-   "permlevel": 0,
-   "precision": "",
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "stock_uom",
    "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": "Stock UOM",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "stock_uom",
    "oldfieldtype": "Data",
    "options": "UOM",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "150px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "150px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "qty_after_transaction",
    "fieldtype": "Float",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
    "in_filter": 1,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "Actual Qty After Transaction",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "bin_aqat",
    "oldfieldtype": "Currency",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "150px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "150px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "valuation_rate",
    "fieldtype": "Currency",
-   "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": "Valuation Rate",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "valuation_rate",
    "oldfieldtype": "Currency",
    "options": "Company:company:default_currency",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "150px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "150px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "stock_value",
    "fieldtype": "Currency",
-   "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": "Stock Value",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "stock_value",
    "oldfieldtype": "Currency",
    "options": "Company:company:default_currency",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "stock_value_difference",
    "fieldtype": "Currency",
-   "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": "Stock Value Difference",
-   "length": 0,
-   "no_copy": 0,
    "options": "Company:company:default_currency",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "read_only": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "stock_queue",
    "fieldtype": "Text",
    "hidden": 1,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "Stock Queue (FIFO)",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "fcfs_stack",
    "oldfieldtype": "Text",
-   "permlevel": 0,
    "print_hide": 1,
-   "print_hide_if_no_value": 0,
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 1,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "report_hide": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "project",
    "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": "Project",
-   "length": 0,
-   "no_copy": 0,
-   "options": "Project",
-   "permlevel": 0,
-   "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
+   "options": "Project"
   },
   {
-   "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": 1,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "Company",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "company",
    "oldfieldtype": "Data",
    "options": "Company",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "150px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "150px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "fiscal_year",
    "fieldtype": "Data",
-   "hidden": 0,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
    "in_filter": 1,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "Fiscal Year",
-   "length": 0,
-   "no_copy": 0,
    "oldfieldname": "fiscal_year",
    "oldfieldtype": "Data",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
    "print_width": "150px",
    "read_only": 1,
-   "remember_last_selected_value": 0,
-   "report_hide": 0,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0,
    "width": "150px"
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "fieldname": "is_cancelled",
    "fieldtype": "Select",
    "hidden": 1,
-   "ignore_user_permissions": 0,
-   "ignore_xss_filter": 0,
-   "in_filter": 0,
-   "in_global_search": 0,
-   "in_list_view": 0,
-   "in_standard_filter": 0,
    "label": "Is Cancelled",
-   "length": 0,
-   "no_copy": 0,
    "options": "\nNo\nYes",
-   "permlevel": 0,
-   "print_hide": 0,
-   "print_hide_if_no_value": 0,
-   "read_only": 0,
-   "remember_last_selected_value": 0,
-   "report_hide": 1,
-   "reqd": 0,
-   "search_index": 0,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "report_hide": 1
   },
   {
-   "allow_bulk_edit": 0,
-   "allow_in_quick_entry": 0,
-   "allow_on_submit": 0,
-   "bold": 0,
-   "collapsible": 0,
-   "columns": 0,
    "default": "1",
    "fieldname": "to_rename",
    "fieldtype": "Check",
    "hidden": 1,
-   "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 Rename",
-   "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": 1,
-   "set_only_once": 0,
-   "translatable": 0,
-   "unique": 0
+   "search_index": 1
   }
  ],
- "has_web_view": 0,
- "hide_heading": 0,
  "hide_toolbar": 1,
  "icon": "fa fa-list",
  "idx": 1,
- "image_view": 0,
  "in_create": 1,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2019-01-07 07:04:37.523024",
+ "modified": "2019-11-27 12:17:31.522675",
  "modified_by": "Administrator",
  "module": "Stock",
  "name": "Stock Ledger Entry",
  "owner": "Administrator",
  "permissions": [
   {
-   "amend": 0,
-   "cancel": 0,
-   "create": 0,
-   "delete": 0,
-   "email": 0,
    "export": 1,
-   "if_owner": 0,
-   "import": 0,
-   "permlevel": 0,
    "print": 1,
    "read": 1,
    "report": 1,
-   "role": "Stock User",
-   "set_user_permissions": 0,
-   "share": 0,
-   "submit": 0,
-   "write": 0
+   "role": "Stock User"
   },
   {
-   "amend": 0,
-   "cancel": 0,
-   "create": 0,
-   "delete": 0,
-   "email": 0,
    "export": 1,
-   "if_owner": 0,
-   "import": 0,
-   "permlevel": 0,
-   "print": 0,
    "read": 1,
    "report": 1,
-   "role": "Accounts Manager",
-   "set_user_permissions": 0,
-   "share": 0,
-   "submit": 0,
-   "write": 0
+   "role": "Accounts Manager"
   }
  ],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
  "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0,
- "track_views": 0
+ "sort_order": "DESC"
 }
\ No newline at end of file
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 9f47edc..76644ed 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -213,7 +213,8 @@
 			project: "",
 			qty: "",
 			stock_qty: "",
-			conversion_factor: ""
+			conversion_factor: "",
+			against_blanket_order: 0/1
 		}
 	:param item: `item_code` of Item object
 	:return: frappe._dict
@@ -254,6 +255,12 @@
 		args['material_request_type'] = frappe.db.get_value('Material Request',
 			args.get('name'), 'material_request_type', cache=True)
 
+	expense_account = None
+
+	if args.get('doctype') == 'Purchase Invoice' and item.is_fixed_asset:
+		from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account
+		expense_account = get_asset_category_account(fieldname = "fixed_asset_account", item = args.item_code, company= args.company)
+
 	#Set the UOM to the Default Sales UOM or Default Purchase UOM if configured in the Item Master
 	if not args.uom:
 		if args.get('doctype') in sales_doctypes:
@@ -271,7 +278,7 @@
 		"image": cstr(item.image).strip(),
 		"warehouse": warehouse,
 		"income_account": get_default_income_account(args, item_defaults, item_group_defaults, brand_defaults),
-		"expense_account": get_default_expense_account(args, item_defaults, item_group_defaults, brand_defaults),
+		"expense_account": expense_account or get_default_expense_account(args, item_defaults, item_group_defaults, brand_defaults) ,
 		"cost_center": get_default_cost_center(args, item_defaults, item_group_defaults, brand_defaults),
 		'has_serial_no': item.has_serial_no,
 		'has_batch_no': item.has_batch_no,
@@ -296,7 +303,8 @@
 		"weight_per_unit":item.weight_per_unit,
 		"weight_uom":item.weight_uom,
 		"last_purchase_rate": item.last_purchase_rate if args.get("doctype") in ["Purchase Order"] else 0,
-		"transaction_date": args.get("transaction_date")
+		"transaction_date": args.get("transaction_date"),
+		"against_blanket_order": args.get("against_blanket_order")
 	})
 
 	if item.get("enable_deferred_revenue") or item.get("enable_deferred_expense"):
@@ -990,9 +998,10 @@
 
 
 def update_party_blanket_order(args, out):
-	blanket_order_details = get_blanket_order_details(args)
-	if blanket_order_details:
-		out.update(blanket_order_details)
+	if out["against_blanket_order"]:
+		blanket_order_details = get_blanket_order_details(args)
+		if blanket_order_details:
+			out.update(blanket_order_details)
 
 @frappe.whitelist()
 def get_blanket_order_details(args):
diff --git a/erpnext/stock/onboarding_slide/add_a_few_products_you_buy_or_sell/add_a_few_products_you_buy_or_sell.json b/erpnext/stock/onboarding_slide/add_a_few_products_you_buy_or_sell/add_a_few_products_you_buy_or_sell.json
new file mode 100644
index 0000000..27a3062
--- /dev/null
+++ b/erpnext/stock/onboarding_slide/add_a_few_products_you_buy_or_sell/add_a_few_products_you_buy_or_sell.json
@@ -0,0 +1,51 @@
+{
+ "add_more_button": 1,
+ "app": "ERPNext",
+ "creation": "2019-11-15 14:41:12.007359",
+ "docstatus": 0,
+ "doctype": "Onboarding Slide",
+ "domains": [],
+ "help_links": [],
+ "idx": 0,
+ "image_src": "/assets/erpnext/images/illustrations/products-onboard.png",
+ "max_count": 3,
+ "modified": "2019-12-03 22:54:07.558632",
+ "modified_by": "Administrator",
+ "name": "Add A Few Products You Buy Or Sell",
+ "owner": "Administrator",
+ "ref_doctype": "Item",
+ "slide_desc": "",
+ "slide_fields": [
+  {
+   "align": "",
+   "fieldname": "item",
+   "fieldtype": "Data",
+   "label": "Item",
+   "placeholder": "Product Name",
+   "reqd": 1
+  },
+  {
+   "align": "",
+   "fieldname": "item_price",
+   "fieldtype": "Currency",
+   "label": "Item Price",
+   "reqd": 1
+  },
+  {
+   "align": "",
+   "fieldtype": "Column Break",
+   "reqd": 0
+  },
+  {
+   "align": "",
+   "fieldname": "uom",
+   "fieldtype": "Link",
+   "label": "UOM",
+   "options": "UOM",
+   "reqd": 1
+  }
+ ],
+ "slide_order": 30,
+ "slide_title": "Add A Few Products You Buy Or Sell",
+ "slide_type": "Create"
+}
\ No newline at end of file
diff --git a/erpnext/stock/report/purchase_order_items_to_be_received_or_billed/purchase_order_items_to_be_received_or_billed.json b/erpnext/stock/report/purchase_order_items_to_be_received_or_billed/purchase_order_items_to_be_received_or_billed.json
index caf7eb8..48c0f42 100644
--- a/erpnext/stock/report/purchase_order_items_to_be_received_or_billed/purchase_order_items_to_be_received_or_billed.json
+++ b/erpnext/stock/report/purchase_order_items_to_be_received_or_billed/purchase_order_items_to_be_received_or_billed.json
@@ -15,7 +15,7 @@
  "prepared_report": 0,
  "query": "SELECT\n\t`poi_pri`.`purchase_order` as \"Purchase Order:Link/Purchase Order:120\",\n\t`poi_pri`.`status` as \"Status:Data:120\",\n\t`poi_pri`.`transaction_date` as \"Date:Date:100\",\n\t`poi_pri`.`schedule_date` as \"Reqd by Date:Date:110\",\n\t`poi_pri`.`supplier` as \"Supplier:Link/Supplier:120\",\n\t`poi_pri`.`supplier_name` as \"Supplier Name::150\",\n\t`poi_pri`.`item_code` as \"Item Code:Link/Item:120\",\n\t`poi_pri`.`qty` as \"Qty:Float:100\",\n\t`poi_pri`.`base_amount` as  \"Base Amount:Currency:100\",\n\t`poi_pri`.`received_qty` as \"Received Qty:Float:100\",\n\t`poi_pri`.`received_amount` as \"Received Qty Amount:Currency:100\",\n\t`poi_pri`.`qty_to_receive` as \"Qty to Receive:Float:100\",\n\t`poi_pri`.`amount_to_be_received` as \"Amount to Receive:Currency:100\",\n\t`poi_pri`.`billed_amount` as  \"Billed Amount:Currency:100\",\n\t`poi_pri`.`amount_to_be_billed` as  \"Amount To Be Billed:Currency:100\",\n\tSUM(`pii`.`qty`) AS \"Billed Qty:Float:100\",\n\t`poi_pri`.qty - SUM(`pii`.`qty`) AS \"Qty To Be Billed:Float:100\",\n\t`poi_pri`.`warehouse` as \"Warehouse:Link/Warehouse:150\",\n\t`poi_pri`.`item_name` as \"Item Name::150\",\n\t`poi_pri`.`description` as \"Description::200\",\n\t`poi_pri`.`brand` as \"Brand::100\",\n\t`poi_pri`.`project` as \"Project\",\n\t`poi_pri`.`company` as \"Company:Link/Company:\"\nFROM\n\t(SELECT\n\t\t`po`.`name` AS 'purchase_order',\n\t\t`po`.`status`,\n\t\t`po`.`company`,\n\t\t`poi`.`warehouse`,\n\t\t`poi`.`brand`,\n\t\t`poi`.`description`,\n\t\t`po`.`transaction_date`,\n\t\t`poi`.`schedule_date`,\n\t\t`po`.`supplier`,\n\t\t`po`.`supplier_name`,\n\t\t`poi`.`project`,\n\t\t`poi`.`item_code`,\n\t\t`poi`.`item_name`,\n\t\t`poi`.`qty`,\n\t\t`poi`.`base_amount`,\n\t\t`poi`.`received_qty`,\n\t\t(`poi`.billed_amt * ifnull(`po`.conversion_rate, 1)) as billed_amount,\n\t\t(`poi`.base_amount - (`poi`.billed_amt * ifnull(`po`.conversion_rate, 1))) as amount_to_be_billed,\n\t\t`poi`.`qty` - IFNULL(`poi`.`received_qty`, 0) AS 'qty_to_receive',\n\t\t(`poi`.`qty` - IFNULL(`poi`.`received_qty`, 0)) * `poi`.`rate` AS 'amount_to_be_received',\n\t\tSUM(`pri`.`amount`) AS 'received_amount',\n\t\t`poi`.`name` AS 'poi_name',\n\t\t`pri`.`name` AS 'pri_name'\n\tFROM\n\t\t`tabPurchase Order` po\n\t\tLEFT JOIN `tabPurchase Order Item` poi\n\t\tON `poi`.`parent` = `po`.`name`\n\t\tLEFT JOIN `tabPurchase Receipt Item` pri\n\t\tON `pri`.`purchase_order_item` = `poi`.`name`\n\t\t\tAND `pri`.`docstatus`=1\n\tWHERE\n\t\t`po`.`status` not in ('Stopped', 'Closed')\n\t\tAND `po`.`docstatus` = 1\n\t\tAND IFNULL(`poi`.`received_qty`, 0) < IFNULL(`poi`.`qty`, 0)\n\tGROUP BY `poi`.`name`\n\tORDER BY `po`.`transaction_date` ASC\n\t) poi_pri\n\tLEFT JOIN `tabPurchase Invoice Item` pii\n\tON `pii`.`po_detail` = `poi_pri`.`poi_name`\n\t\tAND `pii`.`docstatus`=1\nGROUP BY `poi_pri`.`poi_name`",
  "ref_doctype": "Purchase Order",
- "report_name": "Purchase Order Items To Be Received or Billed1",
+ "report_name": "Purchase Order Items To Be Received or Billed",
  "report_type": "Query Report",
  "roles": [
   {
diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py
index 68b8b50..a74253e 100644
--- a/erpnext/stock/report/stock_balance/stock_balance.py
+++ b/erpnext/stock/report/stock_balance/stock_balance.py
@@ -292,7 +292,7 @@
 	if not (filters.get("item_code") or filters.get("warehouse")):
 		sle_count = flt(frappe.db.sql("""select count(name) from `tabStock Ledger Entry`""")[0][0])
 		if sle_count > 500000:
-			frappe.throw(_("Please set filter based on Item or Warehouse"))
+			frappe.throw(_("Please set filter based on Item or Warehouse due to a large amount of entries."))
 
 def get_variants_attributes():
 	'''Return all item variant attributes.'''
diff --git a/erpnext/stock/report/stock_ledger/stock_ledger.py b/erpnext/stock/report/stock_ledger/stock_ledger.py
index db7f6ad..d757ecb 100644
--- a/erpnext/stock/report/stock_ledger/stock_ledger.py
+++ b/erpnext/stock/report/stock_ledger/stock_ledger.py
@@ -122,8 +122,8 @@
 	cf_field = cf_join = ""
 	if include_uom:
 		cf_field = ", ucd.conversion_factor"
-		cf_join = "left join `tabUOM Conversion Detail` ucd on ucd.parent=item.name and ucd.uom='%s'" \
-			% (include_uom)
+		cf_join = "left join `tabUOM Conversion Detail` ucd on ucd.parent=item.name and ucd.uom=%s" \
+			% frappe.db.escape(include_uom)
 
 	res = frappe.db.sql("""
 		select
diff --git a/erpnext/templates/emails/confirm_appointment.html b/erpnext/templates/emails/confirm_appointment.html
new file mode 100644
index 0000000..6c9b28b
--- /dev/null
+++ b/erpnext/templates/emails/confirm_appointment.html
@@ -0,0 +1,10 @@
+<p>{{_("Dear")}} {{ full_name }}{% if last_name %} {{ last_name}}{% endif %},</p>
+<p>{{_("A new appointment has been created for you with {0}").format(site_url)}}.</p>
+<p>{{_("Click on the link below to verify your email and confirm the appointment")}}.</p>
+
+<p style="margin: 30px 0px;">
+	<a href="{{ link }}" rel="nofollow" style="padding: 8px 20px; background-color: #7575ff; color: #fff; border-radius: 4px; text-decoration: none; line-height: 1; border-bottom: 3px solid rgba(0, 0, 0, 0.2); font-size: 14px; font-weight: 200;">{{ _("Verify Email") }}</a>
+</p>
+
+<br>
+<p style="font-size: 85%;">{{_("You can also copy-paste this link in your browser")}} <a href="{{ link }}">{{ link }}</a></p>
diff --git a/erpnext/translations/de.csv b/erpnext/translations/de.csv
index 2e25a12..cdff3ff 100644
--- a/erpnext/translations/de.csv
+++ b/erpnext/translations/de.csv
@@ -1329,7 +1329,7 @@
 apps/erpnext/erpnext/utilities/transaction_base.py,Invalid Posting Time,Ungültige Buchungszeit
 DocType: Salary Component,Condition and Formula,Zustand und Formel
 DocType: Lead,Campaign Name,Kampagnenname
-apps/erpnext/erpnext/setup/default_energy_point_rules.py,On Task Completion,Bei Abschluss der Aufgabe
+apps/erpnext/erpnext/setup/default_energy_point_rules.py,On Task Completion,Bei Abschluss des Vorgangs
 apps/erpnext/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py,There is no leave period in between {0} and {1},Es gibt keinen Urlaub zwischen {0} und {1}
 DocType: Fee Validity,Healthcare Practitioner,praktischer Arzt
 DocType: Hotel Room,Capacity,Kapazität
@@ -1353,7 +1353,7 @@
 apps/erpnext/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py,Payment Cancelled. Please check your GoCardless Account for more details,Zahlung abgebrochen. Bitte überprüfen Sie Ihr GoCardless Konto für weitere Details
 DocType: Work Order,Skip Material Transfer to WIP Warehouse,Überspringen Sie die Materialübertragung in das WIP-Lager
 DocType: Contract,N/A,nicht verfügbar
-DocType: Task Type,Task Type,Aufgabentyp
+DocType: Task Type,Task Type,Vorgangstyp
 DocType: Topic,Topic Content,Themeninhalt
 DocType: Delivery Settings,Send with Attachment,Senden mit Anhang
 DocType: Service Level,Priorities,Prioritäten
@@ -2449,7 +2449,7 @@
 DocType: Asset,Depreciation Schedules,Abschreibungen Termine
 apps/erpnext/erpnext/projects/doctype/timesheet/timesheet.js,Create Sales Invoice,Verkaufsrechnung erstellen
 apps/erpnext/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.html,Ineligible ITC,Nicht förderfähiges ITC
-DocType: Task,Dependent Tasks,Abhängige Aufgaben
+DocType: Task,Dependent Tasks,Abhängige Vorgänge
 apps/erpnext/erpnext/regional/report/gstr_1/gstr_1.py,Following accounts might be selected in GST Settings:,In den GST-Einstellungen können folgende Konten ausgewählt werden:
 apps/erpnext/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js,Quantity to Produce,Menge zu produzieren
 apps/erpnext/erpnext/hr/doctype/leave_application/leave_application.py,Application period cannot be outside leave allocation period,Beantragter Zeitraum kann nicht außerhalb der beantragten Urlaubszeit liegen
@@ -2846,7 +2846,7 @@
 DocType: Purchase Invoice,03-Deficiency in services,03-Mangel an Dienstleistungen
 DocType: Healthcare Settings,Default Medical Code Standard,Default Medical Code Standard
 DocType: Purchase Invoice Item,HSN/SAC,HSN / SAC
-DocType: Project Template Task,Project Template Task,Projektvorlagenaufgabe
+DocType: Project Template Task,Project Template Task,Projektvorgangsvorlage
 DocType: Accounts Settings,Over Billing Allowance (%),Mehr als Abrechnungsbetrag (%)
 apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py,Purchase Receipt {0} is not submitted,Kaufbeleg {0} wurde nicht übertragen
 DocType: Company,Default Payable Account,Standard-Verbindlichkeitenkonto
@@ -3323,7 +3323,7 @@
 ,Qty to Order,Zu bestellende Menge
 DocType: Period Closing Voucher,"The account head under Liability or Equity, in which Profit/Loss will be booked","Der Kontenkopf unter Eigen- oder Fremdkapital, in dem Gewinn / Verlust verbucht wird"
 apps/erpnext/erpnext/accounts/doctype/budget/budget.py,Another Budget record '{0}' already exists against {1} '{2}' and account '{3}' for fiscal year {4},Ein weiterer Budgeteintrag &#39;{0}&#39; existiert bereits für {1} &#39;{2}&#39; und für &#39;{3}&#39; für das Geschäftsjahr {4}
-apps/erpnext/erpnext/config/projects.py,Gantt chart of all tasks.,Gantt-Diagramm aller Aufgaben
+apps/erpnext/erpnext/config/projects.py,Gantt chart of all tasks.,Gantt-Diagramm aller Vorgänge
 DocType: Opportunity,Mins to First Response,Minuten zum First Response
 DocType: Pricing Rule,Margin Type,Margenart
 apps/erpnext/erpnext/projects/doctype/project/project_dashboard.html,{0} hours,{0} Stunden
@@ -3961,7 +3961,7 @@
 apps/erpnext/erpnext/education/doctype/student/student_dashboard.py,Student LMS Activity,Student LMS Aktivität
 DocType: POS Profile,Applicable for Users,Anwendbar für Benutzer
 DocType: Supplier Quotation,PUR-SQTN-.YYYY.-,PUR-SQTN-.JJJJ.-
-apps/erpnext/erpnext/projects/doctype/project/project.js,Set Project and all Tasks to status {0}?,Projekt und alle Aufgaben auf Status {0} setzen?
+apps/erpnext/erpnext/projects/doctype/project/project.js,Set Project and all Tasks to status {0}?,Projekt und alle Vorgänge auf Status {0} setzen?
 DocType: Purchase Invoice,Set Advances and Allocate (FIFO),Vorschüsse setzen und zuordnen (FIFO)
 apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.py,No Work Orders created,Keine Arbeitsaufträge erstellt
 apps/erpnext/erpnext/hr/doctype/salary_slip/salary_slip.py,Salary Slip of employee {0} already created for this period,Gehaltsabrechnung der Mitarbeiter {0} für diesen Zeitraum bereits erstellt
@@ -4418,7 +4418,7 @@
 DocType: Hotel Room,Hotels,Hotels
 apps/erpnext/erpnext/accounts/doctype/cost_center/cost_center_tree.js,New Cost Center Name,Neuer Kostenstellenname
 DocType: Leave Control Panel,Leave Control Panel,Urlaubsverwaltung
-DocType: Project,Task Completion,Aufgabenerledigung
+DocType: Project,Task Completion,Vorgangserfüllung
 apps/erpnext/erpnext/templates/generators/item/item_add_to_cart.html,Not in Stock,Nicht lagernd
 DocType: Volunteer,Volunteer Skills,Freiwillige Fähigkeiten
 DocType: Additional Salary,HR User,Nutzer Personalabteilung
@@ -5197,7 +5197,7 @@
 apps/erpnext/erpnext/accounts/report/general_ledger/general_ledger.py,Account {0} does not exists,Konto {0} existiert nicht
 apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.js,Select Loyalty Program,Wählen Sie Treueprogramm
 DocType: Project,Project Type,Projekttyp
-apps/erpnext/erpnext/projects/doctype/task/task.py,Child Task exists for this Task. You can not delete this Task.,Für diese Aufgabe existiert eine untergeordnete Aufgabe. Sie können diese Aufgabe daher nicht löschen.
+apps/erpnext/erpnext/projects/doctype/task/task.py,Child Task exists for this Task. You can not delete this Task.,Für diesen Vorgang existiert ein untergeordneter Vorgang. Sie können diese Aufgabe daher nicht löschen.
 apps/erpnext/erpnext/setup/doctype/sales_person/sales_person.py,Either target qty or target amount is mandatory.,Entweder Zielstückzahl oder Zielmenge ist zwingend erforderlich.
 apps/erpnext/erpnext/config/projects.py,Cost of various activities,Aufwendungen für verschiedene Tätigkeiten
 apps/erpnext/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py,"Setting Events to {0}, since the Employee attached to the below Sales Persons does not have a User ID{1}","Einstellen Events auf {0}, da die Mitarbeiter auf die beigefügten unter Verkaufs Personen keine Benutzer-ID {1}"
@@ -5597,7 +5597,7 @@
 apps/erpnext/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py,{0} is not a valid Batch Number for Item {1},{0} ist keine gültige Chargennummer für Artikel {1}
 apps/erpnext/erpnext/shopping_cart/cart.py,Please enter valid coupon code !!,Bitte geben Sie einen gültigen Gutscheincode ein !!
 apps/erpnext/erpnext/hr/doctype/leave_application/leave_application.py,Note: There is not enough leave balance for Leave Type {0},Hinweis: Es gibt nicht genügend Urlaubsguthaben für Abwesenheitstyp {0}
-DocType: Task,Task Description,Aufgabenbeschreibung
+DocType: Task,Task Description,Vorgangsbeschreibung
 DocType: Training Event,Seminar,Seminar
 DocType: Program Enrollment Fee,Program Enrollment Fee,Programm Einschreibegebühr
 DocType: Item,Supplier Items,Lieferantenartikel
@@ -5754,7 +5754,7 @@
 DocType: Lost Reason Detail,Lost Reason Detail,Verlorene Begründung Detail
 apps/erpnext/erpnext/hr/utils.py,Please set leave policy for employee {0} in Employee / Grade record,Legen Sie die Abwesenheitsrichtlinie für den Mitarbeiter {0} im Mitarbeiter- / Notensatz fest
 apps/erpnext/erpnext/public/js/controllers/transaction.js,Invalid Blanket Order for the selected Customer and Item,Ungültiger Blankoauftrag für den ausgewählten Kunden und Artikel
-apps/erpnext/erpnext/projects/doctype/task/task_tree.js,Add Multiple Tasks,Mehrere Aufgaben hinzufügen
+apps/erpnext/erpnext/projects/doctype/task/task_tree.js,Add Multiple Tasks,Mehrere Vorgänge hinzufügen
 DocType: Purchase Invoice,Items,Artikel
 apps/erpnext/erpnext/crm/doctype/contract/contract.py,End Date cannot be before Start Date.,Das Enddatum darf nicht vor dem Startdatum liegen.
 apps/erpnext/erpnext/education/doctype/course_enrollment/course_enrollment.py,Student is already enrolled.,Student ist bereits eingetragen sind.
diff --git a/erpnext/utilities/user_progress.py b/erpnext/utilities/user_progress.py
deleted file mode 100644
index 5cec3ca..0000000
--- a/erpnext/utilities/user_progress.py
+++ /dev/null
@@ -1,287 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe, erpnext
-from frappe import _
-from erpnext.setup.doctype.setup_progress.setup_progress import get_action_completed_state
-
-def get_slide_settings():
-	defaults = frappe.defaults.get_defaults()
-	domain = frappe.get_cached_value('Company',  erpnext.get_default_company(),  'domain')
-	company = defaults.get("company") or ''
-	currency = defaults.get("currency") or ''
-
-	doc = frappe.get_doc("Setup Progress")
-	item = [d for d in doc.get("actions") if d.action_name == "Set Sales Target"]
-
-	if len(item):
-		item = item[0]
-		if not item.action_document:
-			item.action_document = company
-			doc.save()
-
-	# Initial state of slides
-	return [
-		frappe._dict(
-			action_name='Add Company',
-			title=_("Setup Company") if domain != 'Education' else _("Setup Institution"),
-			help=_('Setup your ' + ('company' if domain != 'Education' else 'institution') + ' and brand.'),
-			# image_src="/assets/erpnext/images/illustrations/shop.jpg",
-			fields=[],
-			done_state_title=_("You added " +  company),
-			done_state_title_route=["Form", "Company", company],
-			help_links=[
-				{
-					"label": _("Chart of Accounts"),
-					"url": ["https://erpnext.com/docs/user/manual/en/accounts/chart-of-accounts"]
-				},
-				{
-					"label": _("Opening Balances"),
-					"video_id": "U5wPIvEn-0c"
-				}
-			]
-		),
-		frappe._dict(
-			action_name='Set Sales Target',
-			domains=('Manufacturing', 'Services', 'Retail', 'Distribution'),
-			title=_("Set a Target"),
-			help=_("Set a sales goal you'd like to achieve for your company."),
-			fields=[
-				{"fieldtype":"Currency", "fieldname":"monthly_sales_target",
-					"label":_("Monthly Sales Target (" + currency + ")"), "reqd":1},
-			],
-			submit_method="erpnext.utilities.user_progress_utils.set_sales_target",
-			done_state_title=_("Go to " + company),
-			done_state_title_route=["Form", "Company", company],
-			help_links=[
-				{
-					"label": _('Learn More'),
-					"url": ["https://erpnext.com/docs/user/manual/en/setting-up/setting-company-sales-goal"]
-				}
-			]
-		),
-		frappe._dict(
-			action_name='Add Customers',
-			domains=('Manufacturing', 'Services', 'Retail', 'Distribution'),
-			title=_("Add Customers"),
-			help=_("List a few of your customers. They could be organizations or individuals."),
-			fields=[
-				{"fieldtype":"Section Break"},
-				{"fieldtype":"Data", "fieldname":"customer", "label":_("Customer"),
-					"placeholder":_("Customer Name")},
-				{"fieldtype":"Column Break"},
-				{"fieldtype":"Data", "fieldname":"customer_contact",
-					"label":_("Contact Name"), "placeholder":_("Contact Name")}
-			],
-			add_more=1, max_count=3, mandatory_entry=1,
-			submit_method="erpnext.utilities.user_progress_utils.create_customers",
-			done_state_title=_("Go to Customers"),
-			done_state_title_route=["List", "Customer"],
-			help_links=[
-				{
-					"label": _('Learn More'),
-					"url": ["https://erpnext.com/docs/user/manual/en/CRM/customer.html"]
-				}
-			]
-		),
-
-		frappe._dict(
-			action_name='Add Letterhead',
-			domains=('Manufacturing', 'Services', 'Retail', 'Distribution', 'Education'),
-			title=_("Add Letterhead"),
-			help=_("Upload your letter head (Keep it web friendly as 900px by 100px)"),
-			fields=[
-				{"fieldtype":"Attach Image", "fieldname":"letterhead",
-					"is_private": 0,
-					"align": "center"
-				},
-			],
-			mandatory_entry=1,
-			submit_method="erpnext.utilities.user_progress_utils.create_letterhead",
-			done_state_title=_("Go to Letterheads"),
-			done_state_title_route=["List", "Letter Head"]
-		),
-
-		frappe._dict(
-			action_name='Add Suppliers',
-			domains=('Manufacturing', 'Services', 'Retail', 'Distribution'),
-			icon="fa fa-group",
-			title=_("Your Suppliers"),
-			help=_("List a few of your suppliers. They could be organizations or individuals."),
-			fields=[
-				{"fieldtype":"Section Break"},
-				{"fieldtype":"Data", "fieldname":"supplier", "label":_("Supplier"),
-					"placeholder":_("Supplier Name")},
-				{"fieldtype":"Column Break"},
-				{"fieldtype":"Data", "fieldname":"supplier_contact",
-					"label":_("Contact Name"), "placeholder":_("Contact Name")},
-			],
-			add_more=1, max_count=3, mandatory_entry=1,
-			submit_method="erpnext.utilities.user_progress_utils.create_suppliers",
-			done_state_title=_("Go to Suppliers"),
-			done_state_title_route=["List", "Supplier"],
-			help_links=[
-				{
-					"label": _('Learn More'),
-					"url": ["https://erpnext.com/docs/user/manual/en/buying/supplier"]
-				},
-				{
-					"label": _('Customers and Suppliers'),
-					"video_id": "zsrrVDk6VBs"
-				},
-			]
-		),
-		frappe._dict(
-			action_name='Add Products',
-			domains=['Manufacturing', 'Services', 'Retail', 'Distribution'],
-			icon="fa fa-barcode",
-			title=_("Your Products or Services"),
-			help=_("List your products or services that you buy or sell."),
-			fields=[
-				{"fieldtype":"Section Break", "show_section_border": 1},
-				{"fieldtype":"Data", "fieldname":"item", "label":_("Item"),
-					"placeholder":_("A Product")},
-				{"fieldtype":"Column Break"},
-				{"fieldtype":"Select", "fieldname":"item_uom", "label":_("UOM"),
-					"options":[_("Unit"), _("Nos"), _("Box"), _("Pair"), _("Kg"), _("Set"),
-						_("Hour"), _("Minute"), _("Litre"), _("Meter"), _("Gram")],
-					"default": _("Unit"), "static": 1},
-				{"fieldtype":"Column Break"},
-				{"fieldtype":"Currency", "fieldname":"item_price", "label":_("Rate"), "static": 1}
-			],
-			add_more=1, max_count=3, mandatory_entry=1,
-			submit_method="erpnext.utilities.user_progress_utils.create_items",
-			done_state_title=_("Go to Items"),
-			done_state_title_route=["List", "Item"],
-			help_links=[
-				{
-					"label": _("Explore Sales Cycle"),
-					"video_id": "1eP90MWoDQM"
-				},
-			]
-		),
-
-		# Education slides begin
-		frappe._dict(
-			action_name='Add Programs',
-			domains=("Education"),
-			title=_("Program"),
-			help=_("Example: Masters in Computer Science"),
-			fields=[
-				{"fieldtype":"Section Break", "show_section_border": 1},
-				{"fieldtype":"Data", "fieldname":"program", "label":_("Program"), "placeholder": _("Program Name")},
-			],
-			add_more=1, max_count=3, mandatory_entry=1,
-			submit_method="erpnext.utilities.user_progress_utils.create_program",
-			done_state_title=_("Go to Programs"),
-			done_state_title_route=["List", "Program"],
-			help_links=[
-				{
-					"label": _("Student Application"),
-					"video_id": "l8PUACusN3E"
-				},
-			]
-
-		),
-		frappe._dict(
-			action_name='Add Courses',
-			domains=["Education"],
-			title=_("Course"),
-			help=_("Example: Basic Mathematics"),
-			fields=[
-				{"fieldtype":"Section Break", "show_section_border": 1},
-				{"fieldtype":"Data", "fieldname":"course", "label":_("Course"),  "placeholder": _("Course Name")},
-			],
-			add_more=1, max_count=3, mandatory_entry=1,
-			submit_method="erpnext.utilities.user_progress_utils.create_course",
-			done_state_title=_("Go to Courses"),
-			done_state_title_route=["List", "Course"],
-			help_links=[
-				{
-					"label": _('Add Students'),
-					"route": ["List", "Student"]
-				}
-			]
-		),
-		frappe._dict(
-			action_name='Add Instructors',
-			domains=["Education"],
-			title=_("Instructor"),
-			help=_("People who teach at your organisation"),
-			fields=[
-				{"fieldtype":"Section Break", "show_section_border": 1},
-				{"fieldtype":"Data", "fieldname":"instructor", "label":_("Instructor"),  "placeholder": _("Instructor Name")},
-			],
-			add_more=1, max_count=3, mandatory_entry=1,
-			submit_method="erpnext.utilities.user_progress_utils.create_instructor",
-			done_state_title=_("Go to Instructors"),
-			done_state_title_route=["List", "Instructor"],
-			help_links=[
-				{
-					"label": _('Student Batches'),
-					"route": ["List", "Student Batch"]
-				}
-			]
-		),
-		frappe._dict(
-			action_name='Add Rooms',
-			domains=["Education"],
-			title=_("Room"),
-			help=_("Classrooms/ Laboratories etc where lectures can be scheduled."),
-			fields=[
-				{"fieldtype":"Section Break", "show_section_border": 1},
-				{"fieldtype":"Data", "fieldname":"room", "label":_("Room")},
-				{"fieldtype":"Column Break"},
-				{"fieldtype":"Int", "fieldname":"room_capacity", "label":_("Room Capacity"), "static": 1},
-			],
-			add_more=1, max_count=3, mandatory_entry=1,
-			submit_method="erpnext.utilities.user_progress_utils.create_room",
-			done_state_title=_("Go to Rooms"),
-			done_state_title_route=["List", "Room"],
-			help_links=[]
-		),
-		# Education slides end
-
-		frappe._dict(
-			action_name='Add Users',
-			title=_("Add Users"),
-			help=_("Add users to your organization, other than yourself."),
-			fields=[
-				{"fieldtype":"Section Break"},
-				{"fieldtype":"Data", "fieldname":"user_email", "label":_("Email ID"),
-					"placeholder":_("user@example.com"), "options": "Email", "static": 1},
-				{"fieldtype":"Column Break"},
-				{"fieldtype":"Data", "fieldname":"user_fullname",
-					"label":_("Full Name"), "static": 1},
-			],
-			add_more=1, max_count=3, mandatory_entry=1,
-			submit_method="erpnext.utilities.user_progress_utils.create_users",
-			done_state_title=_("Go to Users"),
-			done_state_title_route=["List", "User"],
-			help_links=[
-				{
-					"label": _('Learn More'),
-					"url": ["https://erpnext.com/docs/user/manual/en/setting-up/users-and-permissions"]
-				},
-				{
-					"label": _('Users and Permissions'),
-					"video_id": "8Slw1hsTmUI"
-				},
-			]
-		)
-	]
-
-def get_user_progress_slides():
-	slides = []
-	slide_settings = get_slide_settings()
-
-	domains = frappe.get_active_domains()
-	for s in slide_settings:
-		if not s.domains or any(d in domains for d in s.domains):
-			s.mark_as_done_method = "erpnext.setup.doctype.setup_progress.setup_progress.set_action_completed_state"
-			s.done = get_action_completed_state(s.action_name) or 0
-			slides.append(s)
-
-	return slides
-
diff --git a/erpnext/utilities/user_progress_utils.py b/erpnext/utilities/user_progress_utils.py
deleted file mode 100644
index b7c24a7..0000000
--- a/erpnext/utilities/user_progress_utils.py
+++ /dev/null
@@ -1,240 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe, erpnext
-
-import json
-from frappe import _
-from frappe.utils import flt
-from erpnext.setup.doctype.setup_progress.setup_progress import update_domain_actions, get_domain_actions_state
-
-@frappe.whitelist()
-def set_sales_target(args_data):
-	args = json.loads(args_data)
-	defaults = frappe.defaults.get_defaults()
-	frappe.db.set_value("Company", defaults.get("company"), "monthly_sales_target", args.get('monthly_sales_target'))
-
-@frappe.whitelist()
-def create_customers(args_data):
-	args = json.loads(args_data)
-	defaults = frappe.defaults.get_defaults()
-	for i in range(1,4):
-		customer = args.get("customer_" + str(i))
-		if customer:
-			try:
-				doc = frappe.get_doc({
-					"doctype":"Customer",
-					"customer_name": customer,
-					"customer_type": "Company",
-					"customer_group": _("Commercial"),
-					"territory": defaults.get("country"),
-					"company": defaults.get("company")
-				}).insert()
-
-				if args.get("customer_contact_" + str(i)):
-					create_contact(args.get("customer_contact_" + str(i)),
-						"Customer", doc.name)
-			except frappe.NameError:
-				pass
-
-@frappe.whitelist()
-def create_letterhead(args_data):
-	args = json.loads(args_data)
-	letterhead = args.get("letterhead")
-	if letterhead:
-		try:
-			frappe.get_doc({
-					"doctype":"Letter Head",
-					"content":"""<div><img src="{0}" style='max-width: 100%%;'><br></div>""".format(letterhead.encode('utf-8')),
-					"letter_head_name": _("Standard"),
-					"is_default": 1
-			}).insert()
-		except frappe.NameError:
-			pass
-
-@frappe.whitelist()
-def create_suppliers(args_data):
-	args = json.loads(args_data)
-	defaults = frappe.defaults.get_defaults()
-	for i in range(1,4):
-		supplier = args.get("supplier_" + str(i))
-		if supplier:
-			try:
-				doc = frappe.get_doc({
-					"doctype":"Supplier",
-					"supplier_name": supplier,
-					"supplier_group": _("Local"),
-					"company": defaults.get("company")
-				}).insert()
-
-				if args.get("supplier_contact_" + str(i)):
-					create_contact(args.get("supplier_contact_" + str(i)),
-						"Supplier", doc.name)
-			except frappe.NameError:
-				pass
-
-def create_contact(contact, party_type, party):
-	"""Create contact based on given contact name"""
-	contact = contact	.split(" ")
-
-	contact = frappe.get_doc({
-		"doctype":"Contact",
-		"first_name":contact[0],
-		"last_name": len(contact) > 1 and contact[1] or ""
-	})
-	contact.append('links', dict(link_doctype=party_type, link_name=party))
-	contact.insert()
-
-@frappe.whitelist()
-def create_items(args_data):
-	args = json.loads(args_data)
-	defaults = frappe.defaults.get_defaults()
-	for i in range(1,4):
-		item = args.get("item_" + str(i))
-		if item:
-			default_warehouse = ""
-			default_warehouse = frappe.db.get_value("Warehouse", filters={
-				"warehouse_name": _("Finished Goods"),
-				"company": defaults.get("company_name")
-			})
-
-			try:
-				frappe.get_doc({
-					"doctype":"Item",
-					"item_code": item,
-					"item_name": item,
-					"description": item,
-					"show_in_website": 1,
-					"is_sales_item": 1,
-					"is_purchase_item": 1,
-					"is_stock_item": 1,
-					"item_group": _("Products"),
-					"stock_uom": _(args.get("item_uom_" + str(i))),
-					"item_defaults": [{
-						"default_warehouse": default_warehouse,
-						"company": defaults.get("company_name")
-					}]
-				}).insert()
-
-			except frappe.NameError:
-				pass
-			else:
-				if args.get("item_price_" + str(i)):
-					item_price = flt(args.get("item_price_" + str(i)))
-
-					price_list_name = frappe.db.get_value("Price List", {"selling": 1})
-					make_item_price(item, price_list_name, item_price)
-					price_list_name = frappe.db.get_value("Price List", {"buying": 1})
-					make_item_price(item, price_list_name, item_price)
-
-
-def make_item_price(item, price_list_name, item_price):
-	frappe.get_doc({
-		"doctype": "Item Price",
-		"price_list": price_list_name,
-		"item_code": item,
-		"price_list_rate": item_price
-	}).insert()
-
-# Education
-@frappe.whitelist()
-def create_program(args_data):
-	args = json.loads(args_data)
-	for i in range(1,4):
-		if args.get("program_" + str(i)):
-			program = frappe.new_doc("Program")
-			program.program_code = args.get("program_" + str(i))
-			program.program_name = args.get("program_" + str(i))
-			try:
-				program.save()
-			except frappe.DuplicateEntryError:
-				pass
-
-@frappe.whitelist()
-def create_course(args_data):
-	args = json.loads(args_data)
-	for i in range(1,4):
-		if args.get("course_" + str(i)):
-			course = frappe.new_doc("Course")
-			course.course_code = args.get("course_" + str(i))
-			course.course_name = args.get("course_" + str(i))
-			try:
-				course.save()
-			except frappe.DuplicateEntryError:
-				pass
-
-@frappe.whitelist()
-def create_instructor(args_data):
-	args = json.loads(args_data)
-	for i in range(1,4):
-		if args.get("instructor_" + str(i)):
-			instructor = frappe.new_doc("Instructor")
-			instructor.instructor_name = args.get("instructor_" + str(i))
-			try:
-				instructor.save()
-			except frappe.DuplicateEntryError:
-				pass
-
-@frappe.whitelist()
-def create_room(args_data):
-	args = json.loads(args_data)
-	for i in range(1,4):
-		if args.get("room_" + str(i)):
-			room = frappe.new_doc("Room")
-			room.room_name = args.get("room_" + str(i))
-			room.seating_capacity = args.get("room_capacity_" + str(i))
-			try:
-				room.save()
-			except frappe.DuplicateEntryError:
-				pass
-
-@frappe.whitelist()
-def create_users(args_data):
-	if frappe.session.user == 'Administrator':
-		return
-	args = json.loads(args_data)
-	defaults = frappe.defaults.get_defaults()
-	for i in range(1,4):
-		email = args.get("user_email_" + str(i))
-		fullname = args.get("user_fullname_" + str(i))
-		if email:
-			if not fullname:
-				fullname = email.split("@")[0]
-
-			parts = fullname.split(" ", 1)
-
-			user = frappe.get_doc({
-				"doctype": "User",
-				"email": email,
-				"first_name": parts[0],
-				"last_name": parts[1] if len(parts) > 1 else "",
-				"enabled": 1,
-				"user_type": "System User"
-			})
-
-			# default roles
-			user.append_roles("Projects User", "Stock User", "Support Team")
-			user.flags.delay_emails = True
-
-			if not frappe.db.get_value("User", email):
-				user.insert(ignore_permissions=True)
-
-				# create employee
-				emp = frappe.get_doc({
-					"doctype": "Employee",
-					"employee_name": fullname,
-					"user_id": email,
-					"status": "Active",
-					"company": defaults.get("company")
-				})
-				emp.flags.ignore_mandatory = True
-				emp.insert(ignore_permissions = True)
-
-# Ennumerate the setup hooks you're going to need, apart from the slides
-
-@frappe.whitelist()
-def update_default_domain_actions_and_get_state():
-	domain = frappe.get_cached_value('Company',  erpnext.get_default_company(),  'domain')
-	update_domain_actions(domain)
-	return get_domain_actions_state(domain)
diff --git a/erpnext/www/book-appointment/index.css b/erpnext/www/book-appointment/index.css
new file mode 100644
index 0000000..6c49fde
--- /dev/null
+++ b/erpnext/www/book-appointment/index.css
@@ -0,0 +1,53 @@
+.time-slot {
+    margin-bottom: 2em;
+    margin-left: 0.5em;
+    margin-right: 0.5em;
+    border-radius: 0.4em;
+    cursor: pointer;
+    border: 0.5px solid #cccccc;
+    min-height: 75px;
+    padding: 0.5em 1em;
+}
+
+@media (max-width: 768px) {
+    #submit-button-area {
+        display: grid;
+        grid-template-areas: 
+        "submit"
+        "back";
+    }
+}
+#customer-form{
+    border-color: black;
+}
+#customer-form ::placeholder{
+    color: #ddd;
+}
+#timeslot-container{
+	display: flex;
+    flex-wrap: wrap;
+    justify-content: center;
+}
+
+.time-slot:hover {
+    background: #ddd;
+}
+
+.time-slot.unavailable {
+    background: #CBD5E0;
+    cursor: not-allowed;
+    color: #718096
+}
+
+.time-slot.unavailable .text-muted {
+    color: #718096
+}
+
+.time-slot.selected {
+    color: white;
+    background: #5e64ff;
+}
+
+.time-slot.selected .text-muted {
+    color: #EDF2F7 !important;
+}
diff --git a/erpnext/www/book-appointment/index.html b/erpnext/www/book-appointment/index.html
new file mode 100644
index 0000000..96774d5
--- /dev/null
+++ b/erpnext/www/book-appointment/index.html
@@ -0,0 +1,66 @@
+{% extends "templates/web.html" %}
+
+{% block title %}{{ _("Book Appointment") }}{% endblock %}
+
+{% block script %}
+<script src="assets/js/moment-bundle.min.js"></script>
+<script src="book-appointment/index.js"></script>
+{% endblock %}
+
+{% block page_content %}
+<div class="container">
+    <!-- title: Book an appointment -->
+    <div id="select-date-time">
+        <div class="text-center mt-5">
+            <h3>Book an appointment</h3>
+            <p class="lead text-muted" id="lead-text">Select the date and your timezone</p>
+        </div>
+        <div class="row justify-content-center mt-3">
+            <div class="col-md-6 align-self-center ">
+                <div class="row">
+                    <input type="date" oninput="on_date_or_timezone_select()" name="appointment-date"
+                        id="appointment-date" class="form-control mt-3 col-md m-3">
+                    <select name="appointment-timezone" oninput="on_date_or_timezone_select()" id="appointment-timezone"
+                        class="form-control m-3 col-md">
+                    </select>
+                </div>
+            </div>
+        </div>
+        <div class="mt-3" id="timeslot-container">
+
+        </div>
+        <div class="row justify-content-center mt-3">
+            <div class="col-md-4 mb-3">
+                <button class="btn btn-primary form-control" id="next-button">Next</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!--Enter Details-->
+<div id="enter-details" class="mb-5">
+    <div class="text-center mt-5">
+        <h3>Add details</h3>
+        <p class="lead text-muted">Selected date is <span class="date-span"></span> at <span class="time-span">
+            </span></p>
+    </div>
+    <div class="row justify-content-center mt-3">
+        <div class="col-md-4 align-items-center">
+            <form id="customer-form" action='#'>
+            <input class="form-control mt-3" type="text" name="customer_name" id="customer_name" placeholder="Your Name (required)" required>
+            <input class="form-control mt-3" type="tel" name="customer_number" id="customer_number" placeholder="+910000000000">
+            <input class="form-control mt-3" type="text" name="customer_skype" id="customer_skype" placeholder="Skype">
+            <input class="form-control mt-3"type="email" name="customer_email" id="customer_email" placeholder="Email Address (required)" required>
+
+            <textarea class="form-control mt-3" name="customer_notes" id="customer_notes" cols="30" rows="10"
+                placeholder="Notes"></textarea>
+            </form>
+            <div class="row mt-3 " id="submit-button-area">
+                <div class="col-md mt-3" style="grid-area: back;"><button class="btn btn-dark form-control" onclick="initialise_select_date()">Go back</button></div>
+                <div class="col-md mt-3" style="grid-area: submit;"><button class="btn btn-primary form-control " onclick="submit()" id="submit-button">Submit</button></div>
+            </div>
+        </div>
+    </div>
+</div>
+</div>
+
+{% endblock %}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/index.js b/erpnext/www/book-appointment/index.js
new file mode 100644
index 0000000..13c87dd
--- /dev/null
+++ b/erpnext/www/book-appointment/index.js
@@ -0,0 +1,236 @@
+frappe.ready(async () => {
+    initialise_select_date();
+})
+
+window.holiday_list = [];
+
+async function initialise_select_date() {
+    navigate_to_page(1);
+    await get_global_variables();
+    setup_date_picker();
+    setup_timezone_selector();
+    hide_next_button();
+}
+
+async function get_global_variables() {
+    // Using await through this file instead of then.
+    window.appointment_settings = (await frappe.call({
+        method: 'erpnext.www.book-appointment.index.get_appointment_settings'
+    })).message;
+    window.timezones = (await frappe.call({
+        method:'erpnext.www.book-appointment.index.get_timezones'
+    })).message;
+    window.holiday_list = window.appointment_settings.holiday_list;
+}
+
+function setup_timezone_selector() {
+    /**
+     * window.timezones is a dictionary with the following structure
+     * { IANA name: Pretty name}
+     * For example : { Asia/Kolkata : "India Time - Asia/Kolkata"}
+     */
+    let timezones_element = document.getElementById('appointment-timezone');
+    let offset = new Date().getTimezoneOffset();
+    Object.keys(window.timezones).forEach((timezone) => {
+        let opt = document.createElement('option');
+        opt.value = timezone;
+        if (timezone == moment.tz.guess()) {
+            opt.selected = true;
+        }
+        opt.innerHTML = window.timezones[timezone]
+        timezones_element.appendChild(opt)
+    });
+}
+
+function setup_date_picker() {
+    let date_picker = document.getElementById('appointment-date');
+    let today = new Date();
+    date_picker.min = today.toISOString().substr(0, 10);
+    today.setDate(today.getDate() + window.appointment_settings.advance_booking_days);
+    date_picker.max = today.toISOString().substr(0, 10);
+}
+
+function hide_next_button() {
+    let next_button = document.getElementById('next-button');
+    next_button.disabled = true;
+    next_button.onclick = () => frappe.msgprint("Please select a date and time");
+}
+
+function show_next_button() {
+    let next_button = document.getElementById('next-button');
+    next_button.disabled = false;
+    next_button.onclick = setup_details_page;
+}
+
+function on_date_or_timezone_select() {
+    let date_picker = document.getElementById('appointment-date');
+    let timezone = document.getElementById('appointment-timezone');
+    if (date_picker.value === '') {
+        clear_time_slots();
+        hide_next_button();
+        frappe.throw('Please select a date');
+    }
+    window.selected_date = date_picker.value;
+    window.selected_timezone = timezone.value;
+    update_time_slots(date_picker.value, timezone.value);
+    let lead_text = document.getElementById('lead-text');
+    lead_text.innerHTML = "Select Time"
+}
+
+async function get_time_slots(date, timezone) {
+    let slots = (await frappe.call({
+        method: 'erpnext.www.book-appointment.index.get_appointment_slots',
+        args: {
+            date: date,
+            timezone: timezone
+        }
+    })).message;
+    return slots;
+}
+
+async function update_time_slots(selected_date, selected_timezone) {
+    let timeslot_container = document.getElementById('timeslot-container');
+    window.slots = await get_time_slots(selected_date, selected_timezone);
+    clear_time_slots();
+    if (window.slots.length <= 0) {
+        let message_div = document.createElement('p');
+        message_div.innerHTML = "There are no slots available on this date";
+        timeslot_container.appendChild(message_div);
+        return
+    }
+    window.slots.forEach((slot, index) => {
+        // Get and append timeslot div
+        let timeslot_div = get_timeslot_div_layout(slot)
+        timeslot_container.appendChild(timeslot_div);
+    });
+    set_default_timeslot();
+}
+
+function get_timeslot_div_layout(timeslot) {
+    let start_time = new Date(timeslot.time)
+    let timeslot_div = document.createElement('div');
+    timeslot_div.classList.add('time-slot');
+    if (!timeslot.availability) {
+        timeslot_div.classList.add('unavailable')
+    }
+    timeslot_div.innerHTML = get_slot_layout(start_time);
+    timeslot_div.id = timeslot.time.substr(11, 20);
+    timeslot_div.addEventListener('click', select_time);
+    return timeslot_div
+}
+
+function clear_time_slots() {
+    // Clear any existing divs in timeslot container
+    let timeslot_container = document.getElementById('timeslot-container');
+    while (timeslot_container.firstChild) {
+        timeslot_container.removeChild(timeslot_container.firstChild);
+    }
+}
+
+function get_slot_layout(time) {
+    let timezone = document.getElementById("appointment-timezone").value;
+    time = new Date(time);
+    let start_time_string = moment(time).tz(timezone).format("LT");
+    let end_time = moment(time).tz(timezone).add(window.appointment_settings.appointment_duration, 'minutes');
+    let end_time_string = end_time.format("LT");
+    return `<span style="font-size: 1.2em;">${start_time_string}</span><br><span class="text-muted small">to ${end_time_string}</span>`;
+}
+
+function select_time() {
+    if (this.classList.contains('unavailable')) {
+        return;
+    }
+    let selected_element = document.getElementsByClassName('selected');
+    if (!(selected_element.length > 0)) {
+        this.classList.add('selected');
+        show_next_button();
+        return;
+    }
+    selected_element = selected_element[0]
+    window.selected_time = this.id;
+    selected_element.classList.remove('selected');
+    this.classList.add('selected');
+    show_next_button();
+}
+
+function set_default_timeslot() {
+    let timeslots = document.getElementsByClassName('time-slot')
+    // Can't use a forEach here since, we need to break the loop after a timeslot is selected
+    for (let i = 0; i < timeslots.length; i++) {
+        const timeslot = timeslots[i];
+        if (!timeslot.classList.contains('unavailable')) {
+            timeslot.classList.add('selected');
+            break;
+        }
+    }
+}
+
+function navigate_to_page(page_number) {
+    let page1 = document.getElementById('select-date-time');
+    let page2 = document.getElementById('enter-details');
+    switch (page_number) {
+        case 1:
+            page1.style.display = 'block';
+            page2.style.display = 'none';
+            break;
+        case 2:
+            page1.style.display = 'none';
+            page2.style.display = 'block';
+            break;
+        default:
+            break;
+    }
+}
+
+function setup_details_page() {
+    navigate_to_page(2)
+    let date_container = document.getElementsByClassName('date-span')[0];
+    let time_container = document.getElementsByClassName('time-span')[0];
+    date_container.innerHTML = moment(window.selected_date).format("MMM Do YYYY");
+    time_container.innerHTML = moment(window.selected_time, "HH:mm:ss").format("LT");
+}
+
+async function submit() {
+    let button = document.getElementById('submit-button');
+    button.disabled = true;
+    let form = document.querySelector('#customer-form');
+    if (!form.checkValidity()) {
+        form.reportValidity();
+        button.disabled = false;
+        return;
+    }
+    let contact = get_form_data();
+    let appointment =  frappe.call({
+        method: 'erpnext.www.book-appointment.index.create_appointment',
+        args: {
+            'date': window.selected_date,
+            'time': window.selected_time,
+            'contact': contact,
+            'tz':window.selected_timezone
+        },
+        callback: (response)=>{
+            if (response.message.status == "Unverified") {
+                frappe.show_alert("Please check your email to confirm the appointment")
+            } else {
+                frappe.show_alert("Appointment Created Successfully");
+            }
+            setTimeout(()=>{
+                let redirect_url = "/";
+                if (window.appointment_settings.success_redirect_url){
+                    redirect_url += window.appointment_settings.success_redirect_url;
+                }
+                window.location.href = redirect_url;},5000)
+        },
+        error: (err)=>{
+            frappe.show_alert("Something went wrong please try again");
+            button.disabled = false;
+        }
+    });
+}
+
+function get_form_data() {
+    contact = {};
+    let inputs = ['name', 'skype', 'number', 'notes', 'email'];
+    inputs.forEach((id) => contact[id] = document.getElementById(`customer_${id}`).value)
+    return contact
+}
diff --git a/erpnext/www/book-appointment/index.py b/erpnext/www/book-appointment/index.py
new file mode 100644
index 0000000..5b60dd5
--- /dev/null
+++ b/erpnext/www/book-appointment/index.py
@@ -0,0 +1,159 @@
+import frappe
+import datetime
+import json
+import pytz
+
+
+WEEKDAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
+
+no_cache = 1
+
+
+def get_context(context):
+	is_enabled = frappe.db.get_single_value('Appointment Booking Settings', 'enable_scheduling')
+	if is_enabled:
+		return context
+	else:
+		frappe.local.flags.redirect_location = '/404'
+		raise frappe.Redirect
+
+@frappe.whitelist(allow_guest=True)
+def get_appointment_settings():
+	settings = frappe.get_doc('Appointment Booking Settings')
+	settings.holiday_list = frappe.get_doc('Holiday List', settings.holiday_list)
+	return settings
+
+@frappe.whitelist(allow_guest=True)
+def get_timezones():
+	from babel.dates import get_timezone, get_timezone_name, Locale
+	from frappe.utils.momentjs import get_all_timezones
+
+	translated_dict = {}
+	locale = Locale.parse(frappe.local.lang, sep="-")
+
+	for tz in get_all_timezones():
+		timezone_name = get_timezone_name(get_timezone(tz), locale=locale, width='short')
+		if timezone_name:
+			translated_dict[tz] = timezone_name + ' - ' + tz
+
+	return translated_dict
+
+@frappe.whitelist(allow_guest=True)
+def get_appointment_slots(date, timezone):
+	# Convert query to local timezones
+	format_string = '%Y-%m-%d %H:%M:%S'
+	query_start_time = datetime.datetime.strptime(date + ' 00:00:00', format_string)
+	query_end_time = datetime.datetime.strptime(date + ' 23:59:59', format_string)
+	query_start_time = convert_to_system_timezone(timezone, query_start_time)
+	query_end_time = convert_to_system_timezone(timezone, query_end_time)
+	now = convert_to_guest_timezone(timezone, datetime.datetime.now())
+
+	# Database queries
+	settings = frappe.get_doc('Appointment Booking Settings')
+	holiday_list = frappe.get_doc('Holiday List', settings.holiday_list)
+	timeslots = get_available_slots_between(query_start_time, query_end_time, settings)
+
+	# Filter and convert timeslots
+	converted_timeslots = []
+	for timeslot in timeslots:
+		converted_timeslot = convert_to_guest_timezone(timezone, timeslot)
+		# Check if holiday
+		if _is_holiday(converted_timeslot.date(), holiday_list):
+			converted_timeslots.append(dict(time=converted_timeslot, availability=False))
+			continue
+		# Check availability
+		if check_availabilty(timeslot, settings) and converted_timeslot >= now:
+			converted_timeslots.append(dict(time=converted_timeslot, availability=True))
+		else:
+			converted_timeslots.append(dict(time=converted_timeslot, availability=False))
+	date_required = datetime.datetime.strptime(date + ' 00:00:00', format_string).date()
+	converted_timeslots = filter_timeslots(date_required, converted_timeslots)
+	return converted_timeslots
+
+def get_available_slots_between(query_start_time, query_end_time, settings):
+	records = _get_records(query_start_time, query_end_time, settings)
+	timeslots = []
+	appointment_duration = datetime.timedelta(
+		minutes=settings.appointment_duration)
+	for record in records:
+		if record.day_of_week == WEEKDAYS[query_start_time.weekday()]:
+			current_time = _deltatime_to_datetime(query_start_time, record.from_time)
+			end_time = _deltatime_to_datetime(query_start_time, record.to_time)
+		else:
+			current_time = _deltatime_to_datetime(query_end_time, record.from_time)
+			end_time = _deltatime_to_datetime(query_end_time, record.to_time)
+		while current_time + appointment_duration <= end_time:
+			timeslots.append(current_time)
+			current_time += appointment_duration
+	return timeslots
+
+
+@frappe.whitelist(allow_guest=True)
+def create_appointment(date, time, tz, contact):
+	format_string = '%Y-%m-%d %H:%M:%S%z'
+	scheduled_time = datetime.datetime.strptime(date + " " + time, format_string)
+	# Strip tzinfo from datetime objects since it's handled by the doctype
+	scheduled_time = scheduled_time.replace(tzinfo = None)
+	scheduled_time = convert_to_system_timezone(tz, scheduled_time)
+	scheduled_time = scheduled_time.replace(tzinfo = None)
+	# Create a appointment document from form
+	appointment = frappe.new_doc('Appointment')
+	appointment.scheduled_time = scheduled_time
+	contact = json.loads(contact)
+	appointment.customer_name = contact.get('name', None)
+	appointment.customer_phone_number = contact.get('number', None)
+	appointment.customer_skype = contact.get('skype', None)
+	appointment.customer_details = contact.get('notes', None)
+	appointment.customer_email = contact.get('email', None)
+	appointment.status = 'Open'
+	appointment.insert()
+	return appointment
+
+# Helper Functions
+def filter_timeslots(date, timeslots):
+	filtered_timeslots = []
+	for timeslot in timeslots:
+		if(timeslot['time'].date() == date):
+			filtered_timeslots.append(timeslot)
+	return filtered_timeslots
+
+def convert_to_guest_timezone(guest_tz, datetimeobject):
+	guest_tz = pytz.timezone(guest_tz)
+	local_timezone = pytz.timezone(frappe.utils.get_time_zone())
+	datetimeobject = local_timezone.localize(datetimeobject)
+	datetimeobject = datetimeobject.astimezone(guest_tz)
+	return datetimeobject
+
+def convert_to_system_timezone(guest_tz,datetimeobject):
+	guest_tz = pytz.timezone(guest_tz)
+	datetimeobject = guest_tz.localize(datetimeobject)
+	system_tz = pytz.timezone(frappe.utils.get_time_zone())
+	datetimeobject = datetimeobject.astimezone(system_tz)
+	return datetimeobject
+
+def check_availabilty(timeslot, settings):
+	return frappe.db.count('Appointment', {'scheduled_time': timeslot}) < settings.number_of_agents
+
+def _is_holiday(date, holiday_list):
+	for holiday in holiday_list.holidays:
+		if holiday.holiday_date == date:
+			return True
+	return False
+
+
+def _get_records(start_time, end_time, settings):
+	records = []
+	for record in settings.availability_of_slots:
+		if record.day_of_week == WEEKDAYS[start_time.weekday()] or record.day_of_week == WEEKDAYS[end_time.weekday()]:
+			records.append(record)
+	return records
+
+
+def _deltatime_to_datetime(date, deltatime):
+	time = (datetime.datetime.min + deltatime).time()
+	return datetime.datetime.combine(date.date(), time)
+
+
+def _datetime_to_deltatime(date_time):
+	midnight = datetime.datetime.combine(date_time.date(), datetime.time.min)
+	return (date_time-midnight)
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/verify/index.html b/erpnext/www/book-appointment/verify/index.html
new file mode 100644
index 0000000..ebb65b1
--- /dev/null
+++ b/erpnext/www/book-appointment/verify/index.html
@@ -0,0 +1,18 @@
+{% extends "templates/web.html" %}
+
+{% block title %}
+{{ _("Verify Email") }}
+{% endblock%}
+    
+{% block page_content %}
+
+    {% if success==True %}
+        <div class="alert alert-success">
+            Your email has been verified and your appointment has been scheduled
+        </div>
+    {% else %}
+        <div class="alert alert-danger">
+            Verification failed please check the link
+        </div>
+    {% endif %}
+{% endblock%}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/verify/index.py b/erpnext/www/book-appointment/verify/index.py
new file mode 100644
index 0000000..d4478ae
--- /dev/null
+++ b/erpnext/www/book-appointment/verify/index.py
@@ -0,0 +1,20 @@
+import frappe
+
+from frappe.utils.verified_command import verify_request
+@frappe.whitelist(allow_guest=True)
+def get_context(context):
+	if not verify_request():
+		context.success = False
+		return context
+
+	email = frappe.form_dict['email']
+	appointment_name = frappe.form_dict['appointment']
+
+	if email and appointment_name:
+		appointment = frappe.get_doc('Appointment',appointment_name)
+		appointment.set_verified(email)
+		context.success = True
+		return context
+	else:
+		context.success = False
+		return context
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 28ba9f6..c277545 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,10 +1,10 @@
+braintree==3.57.1
 frappe
-unidecode
-pygithub
-googlemaps
-python-stdnum
-braintree
-gocardless_pro
-woocommerce
-pandas
-plaid-python
\ No newline at end of file
+gocardless-pro==1.11.0
+googlemaps==3.1.1
+pandas==0.24.2
+plaid-python==3.4.0
+PyGithub==1.44.1
+python-stdnum==1.12
+Unidecode==1.1.1
+WooCommerce==2.1.1