Merge pull request #14166 from rohitwaghchaure/version_11_patch_budget
[Fix] Patch, default cost center, expense account for the item
diff --git a/erpnext/accounts/doctype/sales_invoice/pos.py b/erpnext/accounts/doctype/sales_invoice/pos.py
old mode 100644
new mode 100755
index 4d2e7cc..52b59d4
--- a/erpnext/accounts/doctype/sales_invoice/pos.py
+++ b/erpnext/accounts/doctype/sales_invoice/pos.py
@@ -153,12 +153,14 @@
def get_items_list(pos_profile, company):
cond = ""
- args_list = [company]
+ args_list = []
if pos_profile.get('item_groups'):
# Get items based on the item groups defined in the POS profile
for d in pos_profile.get('item_groups'):
args_list.extend([d.name for d in get_child_nodes('Item Group', d.item_group)])
cond = "and i.item_group in (%s)" % (', '.join(['%s'] * len(args_list)))
+
+ args_list = [company] + args_list
return frappe.db.sql("""
select
@@ -285,13 +287,13 @@
itemwise_barcode = {}
for item in items_list:
barcodes = frappe.db.sql("""
- select barcode from `tabItem Barcode` where parent = '{0}'
- """.format(item.item_code), as_dict=1)
+ select barcode from `tabItem Barcode` where parent = %s
+ """, item.item_code, as_dict=1)
for barcode in barcodes:
if item.item_code not in itemwise_barcode:
itemwise_barcode.setdefault(item.item_code, [])
- itemwise_barcode[item.item_code].append(barcode)
+ itemwise_barcode[item.item_code].append(barcode.get("barcode"))
return itemwise_barcode
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index 017771a..bf906ce 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -332,12 +332,14 @@
conditions.append("company=%s")
values.append(self.filters.company)
- if self.filters.finance_book:
+ company_finance_book = erpnext.get_default_finance_book(self.filters.company)
+
+ if not self.filters.finance_book or (self.filters.finance_book == company_finance_book):
conditions.append("ifnull(finance_book,'') in (%s, '')")
+ values.append(company_finance_book)
+ elif self.filters.finance_book:
+ conditions.append("ifnull(finance_book,'') = %s")
values.append(self.filters.finance_book)
- else:
- conditions.append("ifnull(finance_book,'') in (%s, '')")
- values.append(erpnext.get_default_finance_book(self.filters.company))
if self.filters.get(party_type_field):
conditions.append("party=%s")
diff --git a/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py b/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py
index 318c590..fb59882 100644
--- a/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py
+++ b/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py
@@ -42,11 +42,13 @@
if filters.get("asset_category"):
conditions += " and a.asset_category = %(asset_category)s"
- if filters.get("finance_book"):
+ company_finance_book = erpnext.get_default_finance_book(filters.get("company"))
+
+ if (not filters.get('finance_book') or (filters.get('finance_book') == company_finance_book)):
+ filters['finance_book'] = company_finance_book
conditions += " and ifnull(ds.finance_book, '') in (%(finance_book)s, '') "
- else:
- filters['finance_book'] = erpnext.get_default_finance_book(filters.get("company"))
- conditions += " and ifnull(ds.finance_book, '') in (%(finance_book)s, '') "
+ elif filters.get("finance_book"):
+ conditions += " and ifnull(ds.finance_book, '') = %(finance_book)s"
return conditions
diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js
index 63f263f..91a06f4 100644
--- a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js
+++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js
@@ -29,6 +29,12 @@
"reqd": 1
},
{
+ "fieldname":"finance_book",
+ "label": __("Finance Book"),
+ "fieldtype": "Link",
+ "options": "Finance Book"
+ },
+ {
"fieldname":"report",
"label": __("Report"),
"fieldtype": "Select",
diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py
index 750120b..39f4771 100644
--- a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py
+++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py
@@ -2,7 +2,7 @@
# For license information, please see license.txt
from __future__ import unicode_literals
-import frappe
+import frappe, erpnext
from frappe import _
from frappe.utils import flt, cint
from erpnext.accounts.report.financial_statements import get_fiscal_year_data, sort_accounts
@@ -322,7 +322,7 @@
company_lft, company_rgt = frappe.db.get_value('Company',
filters.get('company'), ["lft", "rgt"])
- additional_conditions = get_additional_conditions(from_date, ignore_closing_entries)
+ additional_conditions = get_additional_conditions(from_date, ignore_closing_entries, filters)
gl_entries = frappe.db.sql("""select gl.posting_date, gl.account, gl.debit, gl.credit, gl.is_opening, gl.company,
gl.fiscal_year, gl.debit_in_account_currency, gl.credit_in_account_currency, gl.account_currency,
@@ -353,7 +353,7 @@
field = "Account number" if entry.account_number else "Account name"
frappe.throw(_("{0} {1} is not present in the parent company").format(field, key))
-def get_additional_conditions(from_date, ignore_closing_entries):
+def get_additional_conditions(from_date, ignore_closing_entries, filters):
additional_conditions = []
if ignore_closing_entries:
@@ -362,6 +362,15 @@
if from_date:
additional_conditions.append("gl.posting_date >= %(from_date)s")
+ company_finance_book = erpnext.get_default_finance_book(filters.get("company"))
+
+ if not filters.get('finance_book') or (filters.get('finance_book') == company_finance_book):
+ additional_conditions.append("finance_book in ('%s', '')" %
+ frappe.db.escape(company_finance_book))
+ elif filters.get("finance_book"):
+ additional_conditions.append("finance_book = '%s' " %
+ frappe.db.escape(filters.get("finance_book")))
+
return " and {}".format(" and ".join(additional_conditions)) if additional_conditions else ""
def add_total_row(out, root_type, balance_must_be, companies, company_currency):
diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py
index f7bde6c..41abc3f 100644
--- a/erpnext/accounts/report/financial_statements.py
+++ b/erpnext/accounts/report/financial_statements.py
@@ -375,13 +375,15 @@
additional_conditions.append("project = '%s'" % (frappe.db.escape(filters.get("project"))))
if filters.get("cost_center"):
additional_conditions.append(get_cost_center_cond(filters.get("cost_center")))
- if filters.get("finance_book"):
- additional_conditions.append("finance_book in ('%s', '')" %
- frappe.db.escape(filters.get("finance_book")))
- else:
- additional_conditions.append("finance_book in ('%s', '')" %
- frappe.db.escape(erpnext.get_default_finance_book(filters.get("company"))))
+ company_finance_book = erpnext.get_default_finance_book(filters.get("company"))
+
+ if not filters.get('finance_book') or (filters.get('finance_book') == company_finance_book):
+ additional_conditions.append("finance_book in ('%s', '')" %
+ frappe.db.escape(company_finance_book))
+ elif filters.get("finance_book"):
+ additional_conditions.append("finance_book = '%s' " %
+ frappe.db.escape(filters.get("finance_book")))
return " and {}".format(" and ".join(additional_conditions)) if additional_conditions else ""
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py
index bd4dfb2..6aecab9 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/general_ledger.py
@@ -167,11 +167,12 @@
if filters.get("project"):
conditions.append("project=%(project)s")
- if filters.get("finance_book"):
+ company_finance_book = erpnext.get_default_finance_book(filters.get("company"))
+ if not filters.get("finance_book") or (filters.get("finance_book") == company_finance_book):
+ filters['finance_book'] = company_finance_book
conditions.append("ifnull(finance_book, '') in (%(finance_book)s, '')")
- else:
- filters['finance_book'] = erpnext.get_default_finance_book(filters.get("company"))
- conditions.append("ifnull(finance_book, '') in (%(finance_book)s, '')")
+ elif filters.get("finance_book"):
+ conditions.append("ifnull(finance_book, '') = %(finance_book)s")
from frappe.desk.reportview import build_match_conditions
match_conditions = build_match_conditions("GL Entry")
diff --git a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.js b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.js
index 1583daf..3c135d4 100644
--- a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.js
+++ b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.js
@@ -24,7 +24,28 @@
return indicator;
}
);
+
+ frm.set_query('select_serial_no', function(doc){
+ return {
+ asset: frm.doc.asset_name
+ }
+ })
},
+
+ select_serial_no: (frm) => {
+ let serial_nos = frm.doc.serial_no || frm.doc.select_serial_no;
+ if (serial_nos) {
+ serial_nos = serial_nos.split('\n');
+ serial_nos.push(frm.doc.select_serial_no);
+
+ const unique_sn = serial_nos.filter(function(elem, index, self) {
+ return index === self.indexOf(elem);
+ });
+
+ frm.set_value("serial_no", unique_sn.join('\n'));
+ }
+ },
+
refresh: (frm) => {
if(!frm.is_new()) {
frm.trigger('make_dashboard');
diff --git a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json
index f36fe4e..c254fe1 100644
--- a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json
+++ b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json
@@ -209,6 +209,38 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "select_serial_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": "Select Serial No",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Serial No",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "serial_no",
"fieldtype": "Small Text",
"hidden": 0,
@@ -221,12 +253,12 @@
"label": "Serial No",
"length": 0,
"no_copy": 0,
- "options": "asset_name.serial_no",
+ "options": "",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
- "read_only": 1,
+ "read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
@@ -465,7 +497,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2018-04-20 08:39:27.072622",
+ "modified": "2018-05-18 16:16:56.181695",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Maintenance",
diff --git a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
index b30685f..7551eae 100644
--- a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
+++ b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
@@ -11,9 +11,6 @@
class AssetMaintenance(Document):
def validate(self):
- if not self.serial_no:
- self.serial_no = frappe.db.get_value("Asset", self.asset_name, 'serial_no')
-
for task in self.get('asset_maintenance_tasks'):
if task.end_date and (getdate(task.start_date) >= getdate(task.end_date)):
throw(_("Start date should be less than end date for task {0}").format(task.maintenance_task))
diff --git a/erpnext/config/selling.py b/erpnext/config/selling.py
index b48cafc..496617a 100644
--- a/erpnext/config/selling.py
+++ b/erpnext/config/selling.py
@@ -285,6 +285,12 @@
"name": "Customer Credit Balance",
"doctype": "Customer"
},
+ {
+ "type": "report",
+ "is_query_report": True,
+ "name": "Customers Without Any Sales Transactions",
+ "doctype": "Customer"
+ },
]
},
{
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.js b/erpnext/hr/doctype/expense_claim/expense_claim.js
index f9d1c43..0da8ac2 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.js
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.js
@@ -147,6 +147,15 @@
]
};
});
+ frm.set_query("expense_approver", function() {
+ return {
+ query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
+ filters: {
+ employee: frm.doc.employee,
+ doctype: frm.doc.doctype
+ }
+ };
+ });
},
onload: function(frm) {
@@ -163,15 +172,6 @@
}
});
}
- frm.set_query("expense_approver", function() {
- return {
- query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
- filters: {
- employee: frm.doc.employee,
- doctype: frm.doc.doctype
- }
- };
- });
},
refresh: function(frm) {
diff --git a/erpnext/hr/doctype/job_opening/job_opening.json b/erpnext/hr/doctype/job_opening/job_opening.json
index 7906439..4437e02 100644
--- a/erpnext/hr/doctype/job_opening/job_opening.json
+++ b/erpnext/hr/doctype/job_opening/job_opening.json
@@ -41,6 +41,7 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
@@ -72,6 +73,7 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
@@ -102,6 +104,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
@@ -131,6 +134,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
@@ -159,9 +163,10 @@
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
- "reqd": 0,
+ "reqd": 1,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
@@ -193,6 +198,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
@@ -224,6 +230,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
@@ -255,6 +262,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
@@ -284,6 +292,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
@@ -314,6 +323,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
@@ -345,6 +355,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 1
},
{
@@ -375,6 +386,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
}
],
@@ -389,7 +401,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2018-05-07 14:16:50.300247",
+ "modified": "2018-05-20 15:38:44.705823",
"modified_by": "Administrator",
"module": "HR",
"name": "Job Opening",
@@ -397,7 +409,6 @@
"permissions": [
{
"amend": 0,
- "apply_user_permissions": 0,
"cancel": 0,
"create": 1,
"delete": 1,
@@ -417,7 +428,6 @@
},
{
"amend": 0,
- "apply_user_permissions": 0,
"cancel": 0,
"create": 0,
"delete": 0,
diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js
index 7a6b246..0b48706 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.js
+++ b/erpnext/hr/doctype/leave_application/leave_application.js
@@ -5,6 +5,19 @@
cur_frm.add_fetch('employee','company','company');
frappe.ui.form.on("Leave Application", {
+ setup: function(frm) {
+ frm.set_query("leave_approver", function() {
+ return {
+ query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
+ filters: {
+ employee: frm.doc.employee,
+ doctype: frm.doc.doctype
+ }
+ };
+ });
+
+ frm.set_query("employee", erpnext.queries.employee);
+ },
onload: function(frm) {
if (!frm.doc.posting_date) {
frm.set_value("posting_date", frappe.datetime.get_today());
@@ -22,17 +35,6 @@
}
});
}
- frm.set_query("leave_approver", function() {
- return {
- query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
- filters: {
- employee: frm.doc.employee,
- doctype: frm.doc.doctype
- }
- };
- });
-
- frm.set_query("employee", erpnext.queries.employee);
},
validate: function(frm) {
diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py
index 26e7fce..d4e8ccd 100644
--- a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py
+++ b/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py
@@ -21,7 +21,9 @@
if joining_date and getdate(self.from_date) < joining_date:
frappe.throw(_("From Date {0} cannot be before employee's joining Date {1}")
.format(self.from_date, joining_date))
- if relieving_date and getdate(self.from_date) > relieving_date:
+
+ # flag - old_employee is for migrating the old employees data via patch
+ if relieving_date and getdate(self.from_date) > relieving_date and not self.flags.old_employee:
frappe.throw(_("From Date {0} cannot be after employee's relieving Date {1}")
.format(self.from_date, relieving_date))
@@ -29,7 +31,7 @@
if self.from_date and getdate(self.from_date) > getdate(self.to_date):
frappe.throw(_("From Date {0} cannot be after To Date {1}")
.format(self.from_date, self.to_date))
- if relieving_date and getdate(self.to_date) > relieving_date:
+ if relieving_date and getdate(self.to_date) > getdate(relieving_date) and not self.flags.old_employee:
frappe.throw(_("To Date {0} cannot be after employee's relieving Date {1}")
.format(self.to_date, relieving_date))
diff --git a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
index 8105e1a..a603015 100644
--- a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
+++ b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
@@ -39,8 +39,7 @@
data = []
for employee in active_employees:
- leave_approvers = [l.leave_approver for l in frappe.db.sql("""select leave_approver from `tabEmployee Leave Approver` where parent = %s""",
- (employee.name),as_dict=True)]
+ leave_approvers = get_approvers(employee.department)
if (len(leave_approvers) and user in leave_approvers) or (user in ["Administrator", employee.user_id]) or ("HR Manager" in frappe.get_roles(user)):
row = [employee.name, employee.employee_name, employee.department]
@@ -54,7 +53,25 @@
allocation_records_based_on_to_date.get(employee.name, frappe._dict()))
row += [leaves_taken, closing]
-
+
data.append(row)
- return data
\ No newline at end of file
+ return data
+
+def get_approvers(department):
+ if not department:
+ return []
+
+ approvers = []
+ # get current department and all its child
+ department_details = frappe.db.get_value("Department", {"name": department}, ["lft", "rgt"], as_dict=True)
+ department_list = frappe.db.sql("""select name from `tabDepartment`
+ where lft >= %s and rgt <= %s order by lft desc
+ """, (department_details.lft, department_details.rgt), as_list = True)
+
+ # retrieve approvers list from current department and from its subsequent child departments
+ for d in department_list:
+ approvers.extend([l.leave_approver for l in frappe.db.sql("""select approver from `tabDepartment Approver` \
+ where parent = %s and parentfield = 'leave_approver'""", (d), as_dict=True)])
+
+ return approvers
diff --git a/erpnext/non_profit/doctype/chapter/templates/chapter.html b/erpnext/non_profit/doctype/chapter/templates/chapter.html
index 0110950..321828f 100644
--- a/erpnext/non_profit/doctype/chapter/templates/chapter.html
+++ b/erpnext/non_profit/doctype/chapter/templates/chapter.html
@@ -2,38 +2,40 @@
{% block page_content %}
<h1>{{ title }}</h1>
-<h3>Details</h3>
<p>{{ introduction }}</p>
{% if meetup_embed_html %}
{{ meetup_embed_html }}
{% endif %}
-<h3>List of Members</h3>
+<h3>Member Details</h3>
{% if members %}
- <table class="table table-bordered small" style="max-width: 500px;">
- <tr>
- <th width="15%" ></th>
- <th>Member Details</th>
- </tr>
+ <table class="table" style="max-width: 600px;">
{% set index = [1] %}
{% for user in members %}
{% if user.enabled == 1 %}
<tr>
- <td>{{ index|length }}</td>
<td>
+ <div style="margin-bottom: 30px; max-width: 600px" class="with-border">
<div class="row">
- <div class="col-lg-6 col-md-6 col-sm-6">{{ frappe.db.get_value('User', user.user, 'full_name') }}</div>
- <div class="col-lg-6 col-md-6 col-sm-6 text-right">
+ <div class="col-lg-6 col-md-6 col-sm-6">
+ <div class="pull-left">
+ <b>{{ index|length }}. {{ frappe.db.get_value('User', user.user, 'full_name') }}</b></div>
+ </div>
+ <div class="pull-right">
{% if user.website_url %}
- <a href="{{ user.website_url }}">{{ user.website_url or '' }}</a>
+ <a href="{{ user.website_url }}">{{ user.website_url | truncate (50) or '' }}</a>
{% endif %}
</div>
+ <div class="clearfix"></div>
+ </div>
+ <br><br>
<div class="col-lg-12">
{% if user.introduction %}
{{ user.introduction }}
{% endif %}
</div>
</div>
+ </div>
</td>
</tr>
{% set __ = index.append(1) %}
@@ -45,11 +47,13 @@
{% endif %}
<h3>Chapter Head</h3>
-<table class="table table-bordered small" style="max-width: 500px;">
+<div style="margin-bottom: 30px; max-width: 600px" class="with-border">
+
+<table class="table table-bordered small" style="max-width: 600px;">
{% set doc = frappe.get_doc('Member',chapter_head) %}
<tr>
<td style='width: 15%'>Name</td>
- <td>{{ doc.member_name }}</td>
+ <td><b>{{ doc.member_name }}<b></td>
</tr>
<tr>
<td>Email</td>
@@ -60,8 +64,14 @@
<td>{{ frappe.db.get_value('User', doc.email, 'phone') or '' }}</td>
</tr>
</table>
+</div>
+
+{% if address %}
<h3>Address</h3>
-<p>{{ address }}</p>
+<div style="margin-bottom: 30px; max-width: 600px" class="with-border">
+<p>{{ address or ''}}</p>
+</div>
+{% endif %}
<p style="margin: 20px 0 30px;"><a href="/non_profit/join-chapter?name={{ name }}" class='btn btn-primary'>Join this Chapter</a></p>
<p style="margin: 20px 0 30px;"><a href="/non_profit/leave-chapter?name={{ name }}" class=''>Leave this Chapter</a></p>
diff --git a/erpnext/patches/v11_0/create_department_records_for_each_company.py b/erpnext/patches/v11_0/create_department_records_for_each_company.py
index 6f869b0..17e3ebd 100644
--- a/erpnext/patches/v11_0/create_department_records_for_each_company.py
+++ b/erpnext/patches/v11_0/create_department_records_for_each_company.py
@@ -47,6 +47,9 @@
THEN "%s"
'''%(company, department, records[department]))
+ if not when_then:
+ return
+
frappe.db.sql("""
update
`tab%s`
@@ -67,6 +70,9 @@
THEN "%s"
'''%(employee.name, department, records[department]))
+ if not when_then:
+ return
+
frappe.db.sql("""
update
`tabInstructor`
diff --git a/erpnext/patches/v11_0/create_salary_structure_assignments.py b/erpnext/patches/v11_0/create_salary_structure_assignments.py
index 289554e..24874f6 100644
--- a/erpnext/patches/v11_0/create_salary_structure_assignments.py
+++ b/erpnext/patches/v11_0/create_salary_structure_assignments.py
@@ -18,6 +18,9 @@
s.base = d.base
s.variable = d.variable
s.company = d.company
+
+ # to migrate the data of the old employees
+ s.flags.old_employee = True
s.save()
frappe.db.sql("update `tabSalary Structure` set docstatus=1")
\ No newline at end of file
diff --git a/erpnext/patches/v11_0/refactor_erpnext_shopify.py b/erpnext/patches/v11_0/refactor_erpnext_shopify.py
index c8d4de8..d344ae3 100644
--- a/erpnext/patches/v11_0/refactor_erpnext_shopify.py
+++ b/erpnext/patches/v11_0/refactor_erpnext_shopify.py
@@ -22,7 +22,7 @@
def setup_app_type():
shopify_settings = frappe.get_doc("Shopify Settings")
shopify_settings.app_type = 'Private'
- shopify_settings.update_price_in_erpnext_price_list = 0 if shopify_settings.push_prices_to_shopify else 1
+ shopify_settings.update_price_in_erpnext_price_list = 0 if getattr(shopify_settings, 'push_prices_to_shopify', None) else 1
shopify_settings.flags.ignore_mandatory = True
shopify_settings.ignore_permissions = True
shopify_settings.save()
diff --git a/erpnext/selling/report/customers_without_any_sales_transactions/__init__.py b/erpnext/selling/report/customers_without_any_sales_transactions/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/selling/report/customers_without_any_sales_transactions/__init__.py
diff --git a/erpnext/selling/report/customers_without_any_sales_transactions/customers_without_any_sales_transactions.json b/erpnext/selling/report/customers_without_any_sales_transactions/customers_without_any_sales_transactions.json
new file mode 100644
index 0000000..2a4c2ae
--- /dev/null
+++ b/erpnext/selling/report/customers_without_any_sales_transactions/customers_without_any_sales_transactions.json
@@ -0,0 +1,30 @@
+{
+ "add_total_row": 0,
+ "apply_user_permissions": 0,
+ "creation": "2018-05-17 15:25:06.015111",
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "idx": 0,
+ "is_standard": "Yes",
+ "modified": "2018-05-21 11:06:11.920622",
+ "modified_by": "Administrator",
+ "module": "Selling",
+ "name": "Customers Without Any Sales Transactions",
+ "owner": "Administrator",
+ "query": "SELECT\n\t`tabCustomer`.name as \"Customer:Link/Customer:120\",\n\t`tabCustomer`.customer_name as \"Customer Name::120\",\n\t`tabCustomer`.territory as \"Territory:Link/Territory:120\",\n\t`tabCustomer`.customer_group as \"Customer Group:Link/Customer Group:120\"\nFROM\n\t`tabCustomer`\nWHERE\n\tnot exists(select name from `tabSales Invoice` where `tabCustomer`.name = `tabSales Invoice`.customer and `tabSales Invoice`.docstatus=1 limit 1)\n\tand not exists(select name from `tabSales Order` where `tabCustomer`.name = `tabSales Order`.customer and `tabSales Order`.docstatus=1 limit 1)",
+ "ref_doctype": "Sales Invoice",
+ "report_name": "Customers Without Any Sales Transactions",
+ "report_type": "Query Report",
+ "roles": [
+ {
+ "role": "Sales User"
+ },
+ {
+ "role": "Sales Manager"
+ },
+ {
+ "role": "System Manager"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/erpnext/setup/doctype/supplier_group/test_records.json b/erpnext/setup/doctype/supplier_group/test_records.json
index 1681e2a..5848963 100644
--- a/erpnext/setup/doctype/supplier_group/test_records.json
+++ b/erpnext/setup/doctype/supplier_group/test_records.json
@@ -1,7 +1,8 @@
[
{
"doctype": "Supplier Group",
- "supplier_group_name": "_Test Supplier Group"
+ "supplier_group_name": "_Test Supplier Group",
+ "parent_supplier_group": "All Supplier Groups"
}
]
\ No newline at end of file
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index cdfbcae..59e2f58 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -216,27 +216,39 @@
$.extend(erpnext.item, {
setup_queries: function(frm) {
- frm.fields_dict["item_defaults"].grid.get_field("expense_account").get_query = function(doc) {
+ frm.fields_dict["item_defaults"].grid.get_field("expense_account").get_query = function(doc, cdt, cdn) {
+ const row = locals[cdt][cdn];
return {
query: "erpnext.controllers.queries.get_expense_account",
+ filters: { company: row.company }
}
}
- frm.fields_dict["item_defaults"].grid.get_field("income_account").get_query = function(doc) {
+ frm.fields_dict["item_defaults"].grid.get_field("income_account").get_query = function(doc, cdt, cdn) {
+ const row = locals[cdt][cdn];
return {
- query: "erpnext.controllers.queries.get_income_account"
+ query: "erpnext.controllers.queries.get_income_account",
+ filters: { company: row.company }
}
}
- frm.fields_dict["item_defaults"].grid.get_field("buying_cost_center").get_query = function(doc) {
+ frm.fields_dict["item_defaults"].grid.get_field("buying_cost_center").get_query = function(doc, cdt, cdn) {
+ const row = locals[cdt][cdn];
return {
- filters: { "is_group": 0 }
+ filters: {
+ "is_group": 0,
+ "company": row.company
+ }
}
}
- frm.fields_dict["item_defaults"].grid.get_field("selling_cost_center").get_query = function(doc) {
+ frm.fields_dict["item_defaults"].grid.get_field("selling_cost_center").get_query = function(doc, cdt, cdn) {
+ const row = locals[cdt][cdn];
return {
- filters: { "is_group": 0 }
+ filters: {
+ "is_group": 0,
+ "company": row.company
+ }
}
}
@@ -267,9 +279,13 @@
return { query: "erpnext.controllers.queries.supplier_query" }
}
- frm.fields_dict["item_defaults"].grid.get_field("default_warehouse").get_query = function(doc) {
+ frm.fields_dict["item_defaults"].grid.get_field("default_warehouse").get_query = function(doc, cdt, cdn) {
+ const row = locals[cdt][cdn];
return {
- filters: { "is_group": 0 }
+ filters: {
+ "is_group": 0,
+ "company": row.company
+ }
}
}
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 068b913..1269705 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -890,7 +890,7 @@
item_defaults = frappe.db.sql('''
select
i.item_name, i.description, i.stock_uom, i.name, i.is_stock_item, i.item_code, i.item_group,
- id.expense_account, id.buying_cost_center, id.default_warehouse, id.selling_cost_center
+ id.expense_account, id.buying_cost_center, id.default_warehouse, id.selling_cost_center, id.default_supplier
from
`tabItem` i, `tabItem Default` id
where
diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js
index 8e66b55..62ea2b6 100644
--- a/erpnext/stock/doctype/material_request/material_request.js
+++ b/erpnext/stock/doctype/material_request/material_request.js
@@ -45,6 +45,8 @@
stock_qty: item.stock_qty,
company: frm.doc.company,
conversion_rate: 1,
+ name: frm.doc.name,
+ material_request_type: frm.doc.material_request_type,
plc_conversion_rate: 1,
rate: item.rate,
conversion_factor: item.conversion_factor
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
index 1a73ae5..9289d69 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
@@ -35,6 +35,10 @@
},
+ onload_post_render: function(frm) {
+ frm.get_field("items").grid.set_multiple_add("item_code", "qty");
+ },
+
refresh: function(frm) {
if(frm.doc.company) {
frm.trigger("toggle_display_account_head");
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 849a294..4a9c029 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -566,7 +566,7 @@
item = frappe.db.sql("""select i.stock_uom, i.description, i.image, i.item_name, i.item_group,
i.has_batch_no, i.sample_quantity, i.has_serial_no,
id.expense_account, id.buying_cost_center
- from `tabItem`, `tabItem Default` id
+ from `tabItem` i, `tabItem Default` id
where i.name=%s and i.name=id.parent and id.company=%s
and i.disabled=0
and (i.end_of_life is null or i.end_of_life='0000-00-00' or i.end_of_life > %s)""",
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 562ac68..68936ac 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -210,8 +210,8 @@
warehouse = user_default_warehouse or item_defaults.get("default_warehouse") or args.warehouse
material_request_type = ''
- if args.get('doctype') == "Material Request":
- material_request_type = frappe.db.get_value('Material Request',
+ if args.get('doctype') == "Material Request" and not args.get('material_request_type'):
+ args['material_request_type'] = frappe.db.get_value('Material Request',
args.get('name'), 'material_request_type')
#Set the UOM to the Default Sales UOM or Default Purchase UOM if configured in the Item Master
@@ -219,7 +219,7 @@
if args.get('doctype') in ['Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice']:
args.uom = item.sales_uom if item.sales_uom else item.stock_uom
elif (args.get('doctype') in ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']) or \
- (args.get('doctype') == 'Material Request' and material_request_type == 'Purchase'):
+ (args.get('doctype') == 'Material Request' and args.get('material_request_type') == 'Purchase'):
args.uom = item.purchase_uom if item.purchase_uom else item.stock_uom
else:
args.uom = item.stock_uom
@@ -251,7 +251,7 @@
"net_rate": 0.0,
"net_amount": 0.0,
"discount_percentage": 0.0,
- "supplier": item.default_supplier,
+ "supplier": item_defaults.get("default_supplier"),
"update_stock": args.get("update_stock") if args.get('doctype') in ['Sales Invoice', 'Purchase Invoice'] else 0,
"delivered_by_supplier": item.delivered_by_supplier if args.get("doctype") in ["Sales Order", "Sales Invoice"] else 0,
"is_fixed_asset": item.is_fixed_asset,