Merge branch 'develop'
diff --git a/erpnext/__version__.py b/erpnext/__version__.py
index 1d65332..c8b2f49 100644
--- a/erpnext/__version__.py
+++ b/erpnext/__version__.py
@@ -1,2 +1,2 @@
from __future__ import unicode_literals
-__version__ = '5.1.2'
+__version__ = '5.1.3'
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
index dcbc605..69b0708 100755
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
@@ -38,7 +38,7 @@
"fieldtype": "Data",
"hidden": 0,
"in_list_view": 0,
- "label": "Name",
+ "label": "Supplier Name",
"oldfieldname": "supplier_name",
"oldfieldtype": "Data",
"permlevel": 0,
@@ -940,7 +940,7 @@
"icon": "icon-file-text",
"idx": 1,
"is_submittable": 1,
- "modified": "2015-06-22 07:30:06.743438",
+ "modified": "2015-07-03 03:26:32.934540",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice",
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index 045678d..70d5f4a 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -47,7 +47,7 @@
"fieldtype": "Data",
"hidden": 0,
"in_list_view": 0,
- "label": "Name",
+ "label": "Customer Name",
"oldfieldname": "customer_name",
"oldfieldtype": "Data",
"permlevel": 0,
@@ -1253,7 +1253,7 @@
"icon": "icon-file-text",
"idx": 1,
"is_submittable": 1,
- "modified": "2015-06-22 06:39:22.072544",
+ "modified": "2015-07-03 03:25:40.519956",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice",
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json
index f65ba40..8ca8ed0 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.json
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.json
@@ -53,7 +53,7 @@
"fieldtype": "Data",
"hidden": 0,
"in_list_view": 0,
- "label": "Name",
+ "label": "Supplier Name",
"permlevel": 0,
"read_only": 1
},
@@ -882,7 +882,7 @@
"icon": "icon-file-text",
"idx": 1,
"is_submittable": 1,
- "modified": "2015-06-22 07:30:36.259753",
+ "modified": "2015-07-03 03:26:43.080551",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Order",
diff --git a/erpnext/change_log/v5/v5_1_3.md b/erpnext/change_log/v5/v5_1_3.md
new file mode 100644
index 0000000..9825a10
--- /dev/null
+++ b/erpnext/change_log/v5/v5_1_3.md
@@ -0,0 +1,3 @@
+- Hide zero balance rows in batch-wise balance history report
+- Autocomplete issue fixed in Manage Variants
+- Remove user permission (Employee role) if user id is unset from Employee record
\ No newline at end of file
diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py
index 64508b8..f32aeed 100644
--- a/erpnext/config/accounts.py
+++ b/erpnext/config/accounts.py
@@ -75,6 +75,11 @@
"items": [
{
"type": "doctype",
+ "name": "Company",
+ "description": _("Company (not Customer or Supplier) master.")
+ },
+ {
+ "type": "doctype",
"name": "Fiscal Year",
"description": _("Financial / accounting year.")
},
diff --git a/erpnext/config/setup.py b/erpnext/config/setup.py
index 961e4f7..a660942 100644
--- a/erpnext/config/setup.py
+++ b/erpnext/config/setup.py
@@ -110,43 +110,7 @@
"description": _("Setup SMS gateway settings")
},
]
- },
- {
- "label": _("Masters"),
- "icon": "icon-star",
- "items": [
- {
- "type": "doctype",
- "name": "Company",
- "description": _("Company (not Customer or Supplier) master.")
- },
- {
- "type": "doctype",
- "name": "Item",
- "description": _("Item master.")
- },
- {
- "type": "doctype",
- "name": "Customer",
- "description": _("Customer master.")
- },
- {
- "type": "doctype",
- "name": "Supplier",
- "description": _("Supplier master.")
- },
- {
- "type": "doctype",
- "name": "Contact",
- "description": _("Contact master.")
- },
- {
- "type": "doctype",
- "name": "Address",
- "description": _("Address master.")
- },
- ]
- },
+ }
]
for module, label, icon in (
diff --git a/erpnext/crm/doctype/lead/lead.json b/erpnext/crm/doctype/lead/lead.json
index e095426..b2aa31a 100644
--- a/erpnext/crm/doctype/lead/lead.json
+++ b/erpnext/crm/doctype/lead/lead.json
@@ -29,7 +29,7 @@
"fieldtype": "Data",
"in_filter": 1,
"in_list_view": 0,
- "label": "Contact Name",
+ "label": "Person Name",
"oldfieldname": "lead_name",
"oldfieldtype": "Data",
"permlevel": 0,
@@ -344,7 +344,7 @@
],
"icon": "icon-user",
"idx": 1,
- "modified": "2015-04-02 15:13:02.621854",
+ "modified": "2015-07-03 03:26:18.579905",
"modified_by": "Administrator",
"module": "CRM",
"name": "Lead",
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index b2ae87b..a05e5ae 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -5,7 +5,7 @@
app_description = "Open Source Enterprise Resource Planning for Small and Midsized Organizations"
app_icon = "icon-th"
app_color = "#e74c3c"
-app_version = "5.1.2"
+app_version = "5.1.3"
error_report_email = "support@erpnext.com"
diff --git a/erpnext/hr/doctype/employee/employee.py b/erpnext/hr/doctype/employee/employee.py
index cb0ce11..a2bb10c 100644
--- a/erpnext/hr/doctype/employee/employee.py
+++ b/erpnext/hr/doctype/employee/employee.py
@@ -45,6 +45,10 @@
if self.user_id:
self.validate_for_enabled_user_id()
self.validate_duplicate_user_id()
+ else:
+ existing_user_id = frappe.db.get_value("Employee", self.name, "user_id")
+ if existing_user_id:
+ frappe.permissions.remove_user_permission("Employee", self.name, existing_user_id)
def on_update(self):
if self.user_id:
diff --git a/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py b/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
index e012d78..f53acca 100644
--- a/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
+++ b/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
@@ -75,8 +75,20 @@
filters["month"] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov",
"Dec"].index(filters["month"]) + 1
+ from frappe.model.document import Document
+ fiscal_years = frappe.get_doc("Fiscal Year",filters["fiscal_year"])
+ import datetime
+ year_start = fiscal_years.year_start_date.strftime("%Y")
+ year_end = fiscal_years.year_end_date.strftime("%Y")
+ dt_test = datetime.datetime.strptime(year_end + "-" + str(100+int(filters["month"]))[2:3] + "-01", "%Y-%m-%d")
+ date_test = datetime.date(dt_test.year, dt_test.month, dt_test.day)
+ if date_test > fiscal_years.year_end_date:
+ year_target = year_start
+ else:
+ year_target = year_end
+
from calendar import monthrange
- filters["total_days_in_month"] = monthrange(cint(filters["fiscal_year"].split("-")[-1]),
+ filters["total_days_in_month"] = monthrange(cint(year_target),
filters["month"])[1]
conditions = " and month(att_date) = %(month)s and fiscal_year = %(fiscal_year)s"
diff --git a/erpnext/patches/v5_0/item_variants.py b/erpnext/patches/v5_0/item_variants.py
index 62e9ac9..66300be 100644
--- a/erpnext/patches/v5_0/item_variants.py
+++ b/erpnext/patches/v5_0/item_variants.py
@@ -11,6 +11,9 @@
manage_variant.attributes = frappe.db.sql("select item_attribute as attribute, item_attribute_value as attribute_value \
from `tabItem Variant` where parent = %s", d.name, as_dict=1)
if manage_variant.attributes:
- manage_variant.generate_combinations()
- manage_variant.create_variants()
+ if not frappe.get_list("Item", filters={"variant_of": d.name}, limit_page_length=1):
+ frappe.db.sql("delete from `tabItem Variant` where parent=%s", d.name)
+ else:
+ manage_variant.generate_combinations()
+ manage_variant.create_variants()
frappe.delete_doc("DocType", "Item Variant")
\ No newline at end of file
diff --git a/erpnext/selling/doctype/quotation/quotation_list.js b/erpnext/selling/doctype/quotation/quotation_list.js
index add7aef..204ace1 100644
--- a/erpnext/selling/doctype/quotation/quotation_list.js
+++ b/erpnext/selling/doctype/quotation/quotation_list.js
@@ -2,7 +2,9 @@
add_fields: ["customer_name", "base_grand_total", "status",
"company", "currency"],
get_indicator: function(doc) {
- if(doc.status==="Ordered") {
+ if(doc.status==="Submitted") {
+ return [__("Submitted"), "blue", "status,=,Submitted"];
+ } else if(doc.status==="Ordered") {
return [__("Ordered"), "green", "status,=,Ordered"];
} else if(doc.status==="Lost") {
return [__("Lost"), "darkgrey", "status,=,Lost"];
diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json
index 59f54fb..28f98e4 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.json
+++ b/erpnext/selling/doctype/sales_order/sales_order.json
@@ -52,7 +52,7 @@
"fieldname": "customer_name",
"fieldtype": "Data",
"hidden": 0,
- "label": "Name",
+ "label": "Customer Name",
"permlevel": 0,
"read_only": 1
},
@@ -1089,7 +1089,7 @@
"idx": 1,
"is_submittable": 1,
"issingle": 0,
- "modified": "2015-06-22 07:29:24.379272",
+ "modified": "2015-07-03 03:25:20.180721",
"modified_by": "Administrator",
"module": "Selling",
"name": "Sales Order",
diff --git a/erpnext/stock/doctype/item_attribute/item_attribute.py b/erpnext/stock/doctype/item_attribute/item_attribute.py
index d7c33a5..171e118 100644
--- a/erpnext/stock/doctype/item_attribute/item_attribute.py
+++ b/erpnext/stock/doctype/item_attribute/item_attribute.py
@@ -8,8 +8,14 @@
class ItemAttribute(Document):
def validate(self):
+ self.validate_duplication()
+ self.validate_attribute_values()
+
+
+ def validate_duplication(self):
values, abbrs = [], []
for d in self.item_attribute_values:
+ d.abbr = d.abbr.upper()
if d.attribute_value in values:
frappe.throw(_("{0} must appear only once").format(d.attribute_value))
values.append(d.attribute_value)
@@ -17,3 +23,14 @@
if d.abbr in abbrs:
frappe.throw(_("{0} must appear only once").format(d.abbr))
abbrs.append(d.abbr)
+
+ def validate_attribute_values(self):
+ attribute_values = []
+ for d in self.item_attribute_values:
+ attribute_values.append(d.attribute_value)
+
+ variant_attributes = frappe.db.sql("select DISTINCT attribute_value from `tabVariant Attribute` where attribute=%s", self.name)
+ if variant_attributes:
+ for d in variant_attributes:
+ if d[0] not in attribute_values:
+ frappe.throw(_("Attribute Value {0} cannot be removed from {1} as Item Variants exist with this Attribute.").format(d[0], self.name))
diff --git a/erpnext/stock/doctype/manage_variants/manage_variants.js b/erpnext/stock/doctype/manage_variants/manage_variants.js
index ba5c46e..e8b7ade 100644
--- a/erpnext/stock/doctype/manage_variants/manage_variants.js
+++ b/erpnext/stock/doctype/manage_variants/manage_variants.js
@@ -3,7 +3,7 @@
frappe.ui.form.on("Manage Variants", {
onload: function(frm) {
- var df = frappe.meta.get_docfield("Variant Attribute", "attribute_value");
+ var df = frappe.meta.get_docfield("Variant Attribute", "attribute_value", "Manage Variants");
df.on_make = function(field) {
$(field.input_area).addClass("ui-front");
field.$input.autocomplete({
diff --git a/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py b/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
index 69e1321..9cba203 100644
--- a/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
+++ b/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
@@ -20,10 +20,11 @@
for wh in sorted(iwb_map[item]):
for batch in sorted(iwb_map[item][wh]):
qty_dict = iwb_map[item][wh][batch]
- data.append([item, item_map[item]["item_name"], item_map[item]["description"], wh, batch,
- flt(qty_dict.opening_qty, float_precision), flt(qty_dict.in_qty, float_precision),
- flt(qty_dict.out_qty, float_precision), flt(qty_dict.bal_qty, float_precision)
- ])
+ if qty_dict.opening_qty or qty_dict.in_qty or qty_dict.out_qty or qty_dict.bal_qty:
+ data.append([item, item_map[item]["item_name"], item_map[item]["description"], wh, batch,
+ flt(qty_dict.opening_qty, float_precision), flt(qty_dict.in_qty, float_precision),
+ flt(qty_dict.out_qty, float_precision), flt(qty_dict.bal_qty, float_precision)
+ ])
return columns, data
diff --git a/erpnext/templates/print_formats/includes/item_table_description.html b/erpnext/templates/print_formats/includes/item_table_description.html
index f259626..ece5386 100644
--- a/erpnext/templates/print_formats/includes/item_table_description.html
+++ b/erpnext/templates/print_formats/includes/item_table_description.html
@@ -1,6 +1,7 @@
{% if doc.in_format_data("image") and doc.get("image") and not doc.is_print_hide("image")-%}
<div class="pull-left" style="max-width: 38.2%; margin-right: 10px;">
- <img src="{{ doc.image }}" style="max-width: 100%">
+ <!-- width: 100% is a mozilla bug -->
+ <img src="{{ doc.image }}" class="img-responsive" style="width: 100%;">
</div>
{%- endif %}
<div>
@@ -8,14 +9,14 @@
<div class="primary">{{ doc.item_code }}</div>
{%- endif %}
{% if (doc.in_format_data("item_name") and not doc.is_print_hide("item_name") and
- (not doc.in_format_data("item_code") or doc.is_print_hide("item_code")
+ (not doc.in_format_data("item_code") or doc.is_print_hide("item_code")
or doc.item_code != doc.item_name)) -%}
<div class="primary">{{ doc.get_formatted("item_name") }}</div>
{%- endif %}
{% if (doc.in_format_data("description") and doc.description and
(
(
- (not doc.in_format_data("item_code") or doc.is_print_hide("item_code")) and
+ (not doc.in_format_data("item_code") or doc.is_print_hide("item_code")) and
(not doc.in_format_data("item_name") or doc.is_print_hide("item_name"))
) or not (doc.item_code == doc.item_name == doc.description)
))
diff --git a/setup.py b/setup.py
index 8820356..a0e3f14 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,6 @@
from setuptools import setup, find_packages
-version = "5.1.2"
+version = "5.1.3"
with open("requirements.txt", "r") as f:
install_requires = f.readlines()