Fixed merge conflict
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index 2dfd6e1..79602b5 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__ = '10.1.43'
+__version__ = '10.1.44'
def get_default_company(user=None):
'''Get default company for user'''
diff --git a/erpnext/accounts/doctype/account/account.js b/erpnext/accounts/doctype/account/account.js
index 1a23d5f..8b1d7f5 100644
--- a/erpnext/accounts/doctype/account/account.js
+++ b/erpnext/accounts/doctype/account/account.js
@@ -39,11 +39,10 @@
// credit days and type if customer or supplier
frm.set_intro(null);
frm.trigger('account_type');
-
// show / hide convert buttons
frm.trigger('add_toolbar_buttons');
}
- frm.add_custom_button(__('Update Account Number'), function () {
+ frm.add_custom_button(__('Update Account Name / Number'), function () {
frm.trigger("update_account_number");
});
}
@@ -94,30 +93,35 @@
update_account_number: function(frm) {
var d = new frappe.ui.Dialog({
- title: __('Update Account Number'),
+ title: __('Update Account Number / Name'),
fields: [
{
+ "label": "Account Name",
+ "fieldname": "account_name",
+ "fieldtype": "Data",
+ "reqd": 1,
+ "default": frm.doc.account_name
+ },
+ {
"label": "Account Number",
"fieldname": "account_number",
"fieldtype": "Data",
- "reqd": 1
+ "default": frm.doc.account_number
}
],
primary_action: function() {
var data = d.get_values();
- if(data.account_number === frm.doc.account_number) {
+ if(data.account_number === frm.doc.account_number && data.account_name === frm.doc.account_name) {
d.hide();
return;
}
frappe.call({
- method: "erpnext.accounts.utils.update_number_field",
+ method: "erpnext.accounts.doctype.account.account.update_account_number",
args: {
- doctype_name: frm.doc.doctype,
- name: frm.doc.name,
- field_name: d.fields[0].fieldname,
- field_value: data.account_number,
- company: frm.doc.company,
+ account_number: data.account_number,
+ account_name: data.account_name,
+ name: frm.doc.name
},
callback: function(r) {
if(!r.exc) {
@@ -125,6 +129,7 @@
frappe.set_route("Form", "Account", r.message);
} else {
frm.set_value("account_number", data.account_number);
+ frm.set_value("account_name", data.account_name);
}
d.hide();
}
@@ -135,4 +140,4 @@
});
d.show();
}
-});
\ No newline at end of file
+});
diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json
index de28a59..5bb55ec 100644
--- a/erpnext/accounts/doctype/account/account.json
+++ b/erpnext/accounts/doctype/account/account.json
@@ -2,7 +2,7 @@
"allow_copy": 1,
"allow_guest_to_view": 0,
"allow_import": 1,
- "allow_rename": 1,
+ "allow_rename": 0,
"beta": 0,
"creation": "2013-01-30 12:49:46",
"custom": 0,
@@ -625,7 +625,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2018-05-07 15:37:25.962506",
+ "modified": "2018-07-08 09:47:04.287841",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Account",
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index b92e423..fa92bbf 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -167,53 +167,6 @@
super(Account, self).on_trash(True)
- def before_rename(self, old, new, merge=False):
- # Add company abbr if not provided
- from erpnext.setup.doctype.company.company import get_name_with_abbr
- new_account = get_name_with_abbr(new, self.company)
- if not merge:
- new_account = get_name_with_number(new_account, self.account_number)
- else:
- # Validate properties before merging
- if not frappe.db.exists("Account", new):
- throw(_("Account {0} does not exist").format(new))
-
- val = list(frappe.db.get_value("Account", new_account,
- ["is_group", "root_type", "company"]))
-
- if val != [self.is_group, self.root_type, self.company]:
- throw(_("""Merging is only possible if following properties are same in both records. Is Group, Root Type, Company"""))
-
- if self.is_group and frappe.db.get_value("Account", new, "parent_account") == old:
- frappe.db.set_value("Account", new, "parent_account",
- frappe.db.get_value("Account", old, "parent_account"))
-
- return new_account
-
- def after_rename(self, old, new, merge=False):
- super(Account, self).after_rename(old, new, merge)
-
- if not merge:
- new_acc = frappe.db.get_value("Account", new, ["account_name", "account_number"], as_dict=1)
-
- # exclude company abbr
- new_parts = new.split(" - ")[:-1]
- # update account number and remove from parts
- if new_parts[0][0].isdigit():
- # if account number is separate by space, split using space
- if len(new_parts) == 1:
- new_parts = new.split(" ")
- if new_acc.account_number != new_parts[0]:
- self.account_number = new_parts[0]
- self.db_set("account_number", new_parts[0])
- new_parts = new_parts[1:]
-
- # update account name
- account_name = " - ".join(new_parts)
- if new_acc.account_name != account_name:
- self.account_name = account_name
- self.db_set("account_name", account_name)
-
def get_parent_account(doctype, txt, searchfield, start, page_len, filters):
return frappe.db.sql("""select name from tabAccount
where is_group = 1 and docstatus != 2 and company = %s
@@ -234,11 +187,38 @@
return frappe.local_cache("account_currency", account, generator)
-def get_name_with_number(new_account, account_number):
- if account_number and not new_account[0].isdigit():
- new_account = account_number + " - " + new_account
- return new_account
-
-
def on_doctype_update():
- frappe.db.add_index("Account", ["lft", "rgt"])
\ No newline at end of file
+ frappe.db.add_index("Account", ["lft", "rgt"])
+
+def get_account_autoname(account_number, account_name, company):
+ # first validate if company exists
+ company = frappe.db.get_value("Company", company, ["abbr", "name"], as_dict=True)
+ if not company:
+ frappe.throw(_('Company {0} does not exist').format(company))
+
+ parts = [account_name.strip(), company.abbr]
+ if cstr(account_number).strip():
+ parts.insert(0, cstr(account_number).strip())
+ return ' - '.join(parts)
+
+def validate_account_number(name, account_number, company):
+ if account_number:
+ account_with_same_number = frappe.db.get_value("Account",
+ {"account_number": account_number, "company": company, "name": ["!=", name]})
+ if account_with_same_number:
+ frappe.throw(_("Account Number {0} already used in account {1}")
+ .format(account_number, account_with_same_number))
+
+@frappe.whitelist()
+def update_account_number(name, account_name, account_number=None):
+
+ account = frappe.db.get_value("Account", name, ["company"], as_dict=True)
+ validate_account_number(name, account_number, account.company)
+ if account_number:
+ frappe.db.set_value("Account", name, "account_number", account_number.strip())
+ frappe.db.set_value("Account", name, "account_name", account_name.strip())
+
+ new_name = get_account_autoname(account_number, account_name, account.company)
+ if name != new_name:
+ frappe.rename_doc("Account", name, new_name, ignore_permissions=1)
+ return new_name
diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py
index 55383dc..2fe2ffb 100644
--- a/erpnext/accounts/doctype/account/test_account.py
+++ b/erpnext/accounts/doctype/account/test_account.py
@@ -5,6 +5,7 @@
import unittest
import frappe
from erpnext.stock import get_warehouse_account, get_company_default_inventory_account
+from erpnext.accounts.doctype.account.account import update_account_number
class TestAccount(unittest.TestCase):
def test_rename_account(self):
@@ -21,21 +22,18 @@
self.assertEqual(account_number, "1210")
self.assertEqual(account_name, "Debtors")
- frappe.rename_doc("Account", "1210 - Debtors - _TC", "1211 - Debtors 1 - _TC")
+ new_account_number = "1211-11-4 - 6 - "
+ new_account_name = "Debtors 1 - Test - "
- new_acc = frappe.db.get_value("Account", "1211 - Debtors 1 - _TC",
+ update_account_number("1210 - Debtors - _TC", new_account_number, new_account_name)
+
+ new_acc = frappe.db.get_value("Account", "1211-11-4 - 6 - - Debtors 1 - Test - - _TC",
["account_name", "account_number"], as_dict=1)
- self.assertEqual(new_acc.account_name, "Debtors 1")
- self.assertEqual(new_acc.account_number, "1211")
- frappe.rename_doc("Account", "1211 - Debtors 1 - _TC", "Debtors 2")
+ self.assertEqual(new_acc.account_name, "Debtors 1 - Test -")
+ self.assertEqual(new_acc.account_number, "1211-11-4 - 6 -")
- new_acc = frappe.db.get_value("Account", "1211 - Debtors 2 - _TC",
- ["account_name", "account_number"], as_dict=1)
- self.assertEqual(new_acc.account_name, "Debtors 2")
- self.assertEqual(new_acc.account_number, "1211")
-
- frappe.delete_doc("Account", "1211 - Debtors 2 - _TC")
+ frappe.delete_doc("Account", "1211-11-4 - 6 - Debtors 1 - Test - - _TC")
def _make_test_records(verbose):
from frappe.test_runner import make_test_objects
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json
index 564a93c..81e8d7a 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.json
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json
@@ -40,7 +40,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -72,7 +71,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 1,
- "translatable": 0,
"unique": 0
},
{
@@ -104,7 +102,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -134,7 +131,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -166,7 +162,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -198,7 +193,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -230,7 +224,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -262,7 +255,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -296,7 +288,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -329,7 +320,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -359,7 +349,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -392,7 +381,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -423,7 +411,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -455,7 +442,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -488,7 +474,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -521,7 +506,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -554,7 +538,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -584,7 +567,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -617,7 +599,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -650,7 +631,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -683,7 +663,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -716,7 +695,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -749,7 +727,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -781,7 +758,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -814,7 +790,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -844,7 +819,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -877,7 +851,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -909,7 +882,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -942,7 +914,6 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -975,7 +946,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1008,7 +978,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1041,7 +1010,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1073,7 +1041,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1105,7 +1072,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1138,7 +1104,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1169,7 +1134,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1199,7 +1163,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1231,7 +1194,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1264,7 +1226,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1296,7 +1257,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1329,7 +1289,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1361,7 +1320,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1392,7 +1350,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1424,7 +1381,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1454,7 +1410,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1486,7 +1441,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1518,7 +1472,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1551,7 +1504,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1584,7 +1536,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1604,7 +1555,7 @@
"in_standard_filter": 0,
"label": "Remarks",
"length": 0,
- "no_copy": 0,
+ "no_copy": 1,
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -1615,7 +1566,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1645,7 +1595,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1677,7 +1626,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1709,7 +1657,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1740,7 +1687,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1772,7 +1718,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1803,7 +1748,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
},
{
@@ -1834,7 +1778,6 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "translatable": 0,
"unique": 0
}
],
@@ -1848,7 +1791,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2018-03-10 07:31:49.264576",
+ "modified": "2018-07-27 01:49:24.720317",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Entry",
diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
index ccd3a82..7df877f 100644
--- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
+++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
@@ -157,6 +157,9 @@
return so_dn_map
+def get_deducted_taxes():
+ return frappe.db.sql_list("select name from `tabPurchase Taxes and Charges` where add_deduct_tax = 'Deduct'")
+
def get_tax_accounts(item_list, columns, company_currency,
doctype="Sales Invoice", tax_doctype="Sales Taxes and Charges"):
import json
@@ -176,9 +179,10 @@
if doctype == "Purchase Invoice":
conditions = " and category in ('Total', 'Valuation and Total') and base_tax_amount_after_discount_amount != 0"
+ deducted_tax = get_deducted_taxes()
tax_details = frappe.db.sql("""
select
- parent, description, item_wise_tax_detail,
+ name, parent, description, item_wise_tax_detail,
charge_type, base_tax_amount_after_discount_amount
from `tab%s`
where
@@ -190,7 +194,7 @@
""" % (tax_doctype, '%s', ', '.join(['%s']*len(invoice_item_row)), conditions),
tuple([doctype] + list(invoice_item_row)))
- for parent, description, item_wise_tax_detail, charge_type, tax_amount in tax_details:
+ for name, parent, description, item_wise_tax_detail, charge_type, tax_amount in tax_details:
description = handle_html(description)
if description not in tax_columns and tax_amount:
# as description is text editor earlier and markup can break the column convention in reports
@@ -219,9 +223,13 @@
item_tax_amount = flt((tax_amount * d.base_net_amount) / item_net_amount) \
if item_net_amount else 0
if item_tax_amount:
+ tax_amount = flt(item_tax_amount, tax_amount_precision)
+ tax_amount = (tax_amount * -1
+ if (doctype == 'Purchase Invoice' and name in deducted_tax) else tax_amount)
+
itemised_tax.setdefault(d.name, {})[description] = frappe._dict({
"tax_rate": tax_rate,
- "tax_amount": flt(item_tax_amount, tax_amount_precision)
+ "tax_amount": tax_amount
})
except ValueError:
diff --git a/erpnext/accounts/report/trial_balance/trial_balance.py b/erpnext/accounts/report/trial_balance/trial_balance.py
index 8c55df5..4b8c823 100644
--- a/erpnext/accounts/report/trial_balance/trial_balance.py
+++ b/erpnext/accounts/report/trial_balance/trial_balance.py
@@ -162,8 +162,6 @@
total_row["credit"] += d["credit"]
total_row["opening_debit"] += d["opening_debit"]
total_row["opening_credit"] += d["opening_credit"]
- total_row["closing_debit"] += (d["opening_debit"] + d["debit"])
- total_row["closing_credit"] += (d["opening_credit"] + d["credit"])
return total_row
@@ -179,6 +177,8 @@
if not (accounts[0].account_number is None):
accounts = tmpaccnt
+ total_row["closing_debit"] = total_row["closing_credit"] = 0
+
for d in accounts:
has_value = False
row = {
@@ -203,6 +203,10 @@
row["has_value"] = has_value
data.append(row)
+ if not d.parent_account:
+ total_row["closing_debit"] += (d["debit"] - d["credit"]) if (d["debit"] - d["credit"]) > 0 else 0
+ total_row["closing_credit"] += abs(d["debit"] - d["credit"]) if (d["debit"] - d["credit"]) < 0 else 0
+
data.extend([{},total_row])
return data
diff --git a/erpnext/demo/user/education.py b/erpnext/demo/user/education.py
index 4fc9c6a..fc31176 100644
--- a/erpnext/demo/user/education.py
+++ b/erpnext/demo/user/education.py
@@ -51,12 +51,12 @@
def assign_student_group(student, student_name, program, courses, batch):
course_list = [d["course"] for d in courses]
- for d in frappe.get_list("Student Group", fields=("name"), filters={"program": program, "course":("in", course_list)}):
+ for d in frappe.get_list("Student Group", fields=("name"), filters={"program": program, "course":("in", course_list), "disabled": 0}):
student_group = frappe.get_doc("Student Group", d.name)
student_group.append("students", {"student": student, "student_name": student_name,
"group_roll_number":len(student_group.students)+1, "active":1})
student_group.save()
- student_batch = frappe.get_list("Student Group", fields=("name"), filters={"program": program, "group_based_on":"Batch", "batch":batch})[0]
+ student_batch = frappe.get_list("Student Group", fields=("name"), filters={"program": program, "group_based_on":"Batch", "batch":batch, "disabled": 0})[0]
student_batch_doc = frappe.get_doc("Student Group", student_batch.name)
student_batch_doc.append("students", {"student": student, "student_name": student_name,
"group_roll_number":len(student_batch_doc.students)+1, "active":1})
@@ -65,7 +65,7 @@
def mark_student_attendance(current_date):
status = ["Present", "Absent"]
- for d in frappe.db.get_list("Student Group", filters={"group_based_on": "Batch"}):
+ for d in frappe.db.get_list("Student Group", filters={"group_based_on": "Batch", "disabled": 0}):
students = get_student_group_students(d.name)
for stud in students:
make_attendance_records(stud.student, stud.student_name, status[weighted_choice([9,4])], None, d.name, current_date)
@@ -77,7 +77,7 @@
def make_assessment_plan(date):
for d in range(1,4):
- random_group = get_random("Student Group", {"group_based_on": "Course"}, True)
+ random_group = get_random("Student Group", {"group_based_on": "Course", "disabled": 0}, True)
doc = frappe.new_doc("Assessment Plan")
doc.student_group = random_group.name
doc.course = random_group.course
diff --git a/erpnext/education/api.py b/erpnext/education/api.py
index 8571bf9..30d5588 100644
--- a/erpnext/education/api.py
+++ b/erpnext/education/api.py
@@ -88,16 +88,14 @@
:param course_schedule: Course Schedule.
:param status: Status (Present/Absent)
"""
- student_attendance_list = frappe.get_list("Student Attendance", fields = ['name'], filters = {
+ student_attendance = frappe.get_doc({
+ "doctype": "Student Attendance",
"student": student,
"course_schedule": course_schedule,
"student_group": student_group,
"date": date
})
-
- if student_attendance_list:
- student_attendance = frappe.get_doc("Student Attendance", student_attendance_list[0])
- else:
+ if not student_attendance:
student_attendance = frappe.new_doc("Student Attendance")
student_attendance.student = student
student_attendance.student_name = student_name
diff --git a/erpnext/education/doctype/education_settings/education_settings.json b/erpnext/education/doctype/education_settings/education_settings.json
index a0b8e99..c1eaa11 100644
--- a/erpnext/education/doctype/education_settings/education_settings.json
+++ b/erpnext/education/doctype/education_settings/education_settings.json
@@ -201,6 +201,38 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "default": "0",
+ "description": "If enabled, field Academic Term will be Mandatory in Program Enrollment Tool.",
+ "fieldname": "academic_term_reqd",
+ "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": "Make Academic Term Mandatory",
+ "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": "section_break_7",
"fieldtype": "Section Break",
"hidden": 0,
@@ -267,7 +299,7 @@
"issingle": 1,
"istable": 0,
"max_attachments": 0,
- "modified": "2017-11-28 15:45:30.324324",
+ "modified": "2018-07-26 04:43:35.406690",
"modified_by": "Administrator",
"module": "Education",
"name": "Education Settings",
diff --git a/erpnext/education/doctype/fee_schedule/fee_schedule.js b/erpnext/education/doctype/fee_schedule/fee_schedule.js
index c4fff77..1338331 100644
--- a/erpnext/education/doctype/fee_schedule/fee_schedule.js
+++ b/erpnext/education/doctype/fee_schedule/fee_schedule.js
@@ -31,7 +31,8 @@
return {
"program": frm.doc.program,
"academic_term": frm.doc.academic_term,
- "academic_year": frm.doc.academic_year
+ "academic_year": frm.doc.academic_year,
+ "disabled": 0
};
});
frappe.realtime.on("fee_schedule_progress", function(data) {
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment.json b/erpnext/education/doctype/program_enrollment/program_enrollment.json
index 817c4bc..23da149 100644
--- a/erpnext/education/doctype/program_enrollment/program_enrollment.json
+++ b/erpnext/education/doctype/program_enrollment/program_enrollment.json
@@ -693,7 +693,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2018-05-16 22:43:04.881120",
+ "modified": "2018-07-26 04:44:03.781418",
"modified_by": "Administrator",
"module": "Education",
"name": "Program Enrollment",
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment.py b/erpnext/education/doctype/program_enrollment/program_enrollment.py
index 0f9bb96..455ad9c 100644
--- a/erpnext/education/doctype/program_enrollment/program_enrollment.py
+++ b/erpnext/education/doctype/program_enrollment/program_enrollment.py
@@ -86,7 +86,6 @@
"program": filters['program']
})
-
@frappe.whitelist()
def get_students(doctype, txt, searchfield, start, page_len, filters):
if not filters.get("academic_term"):
diff --git a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.js b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.js
index 2e54a2f..06d7598 100644
--- a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.js
+++ b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.js
@@ -5,6 +5,9 @@
setup: function(frm) {
frm.add_fetch("student", "title", "student_name");
frm.add_fetch("student_applicant", "title", "student_name");
+ if(frm.doc.__onload && frm.doc.__onload.academic_term_reqd) {
+ frm.toggle_reqd("academic_term", true);
+ }
},
"refresh": function(frm) {
diff --git a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.json b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.json
index d611a6f..35ad98d 100644
--- a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.json
+++ b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.json
@@ -513,7 +513,7 @@
"issingle": 1,
"istable": 0,
"max_attachments": 0,
- "modified": "2018-01-02 11:59:40.230689",
+ "modified": "2018-07-26 04:44:13.232146",
"modified_by": "Administrator",
"module": "Education",
"name": "Program Enrollment Tool",
diff --git a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py
index 0b13449..db23ac7 100644
--- a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py
+++ b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py
@@ -7,8 +7,13 @@
from frappe import _
from frappe.model.document import Document
from erpnext.education.api import enroll_student
+from frappe.utils import cint
class ProgramEnrollmentTool(Document):
+ def onload(self):
+ academic_term_reqd = cint(frappe.db.get_single_value('Education Settings', 'academic_term_reqd'))
+ self.set_onload("academic_term_reqd", academic_term_reqd)
+
def get_students(self):
students = []
if not self.get_students_from:
diff --git a/erpnext/education/doctype/student_attendance/student_attendance.json b/erpnext/education/doctype/student_attendance/student_attendance.json
index f703053..23e10e6 100644
--- a/erpnext/education/doctype/student_attendance/student_attendance.json
+++ b/erpnext/education/doctype/student_attendance/student_attendance.json
@@ -3,7 +3,7 @@
"allow_guest_to_view": 0,
"allow_import": 1,
"allow_rename": 0,
- "autoname": "SA.######",
+ "autoname": "",
"beta": 0,
"creation": "2015-11-05 15:20:23.045996",
"custom": 0,
@@ -40,7 +40,7 @@
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
- "search_index": 0,
+ "search_index": 1,
"set_only_once": 0,
"translatable": 0,
"unique": 0
@@ -103,7 +103,7 @@
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
- "search_index": 0,
+ "search_index": 1,
"set_only_once": 0,
"translatable": 0,
"unique": 0
@@ -247,7 +247,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2018-05-16 22:43:27.329881",
+ "modified": "2018-07-27 10:48:22.301531",
"modified_by": "Administrator",
"module": "Education",
"name": "Student Attendance",
diff --git a/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js
index df6d132..cc9607d 100644
--- a/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js
+++ b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js
@@ -7,7 +7,8 @@
frm.set_query("student_group", function() {
return {
"filters": {
- "group_based_on": frm.doc.group_based_on
+ "group_based_on": frm.doc.group_based_on,
+ "disabled": 0
}
};
});
diff --git a/erpnext/education/doctype/student_group/student_group.json b/erpnext/education/doctype/student_group/student_group.json
index 37a611b..0af1565 100644
--- a/erpnext/education/doctype/student_group/student_group.json
+++ b/erpnext/education/doctype/student_group/student_group.json
@@ -298,6 +298,37 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "columns": 0,
+ "default": "0",
+ "fieldname": "disabled",
+ "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": "Disabled",
+ "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,
"collapsible_depends_on": "",
"columns": 0,
"depends_on": "eval:!doc.__islocal",
@@ -459,7 +490,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2017-11-10 19:09:37.370864",
+ "modified": "2018-07-26 04:17:10.836912",
"modified_by": "Administrator",
"module": "Education",
"name": "Student Group",
diff --git a/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py b/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py
index 19136ea..c2ac0d7 100644
--- a/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py
+++ b/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py
@@ -99,7 +99,7 @@
def get_student_roll_no(academic_year, program, batch):
student_group = frappe.get_all("Student Group",
- filters={"academic_year":academic_year, "program":program, "batch":batch})
+ filters={"academic_year":academic_year, "program":program, "batch":batch, "disabled": 0})
if student_group:
roll_no_dict = dict(frappe.db.sql('''select student, group_roll_number from `tabStudent Group Student` where parent=%s''',
(student_group[0].name)))
diff --git a/erpnext/patches/v9_2/repost_reserved_qty_for_production.py b/erpnext/patches/v9_2/repost_reserved_qty_for_production.py
index 27cce1d..c4eab19 100644
--- a/erpnext/patches/v9_2/repost_reserved_qty_for_production.py
+++ b/erpnext/patches/v9_2/repost_reserved_qty_for_production.py
@@ -1,7 +1,8 @@
import frappe
def execute():
+ frappe.reload_doc("stock", "doctype", "bin")
bins = frappe.db.sql("select name from `tabBin` where reserved_qty_for_production > 0")
for d in bins:
bin_doc = frappe.get_doc("Bin", d[0])
- bin_doc.update_reserved_qty_for_production()
\ No newline at end of file
+ bin_doc.update_reserved_qty_for_production()
diff --git a/erpnext/regional/report/eway_bill/__init__.py b/erpnext/regional/report/eway_bill/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/regional/report/eway_bill/__init__.py
diff --git a/erpnext/regional/report/eway_bill/eway_bill.js b/erpnext/regional/report/eway_bill/eway_bill.js
new file mode 100644
index 0000000..ab00946
--- /dev/null
+++ b/erpnext/regional/report/eway_bill/eway_bill.js
@@ -0,0 +1,33 @@
+// Copyright (c) 2016, FinByz Tech Pvt. Ltd. and contributors
+// For license information, please see license.txt
+/* eslint-disable */
+
+frappe.query_reports["Eway Bill"] = {
+ "filters": [
+ {
+ 'fieldname': 'delivery_note',
+ 'label': __("Delivery Note"),
+ 'fieldtype': 'Link',
+ 'options': 'Delivery Note'
+ },
+ {
+ 'fieldname': 'posting_date',
+ 'label': __("Date"),
+ 'fieldtype': 'DateRange',
+ 'default': [frappe.datetime.nowdate(), frappe.datetime.nowdate()]
+ },
+ {
+ 'fieldname': 'customer',
+ 'label': __("Customer"),
+ 'fieldtype': 'Link',
+ 'options': 'Customer'
+ },
+ {
+ "fieldname":"company",
+ "label": __("Company"),
+ "fieldtype": "Link",
+ "options": "Company",
+ "default": frappe.defaults.get_user_default("Company")
+ },
+ ]
+}
diff --git a/erpnext/regional/report/eway_bill/eway_bill.json b/erpnext/regional/report/eway_bill/eway_bill.json
new file mode 100644
index 0000000..41d6c93
--- /dev/null
+++ b/erpnext/regional/report/eway_bill/eway_bill.json
@@ -0,0 +1,32 @@
+{
+ "add_total_row": 0,
+ "apply_user_permissions": 1,
+ "creation": "2018-07-13 19:59:18.922829",
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "idx": 0,
+ "is_standard": "Yes",
+ "modified": "2018-07-19 12:08:07.400295",
+ "modified_by": "Administrator",
+ "module": "Regional",
+ "name": "Eway Bill",
+ "owner": "Administrator",
+ "ref_doctype": "Delivery Note",
+ "report_name": "Eway Bill",
+ "report_type": "Script Report",
+ "roles": [
+ {
+ "role": "Stock User"
+ },
+ {
+ "role": "Stock Manager"
+ },
+ {
+ "role": "Sales User"
+ },
+ {
+ "role": "Accounts User"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/erpnext/regional/report/eway_bill/eway_bill.py b/erpnext/regional/report/eway_bill/eway_bill.py
new file mode 100644
index 0000000..0ded917
--- /dev/null
+++ b/erpnext/regional/report/eway_bill/eway_bill.py
@@ -0,0 +1,385 @@
+# Copyright (c) 2013, FinByz Tech Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+import json
+import re
+from frappe import _
+from frappe.utils import nowdate
+
+def execute(filters=None):
+ if not filters: filters.setdefault('posting_date', [nowdate(), nowdate()])
+ columns, data = [], []
+ columns = get_columns()
+ data = get_data(filters)
+ return columns, data
+
+def get_data(filters):
+
+ conditions = get_conditions(filters)
+
+ data = frappe.db.sql("""
+ SELECT
+ dn.name as dn_id, dn.posting_date, dn.company, dn.company_gstin, dn.customer, dn.customer_gstin, dni.item_code, dni.item_name, dni.description, dni.gst_hsn_code, dni.uom, dni.qty, dni.amount, dn.transport_mode, dn.distance, dn.transporter_name, dn.transporter, dn.lr_no, dn.lr_date, dn.vehicle_no, dn.vehicle_type, dn.company_address, dn.shipping_address_name
+ FROM
+ `tabDelivery Note` AS dn join `tabDelivery Note Item` AS dni on (dni.parent = dn.name)
+ WHERE
+ dn.docstatus < 2
+ %s """ % conditions, as_dict=1)
+
+ unit = {
+ 'Bag': "BAGS",
+ 'Bottle': "BOTTLES",
+ 'Kg': "KILOGRAMS",
+ 'Liter': "LITERS",
+ 'Meter': "METERS",
+ 'Nos': "NUMBERS",
+ 'PKT': "PACKS",
+ 'Roll': "ROLLS",
+ 'Set': "SETS"
+ }
+
+ # Regular expression set to remove all the special characters
+ special_characters = "[$%^*()+\\[\]{};':\"\\|<>.?]"
+
+ for row in data:
+ set_defaults(row)
+ set_taxes(row, filters)
+ set_address_details(row, special_characters)
+
+ # Eway Bill accepts date as dd/mm/yyyy and not dd-mm-yyyy
+ row.posting_date = '/'.join(str(row.posting_date).replace("-", "/").split('/')[::-1])
+ row.lr_date = '/'.join(str(row.lr_date).replace("-", "/").split('/')[::-1])
+
+ row.item_name = re.sub(special_characters, " ", row.item_name)
+ row.description = row.item_name
+
+ row.uom = unit.get(row.uom, row.uom)
+
+ # For removing special charactes and numbers from customer.
+ row.customer = re.sub(special_characters[:-1] + "&0-9" + "]", "", row.customer)
+
+ return data
+
+def get_conditions(filters):
+
+ conditions = ""
+
+ conditions += filters.get('company') and " AND dn.company = '%s' " % filters.get('company') or ""
+ conditions += filters.get('posting_date') and " AND dn.posting_date >= '%s' AND dn.posting_date <= '%s' " % (filters.get('posting_date')[0], filters.get('posting_date')[1]) or ""
+ conditions += filters.get('delivery_note') and " AND dn.name = '%s' " % filters.get('delivery_note') or ""
+ conditions += filters.get('customer') and " AND dn.customer = '%s' " % filters.get('customer').replace("'", "\'") or ""
+
+ return conditions
+
+def set_defaults(row):
+ row.setdefault(u'supply_type', "Outward")
+ row.setdefault(u'sub_type', "Supply")
+ row.setdefault(u'doc_type', "Delivery Challan")
+
+def set_address_details(row, special_characters):
+
+ if row.get('company_address'):
+ address_line1, address_line2, city, pincode, state = frappe.db.get_value("Address", row.get('company_address'), ['address_line1', 'address_line2', 'city', 'pincode', 'state'])
+
+ row.update({'from_address_1': re.sub(special_characters, "", address_line1 or '')})
+ row.update({'from_address_2': re.sub(special_characters, "", address_line2 or '')})
+ row.update({'from_place': city and city.upper() or ''})
+ row.update({'from_pin_code': pincode and pincode.replace(" ", "") or ''})
+ row.update({'from_state': state and state.upper() or ''})
+ row.update({'dispatch_state': row.from_state})
+
+ if row.get('shipping_address_name'):
+ address_line1, address_line2, city, pincode, state = frappe.db.get_value("Address", row.get('shipping_address_name'), ['address_line1', 'address_line2', 'city', 'pincode', 'state'])
+
+ row.update({'to_address_1': re.sub(special_characters, "", address_line1 or '')})
+ row.update({'to_address_2': re.sub(special_characters, "", address_line2 or '')})
+ row.update({'to_place': city and city.upper() or ''})
+ row.update({'to_pin_code': pincode and pincode.replace(" ", "") or ''})
+ row.update({'to_state': state and state.upper() or ''})
+ row.update({'ship_to_state': row.to_state})
+
+def set_taxes(row, filters):
+ taxes = frappe.get_list("Sales Taxes and Charges",
+ filters={
+ 'parent': row.dn_id
+ },
+ fields=('item_wise_tax_detail', 'account_head'))
+
+ account_list = ["cgst_account", "sgst_account", "igst_account", "cess_account"]
+ taxes_list = frappe.get_list("GST Account",
+ filters={
+ "parent": "GST Settings",
+ "company": filters.company
+ },
+ fields=account_list)
+
+ item_tax_rate = {}
+
+ for tax in taxes:
+ item_wise_tax = json.loads(tax.item_wise_tax_detail)
+ item_tax_rate[tax.account_head] = item_wise_tax.get(row.item_code)
+
+ tax_rate = []
+
+ tax = taxes_list[0]
+ for key in account_list:
+ if tax[key] not in item_tax_rate.keys():
+ item_tax_rate[tax[key]] = [0.0, 0.0]
+
+ tax_rate.append(str(item_tax_rate[tax[key]][0]))
+ row.update({key[:5] + "amount": round(item_tax_rate.get(tax[key], 0.0)[1], 2)})
+ item_tax_rate.pop(tax[key])
+
+ row.amount = float(row.amount) + sum(i[1] for i in item_tax_rate.values())
+ row.update({'tax_rate': '+'.join(tax_rate)})
+
+def get_columns():
+ columns = [
+ {
+ "fieldname": "supply_type",
+ "label": _("Supply Type"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "sub_type",
+ "label": _("Sub Type"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "doc_type",
+ "label": _("Doc Type"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "dn_id",
+ "label": _("Doc Name"),
+ "fieldtype": "Link",
+ "options": "Delivery Note",
+ "width": 140
+ },
+ {
+ "fieldname": "posting_date",
+ "label": _("Doc Date"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "company",
+ "label": _("From Party Name"),
+ "fieldtype": "Link",
+ "options": "Company",
+ "width": 120
+ },
+ {
+ "fieldname": "company_gstin",
+ "label": _("From GSTIN"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "from_address_1",
+ "label": _("From Address 1"),
+ "fieldtype": "Data",
+ "width": 120
+ },
+ {
+ "fieldname": "from_address_2",
+ "label": _("From Address 2"),
+ "fieldtype": "Data",
+ "width": 120
+ },
+ {
+ "fieldname": "from_place",
+ "label": _("From Place"),
+ "fieldtype": "Data",
+ "width": 80
+ },
+ {
+ "fieldname": "from_pin_code",
+ "label": _("From Pin Code"),
+ "fieldtype": "Data",
+ "width": 80
+ },
+ {
+ "fieldname": "from_state",
+ "label": _("From State"),
+ "fieldtype": "Data",
+ "width": 80
+ },
+ {
+ "fieldname": "dispatch_state",
+ "label": _("Dispatch State"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "customer",
+ "label": _("To Party Name"),
+ "fieldtype": "Data",
+ "width": 120
+ },
+ {
+ "fieldname": "customer_gstin",
+ "label": _("To GSTIN"),
+ "fieldtype": "Data",
+ "width": 120
+ },
+ {
+ "fieldname": "to_address_1",
+ "label": _("To Address 1"),
+ "fieldtype": "Data",
+ "width": 120
+ },
+ {
+ "fieldname": "to_address_2",
+ "label": _("To Address 2"),
+ "fieldtype": "Data",
+ "width": 120
+ },
+ {
+ "fieldname": "to_place",
+ "label": _("To Place"),
+ "fieldtype": "Data",
+ "width": 80
+ },
+ {
+ "fieldname": "to_pin_code",
+ "label": _("To Pin Code"),
+ "fieldtype": "Data",
+ "width": 80
+ },
+ {
+ "fieldname": "to_state",
+ "label": _("To State"),
+ "fieldtype": "Data",
+ "width": 80
+ },
+ {
+ "fieldname": "ship_to_state",
+ "label": _("Ship To State"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "item_name",
+ "label": _("Product"),
+ "fieldtype": "Link",
+ "options": "Item",
+ "width": 120
+ },
+ {
+ "fieldname": "description",
+ "label": _("Description"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "gst_hsn_code",
+ "label": _("HSN"),
+ "fieldtype": "Data",
+ "width": 120
+ },
+ {
+ "fieldname": "uom",
+ "label": _("Unit"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "qty",
+ "label": _("Qty"),
+ "fieldtype": "Float",
+ "width": 100
+ },
+ {
+ "fieldname": "amount",
+ "label": _("Accessable Value"),
+ "fieldtype": "Float",
+ "width": 120
+ },
+ {
+ "fieldname": "tax_rate",
+ "label": _("Tax Rate"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "cgst_amount",
+ "label": _("CGST Amount"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "sgst_amount",
+ "label": _("SGST Amount"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "igst_amount",
+ "label": _("IGST Amount"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "cess_amount",
+ "label": _("CESS Amount"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "transport_mode",
+ "label": _("Transport Mode"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "distance",
+ "label": _("Distance"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "transporter_name",
+ "label": _("Transporter Name"),
+ "fieldtype": "Data",
+ "width": 120
+ },
+ {
+ "fieldname": "transporter_id",
+ "label": _("Transporter ID"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "lr_no",
+ "label": _("Transporter Doc No"),
+ "fieldtype": "Data",
+ "width": 120
+ },
+ {
+ "fieldname": "lr_date",
+ "label": _("Transporter Date"),
+ "fieldtype": "Data",
+ "width": 120
+ },
+ {
+ "fieldname": "vehicle_no",
+ "label": _("Vehicle No"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ {
+ "fieldname": "vehicle_type",
+ "label": _("Vehicle Type"),
+ "fieldtype": "Data",
+ "width": 100
+ },
+ ]
+
+ return columns
\ No newline at end of file
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json
index 5572baf..28deb1c 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.json
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.json
@@ -2708,6 +2708,36 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "transporter",
+ "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": "Transporter ID",
+ "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": "transporter_name",
"fieldtype": "Data",
"hidden": 0,
@@ -2742,6 +2772,67 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "transport_mode",
+ "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": "Transport Mode",
+ "length": 0,
+ "no_copy": 0,
+ "options": "\nRoad\nAir\nRail\nShip",
+ "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": "distance",
+ "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": "Distance (KM)",
+ "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": "col_break34",
"fieldtype": "Column Break",
"hidden": 0,
@@ -2773,6 +2864,67 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "vehicle_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": "Vehicle No",
+ "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": "vehicle_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": "Vehicle Type",
+ "length": 0,
+ "no_copy": 0,
+ "options": "\nRegular\nODC",
+ "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,
"description": "",
"fieldname": "lr_no",
"fieldtype": "Data",
@@ -2783,7 +2935,7 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Vehicle No",
+ "label": "Transporter Doc No",
"length": 0,
"no_copy": 0,
"oldfieldname": "lr_no",
@@ -2819,7 +2971,7 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Vehicle Dispatch Date",
+ "label": "Transporter Date",
"length": 0,
"no_copy": 0,
"oldfieldname": "lr_date",
@@ -3290,36 +3442,36 @@
},
{
"allow_bulk_edit": 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,
+ "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,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
@@ -3881,7 +4033,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2018-07-17 03:03:35.035396",
+ "modified": "2018-07-19 11:53:03.807829",
"modified_by": "Administrator",
"module": "Stock",
"name": "Delivery Note",
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
index 51ccfcd..19195b1 100755
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
@@ -2356,6 +2356,38 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "depends_on": "eval:!doc.disable_rounded_total",
+ "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": 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,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "in_words",
"fieldtype": "Data",
"hidden": 0,
@@ -2386,6 +2418,36 @@
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "disable_rounded_total",
+ "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 Rounded Total",
+ "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": 1,
"collapsible_depends_on": "terms",
"columns": 0,
@@ -3105,69 +3167,69 @@
},
{
"allow_bulk_edit": 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,
+ "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,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "column_break_97",
- "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,
+ "fieldname": "column_break_97",
+ "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
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "other_details",
"fieldtype": "HTML",
"hidden": 1,
@@ -3436,7 +3498,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2018-07-17 02:59:59.609643",
+ "modified": "2018-07-23 11:27:52.534561",
"modified_by": "Administrator",
"module": "Stock",
"name": "Purchase Receipt",
diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py
index 774803f..e6ca5c2 100644
--- a/erpnext/stock/report/stock_balance/stock_balance.py
+++ b/erpnext/stock/report/stock_balance/stock_balance.py
@@ -17,6 +17,11 @@
columns = get_columns()
items = get_items(filters)
sle = get_stock_ledger_entries(filters, items)
+
+ # if no stock ledger entry found return
+ if not sle:
+ return columns, []
+
iwb_map = get_item_warehouse_map(filters, sle)
item_map = get_item_details(items, sle, filters)
item_reorder_detail_map = get_item_reorder_details(item_map.keys())
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index fe46512..37caf47 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -225,9 +225,10 @@
tuple(serial_no))[0][0])
new_stock_qty = self.qty_after_transaction + actual_qty
+
if new_stock_qty > 0:
new_stock_value = (self.qty_after_transaction * self.valuation_rate) + stock_value_change
- if new_stock_value > 0:
+ if new_stock_value >= 0:
# calculate new valuation rate only if stock value is positive
# else it remains the same as that of previous entry
self.valuation_rate = new_stock_value / new_stock_qty