Merge pull request #5196 from nabinhait/report_fix34
[fix] Fixed pending so items for material request report
diff --git a/.travis.yml b/.travis.yml
index 12a73c9..966dfd3 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -16,7 +16,7 @@
- sudo bash setup_frappe.sh --skip-setup-bench --mysql-root-password travis
- sudo pip install --upgrade pip
- rm $TRAVIS_BUILD_DIR/.git/shallow
- - cd ~/ && bench init frappe-bench --frappe-path https://github.com/frappe/frappe.git --frappe-branch develop
+ - bash $TRAVIS_BUILD_DIR/travis/bench_init.sh
- cp -r $TRAVIS_BUILD_DIR/test_sites/test_site ~/frappe-bench/sites/
script:
diff --git a/ci/fix-mariadb.sh b/ci/fix-mariadb.sh
deleted file mode 100755
index 886ec5e..0000000
--- a/ci/fix-mariadb.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
-# stolen from http://cgit.drupalcode.org/octopus/commit/?id=db4f837
-includedir=`mysql_config --variable=pkgincludedir`
-thiscwd=`pwd`
-_THIS_DB_VERSION=`mysql -V 2>&1 | tr -d "\n" | cut -d" " -f6 | awk '{ print $1}' | cut -d"-" -f1 | awk '{ print $1}' | sed "s/[\,']//g"`
-if [ "$_THIS_DB_VERSION" = "5.5.40" ] && [ ! -e "$includedir-$_THIS_DB_VERSION-fixed.log" ] ; then
- cd $includedir
- sudo patch -p1 < $thiscwd/ci/my_config.h.patch &> /dev/null
- sudo touch $includedir-$_THIS_DB_VERSION-fixed.log
-fi
diff --git a/ci/my_config.h.patch b/ci/my_config.h.patch
deleted file mode 100644
index 5247b5b..0000000
--- a/ci/my_config.h.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff -burp a/my_config.h b/my_config.h
---- a/my_config.h 2014-10-09 19:32:46.000000000 -0400
-+++ b/my_config.h 2014-10-09 19:35:12.000000000 -0400
-@@ -641,17 +641,4 @@
- #define SIZEOF_TIME_T 8
- /* #undef TIME_T_UNSIGNED */
-
--/*
-- stat structure (from <sys/stat.h>) is conditionally defined
-- to have different layout and size depending on the defined macros.
-- The correct macro is defined in my_config.h, which means it MUST be
-- included first (or at least before <features.h> - so, practically,
-- before including any system headers).
--
-- __GLIBC__ is defined in <features.h>
--*/
--#ifdef __GLIBC__
--#error <my_config.h> MUST be included first!
--#endif
--
- #endif
-
diff --git a/erpnext/__version__.py b/erpnext/__version__.py
index 9ebc832..38183fb 100644
--- a/erpnext/__version__.py
+++ b/erpnext/__version__.py
@@ -1,2 +1,2 @@
from __future__ import unicode_literals
-__version__ = '6.27.5'
+__version__ = '6.27.7'
diff --git a/erpnext/accounts/doctype/payment_request/payment_request.json b/erpnext/accounts/doctype/payment_request/payment_request.json
index e916034..74a18fc 100644
--- a/erpnext/accounts/doctype/payment_request/payment_request.json
+++ b/erpnext/accounts/doctype/payment_request/payment_request.json
@@ -598,13 +598,13 @@
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
- "in_create": 0,
+ "in_create": 1,
"in_dialog": 0,
"is_submittable": 1,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2016-02-24 16:49:46.832403",
+ "modified": "2016-04-12 15:26:22.756129",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Request",
@@ -675,5 +675,6 @@
"read_only": 0,
"read_only_onload": 0,
"sort_field": "modified",
- "sort_order": "DESC"
+ "sort_order": "DESC",
+ "track_seen": 0
}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.js b/erpnext/accounts/doctype/tax_rule/tax_rule.js
index 4c35370..935ea62 100644
--- a/erpnext/accounts/doctype/tax_rule/tax_rule.js
+++ b/erpnext/accounts/doctype/tax_rule/tax_rule.js
@@ -19,19 +19,6 @@
frappe.ui.form.trigger("Tax Rule", "tax_type");
})
-frappe.ui.form.on("Tax Rule", "use_for_shopping_cart", function(frm) {
- if(!frm.doc.use_for_shopping_cart &&
- (frappe.get_list("Tax Rule", {"use_for_shopping_cart":1}).length == 0)) {
- frappe.model.get_value("Shopping Cart Settings", "Shopping Cart Settings",
- "enabled", function(docfield) {
- if(docfield.enabled){
- frm.set_value("use_for_shopping_cart", 1);
- frappe.throw(__("Shopping Cart is enabled"));
- }
- });
- }
-})
-
frappe.ui.form.on("Tax Rule", "customer", function(frm) {
frappe.call({
method:"erpnext.accounts.doctype.tax_rule.tax_rule.get_party_details",
@@ -64,4 +51,4 @@
}
}
});
-});
\ No newline at end of file
+});
diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.py b/erpnext/accounts/doctype/tax_rule/tax_rule.py
index 7b62082..ce20d3a 100644
--- a/erpnext/accounts/doctype/tax_rule/tax_rule.py
+++ b/erpnext/accounts/doctype/tax_rule/tax_rule.py
@@ -6,7 +6,7 @@
import frappe
from frappe import _
from frappe.model.document import Document
-from frappe.utils import cstr
+from frappe.utils import cstr, cint
class IncorrectCustomerGroup(frappe.ValidationError): pass
class IncorrectSupplierType(frappe.ValidationError): pass
@@ -20,15 +20,16 @@
self.validate_tax_template()
self.validate_date()
self.validate_filters()
+ self.validate_use_for_shopping_cart()
def validate_tax_template(self):
if self.tax_type== "Sales":
- self.purchase_tax_template = self.supplier = self.supplier_type= None
+ self.purchase_tax_template = self.supplier = self.supplier_type = None
if self.customer:
self.customer_group = None
else:
- self.sales_tax_template= self.customer = self.customer_group= None
+ self.sales_tax_template = self.customer = self.customer_group = None
if self.supplier:
self.supplier_type = None
@@ -81,6 +82,15 @@
if tax_rule[0].priority == self.priority:
frappe.throw(_("Tax Rule Conflicts with {0}".format(tax_rule[0].name)), ConflictingTaxRule)
+ def validate_use_for_shopping_cart(self):
+ '''If shopping cart is enabled and no tax rule exists for shopping cart, enable this one'''
+ if (not self.use_for_shopping_cart
+ and cint(frappe.db.get_single_value('Shopping Cart Settings', 'enabled'))
+ and not frappe.db.get_value('Tax Rule', {'use_for_shopping_cart': 1, 'name': ['!=', self.name]})):
+
+ self.use_for_shopping_cart = 1
+ frappe.msgprint(_("Enabling 'Use for Shopping Cart', as Shopping Cart is enabled and there should be at least one Tax Rule for Shopping Cart"))
+
@frappe.whitelist()
def get_party_details(party, party_type, args=None):
out = {}
@@ -109,11 +119,11 @@
def get_tax_template(posting_date, args):
"""Get matching tax rule"""
args = frappe._dict(args)
- conditions = ["""(from_date is null or from_date = '' or from_date <= '{0}')
+ conditions = ["""(from_date is null or from_date = '' or from_date <= '{0}')
and (to_date is null or to_date = '' or to_date >= '{0}')""".format(posting_date)]
for key, value in args.iteritems():
- if key in "use_for_shopping_cart":
+ if key=="use_for_shopping_cart":
conditions.append("use_for_shopping_cart = {0}".format(1 if value else 0))
else:
conditions.append("ifnull({0}, '') in ('', '{1}')".format(key, frappe.db.escape(cstr(value))))
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html
index 69c88ed..712d35b 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html
@@ -37,9 +37,12 @@
<br>{%= data[i][__("Voucher No")] %}</td>
<td>{%= data[i][__("Customer Name")] || data[i][__("Customer")] || data[i][__("Supplier Name")] || data[i][__("Supplier")] %}
<br>{%= __("Remarks") %}: {%= data[i][__("Remarks")] %}</td>
- <td style="text-align: right">{%= format_currency(data[i][__("Invoiced Amount")]) %}</td>
- <td style="text-align: right">{%= format_currency(data[i][__("Paid Amount")]) %}</td>
- <td style="text-align: right">{%= format_currency(data[i][__("Outstanding Amount")]) %}</td>
+ <td style="text-align: right">
+ {%= format_currency(data[i][__("Invoiced Amount")], data[i]["currency"]) %}</td>
+ <td style="text-align: right">
+ {%= format_currency(data[i][__("Paid Amount")], data[i]["currency"]) %}</td>
+ <td style="text-align: right">
+ {%= format_currency(data[i][__("Outstanding Amount")], data[i]["currency"]) %}</td>
{% } else { %}
<td></td>
<td></td>
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index 39fe5c4..365212a 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -58,21 +58,19 @@
"width": 120
})
+ columns.append({
+ "fieldname": "currency",
+ "label": _("Currency"),
+ "fieldtype": "Data",
+ "width": 100
+ })
if args.get("party_type") == "Customer":
columns += [_("Territory") + ":Link/Territory:80"]
if args.get("party_type") == "Supplier":
columns += [_("Supplier Type") + ":Link/Supplier Type:80"]
- columns += [
- {
- "fieldname": "currency",
- "label": _("Currency"),
- "fieldtype": "Data",
- "width": 100,
- "hidden": 1
- },
- _("Remarks") + "::200"
- ]
-
+
+ columns.append(_("Remarks") + "::200")
+
return columns
def get_data(self, party_naming_by, args):
@@ -120,17 +118,17 @@
row += get_ageing_data(cint(self.filters.range1), cint(self.filters.range2),
cint(self.filters.range3), self.age_as_on, entry_date, outstanding_amount)
+ if self.filters.get(scrub(args.get("party_type"))):
+ row.append(gle.account_currency)
+ else:
+ row.append(company_currency)
+
# customer territory / supplier type
if args.get("party_type") == "Customer":
row += [self.get_territory(gle.party)]
if args.get("party_type") == "Supplier":
row += [self.get_supplier_type(gle.party)]
- if self.filters.get(scrub(args.get("party_type"))):
- row.append(gle.account_currency)
- else:
- row.append(company_currency)
-
row.append(gle.remarks)
data.append(row)
diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
index 60eade4..36e9734 100644
--- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
+++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
@@ -18,18 +18,25 @@
columns += [ args.get("party_type") + " Name::140"]
columns += [
- _("Total Invoiced Amt") + ":Currency:140",
- _("Total Paid Amt") + ":Currency:140",
- _("Total Outstanding Amt") + ":Currency:160",
- "0-" + str(self.filters.range1) + ":Currency:100",
- str(self.filters.range1) + "-" + str(self.filters.range2) + ":Currency:100",
- str(self.filters.range2) + "-" + str(self.filters.range3) + ":Currency:100",
- str(self.filters.range3) + _("-Above") + ":Currency:100"]
+ _("Total Invoiced Amt") + ":Currency/currency:140",
+ _("Total Paid Amt") + ":Currency/currency:140",
+ _("Total Outstanding Amt") + ":Currency/currency:160",
+ "0-" + str(self.filters.range1) + ":Currency/currency:100",
+ str(self.filters.range1) + "-" + str(self.filters.range2) + ":Currency/currency:100",
+ str(self.filters.range2) + "-" + str(self.filters.range3) + ":Currency/currency:100",
+ str(self.filters.range3) + _("-Above") + ":Currency/currency:100"]
if args.get("party_type") == "Customer":
columns += [_("Territory") + ":Link/Territory:80"]
if args.get("party_type") == "Supplier":
columns += [_("Supplier Type") + ":Link/Supplier Type:80"]
+
+ columns.append({
+ "fieldname": "currency",
+ "label": _("Currency"),
+ "fieldtype": "Data",
+ "width": 80
+ })
return columns
@@ -53,6 +60,8 @@
row += [self.get_territory(party)]
if args.get("party_type") == "Supplier":
row += [self.get_supplier_type(party)]
+
+ row.append(party_dict.currency)
data.append(row)
return data
@@ -73,6 +82,8 @@
)
for k in party_total[d.party].keys():
party_total[d.party][k] += d.get(k, 0)
+
+ party_total[d.party].currency = d.currency
return party_total
@@ -90,7 +101,7 @@
cols += ["bill_no", "bill_date"]
cols += ["invoiced_amt", "paid_amt",
- "outstanding_amt", "age", "range1", "range2", "range3", "range4"]
+ "outstanding_amt", "age", "range1", "range2", "range3", "range4", "currency"]
if args.get("party_type") == "Supplier":
cols += ["supplier_type", "remarks"]
diff --git a/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.json b/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.json
index 897dec5..691a5c3 100644
--- a/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.json
+++ b/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.json
@@ -7,12 +7,12 @@
"doctype": "Report",
"idx": 1,
"is_standard": "Yes",
- "modified": "2016-04-01 08:27:10.765516",
+ "modified": "2016-04-04 17:27:19.104519",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Delivered Items To Be Billed",
"owner": "Administrator",
- "query": "select\n `tabDelivery Note`.`name` as \"Delivery Note:Link/Delivery Note:120\",\n\t`tabDelivery Note`.`customer` as \"Customer:Link/Customer:120\",\n\t`tabDelivery Note`.`posting_date` as \"Date:Date\",\n\t`tabDelivery Note`.`project` as \"Project\",\n\t`tabDelivery Note Item`.`item_code` as \"Item:Link/Item:120\",\n\t(`tabDelivery Note Item`.`qty` - ifnull((select sum(qty) from `tabSales Invoice Item` \n\t where `tabSales Invoice Item`.docstatus=1 and \n `tabSales Invoice Item`.delivery_note = `tabDelivery Note`.name and\n\t `tabSales Invoice Item`.dn_detail = `tabDelivery Note Item`.name), 0))\n\t\tas \"Qty:Float:110\",\n\t(`tabDelivery Note Item`.`base_amount` - ifnull((select sum(base_amount) from `tabSales Invoice Item` \n where `tabSales Invoice Item`.docstatus=1 and \n `tabSales Invoice Item`.delivery_note = `tabDelivery Note`.name and\n `tabSales Invoice Item`.dn_detail = `tabDelivery Note Item`.name), 0))\n\t\tas \"Amount:Currency:110\",\n\t`tabDelivery Note Item`.`item_name` as \"Item Name::150\",\n\t`tabDelivery Note Item`.`description` as \"Description::200\",\n\t`tabDelivery Note`.`company` as \"Company:Link/Company:\"\nfrom `tabDelivery Note`, `tabDelivery Note Item`\nwhere\n `tabDelivery Note`.docstatus = 1 and\n\t`tabDelivery Note`.`status` not in (\"Stopped\", \"Closed\") and\n `tabDelivery Note`.name = `tabDelivery Note Item`.parent and\n (`tabDelivery Note Item`.qty > ifnull((select sum(qty) from `tabSales Invoice Item` \n where `tabSales Invoice Item`.docstatus=1 and \n `tabSales Invoice Item`.delivery_note = `tabDelivery Note`.name and\n `tabSales Invoice Item`.dn_detail = `tabDelivery Note Item`.name), 0))\norder by `tabDelivery Note`.`name` desc",
+ "query": "select\n `tabDelivery Note`.`name` as \"Delivery Note:Link/Delivery Note:120\",\n\t`tabDelivery Note`.`customer` as \"Customer:Link/Customer:120\",\n\t`tabDelivery Note`.`posting_date` as \"Date:Date\",\n\t`tabDelivery Note`.`project` as \"Project\",\n\t`tabDelivery Note Item`.`item_code` as \"Item:Link/Item:120\",\n\t`tabDelivery Note Item`.`billed_amt` as \"Pending Amount:Currency:110\",\n\t`tabDelivery Note Item`.`item_name` as \"Item Name::150\",\n\t`tabDelivery Note Item`.`description` as \"Description::200\",\n\t`tabDelivery Note`.`company` as \"Company:Link/Company:\"\nfrom `tabDelivery Note`, `tabDelivery Note Item`\nwhere\n `tabDelivery Note`.docstatus = 1 and\n\t`tabDelivery Note`.`status` not in (\"Stopped\", \"Closed\") and\n `tabDelivery Note`.name = `tabDelivery Note Item`.parent and\n `tabDelivery Note`.per_billed < 100\norder by `tabDelivery Note`.`name` desc",
"ref_doctype": "Sales Invoice",
"report_name": "Delivered Items To Be Billed",
"report_type": "Query Report"
diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py
index ba87cf1..4ae0e67 100644
--- a/erpnext/accounts/report/gross_profit/gross_profit.py
+++ b/erpnext/accounts/report/gross_profit/gross_profit.py
@@ -145,11 +145,11 @@
self.data.append(row)
if self.grouped:
- self.collapse_group()
+ self.get_average_rate_based_on_group_by()
else:
self.grouped_data = []
- def collapse_group(self):
+ def get_average_rate_based_on_group_by(self):
# sum buying / selling totals for group
self.grouped_data = []
for key in self.grouped.keys():
@@ -166,6 +166,8 @@
if new_row.base_amount else 0
new_row.buying_rate = (new_row.buying_amount / new_row.qty) \
if new_row.qty else 0
+ new_row.base_rate = (new_row.base_amount / new_row.qty) \
+ if new_row.qty else 0
self.grouped_data.append(new_row)
diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
index 7be5649..f1e706e 100644
--- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
+++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
@@ -16,6 +16,14 @@
if item_list:
item_tax, tax_accounts = get_tax_accounts(item_list, columns)
+ columns.append({
+ "fieldname": "currency",
+ "label": _("Currency"),
+ "fieldtype": "Data",
+ "width": 80
+ })
+ company_currency = frappe.db.get_value("Company", filters.company, "default_currency")
+ print company_currency
data = []
for d in item_list:
purchase_receipt = None
@@ -34,7 +42,7 @@
row.append(item_tax.get(d.parent, {}).get(d.item_code, {}).get(tax, 0))
total_tax = sum(row[last_col:])
- row += [total_tax, d.base_net_amount + total_tax]
+ row += [total_tax, d.base_net_amount + total_tax, company_currency]
data.append(row)
@@ -48,7 +56,8 @@
"Supplier Name::120", "Payable Account:Link/Account:120", _("Project") + ":Link/Project:80",
_("Company") + ":Link/Company:100", _("Purchase Order") + ":Link/Purchase Order:100",
_("Purchase Receipt") + ":Link/Purchase Receipt:100", _("Expense Account") + ":Link/Account:140",
- _("Qty") + ":Float:120", _("Rate") + ":Currency:120", _("Amount") + ":Currency:120"]
+ _("Qty") + ":Float:120", _("Rate") + ":Currency/currency:120", _("Amount") + ":Currency/currency:120"
+ ]
def get_conditions(filters):
conditions = ""
@@ -110,7 +119,7 @@
(tax_amount * d.base_net_amount) / d.base_net_total
tax_accounts.sort()
- columns += [account_head + ":Currency:80" for account_head in tax_accounts]
- columns += ["Total Tax:Currency:80", "Total:Currency:80"]
+ columns += [account_head + ":Currency/currency:80" for account_head in tax_accounts]
+ columns += ["Total Tax:Currency/currency:80", "Total:Currency/currency:80"]
return item_tax, tax_accounts
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 e3c4753..2401202 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
@@ -14,7 +14,14 @@
item_list = get_items(filters)
if item_list:
item_tax, tax_accounts = get_tax_accounts(item_list, columns)
-
+ columns.append({
+ "fieldname": "currency",
+ "label": _("Currency"),
+ "fieldtype": "Data",
+ "width": 80
+ })
+ company_currency = frappe.db.get_value("Company", filters.company, "default_currency")
+
data = []
for d in item_list:
delivery_note = None
@@ -32,7 +39,7 @@
row.append(item_tax.get(d.parent, {}).get(d.item_code, {}).get(tax, 0))
total_tax = sum(row[last_col:])
- row += [total_tax, d.base_net_amount + total_tax]
+ row += [total_tax, d.base_net_amount + total_tax, company_currency]
data.append(row)
@@ -48,7 +55,7 @@
_("Project") + ":Link/Project:80", _("Company") + ":Link/Company:100",
_("Sales Order") + ":Link/Sales Order:100", _("Delivery Note") + ":Link/Delivery Note:100",
_("Income Account") + ":Link/Account:140", _("Qty") + ":Float:120",
- _("Rate") + ":Currency:120", _("Amount") + ":Currency:120"
+ _("Rate") + ":Currency/currency:120", _("Amount") + ":Currency/currency:120"
]
def get_conditions(filters):
@@ -108,7 +115,7 @@
flt((tax_amount * d.base_net_amount) / d.base_net_total)
tax_accounts.sort()
- columns += [account_head + ":Currency:80" for account_head in tax_accounts]
- columns += ["Total Tax:Currency:80", "Total:Currency:80"]
+ columns += [account_head + ":Currency/currency:80" for account_head in tax_accounts]
+ columns += ["Total Tax:Currency/currency:80", "Total:Currency/currency:80"]
return item_tax, tax_accounts
diff --git a/erpnext/accounts/report/purchase_register/purchase_register.py b/erpnext/accounts/report/purchase_register/purchase_register.py
index c869803..7934bf2 100644
--- a/erpnext/accounts/report/purchase_register/purchase_register.py
+++ b/erpnext/accounts/report/purchase_register/purchase_register.py
@@ -21,6 +21,8 @@
invoice_expense_map, expense_accounts)
invoice_po_pr_map = get_invoice_po_pr_map(invoice_list)
supplier_details = get_supplier_deatils(invoice_list)
+
+ company_currency = frappe.db.get_value("Company", filters.company, "default_currency")
data = []
for inv in invoice_list:
@@ -32,7 +34,7 @@
row = [inv.name, inv.posting_date, inv.supplier, inv.supplier_name,
supplier_details.get(inv.supplier),
inv.credit_to, ", ".join(project), inv.bill_no, inv.bill_date, inv.remarks,
- ", ".join(purchase_order), ", ".join(purchase_receipt)]
+ ", ".join(purchase_order), ", ".join(purchase_receipt), company_currency]
# map expense values
base_net_total = 0
@@ -62,10 +64,19 @@
def get_columns(invoice_list):
"""return columns based on filters"""
columns = [
- _("Invoice") + ":Link/Purchase Invoice:120", _("Posting Date") + ":Date:80", _("Supplier Id") + "::120",
- _("Supplier Name") + "::120", _("Supplier Type") + ":Link/Supplier Type:120", _("Payable Account") + ":Link/Account:120",
- _("Project") + ":Link/Project:80", _("Bill No") + "::120", _("Bill Date") + ":Date:80", _("Remarks") + "::150",
- _("Purchase Order") + ":Link/Purchase Order:100", _("Purchase Receipt") + ":Link/Purchase Receipt:100"
+ _("Invoice") + ":Link/Purchase Invoice:120",
+ _("Posting Date") + ":Date:80", _("Supplier Id") + "::120",
+ _("Supplier Name") + "::120", _("Supplier Type") + ":Link/Supplier Type:120",
+ _("Payable Account") + ":Link/Account:120", _("Project") + ":Link/Project:80",
+ _("Bill No") + "::120", _("Bill Date") + ":Date:80", _("Remarks") + "::150",
+ _("Purchase Order") + ":Link/Purchase Order:100",
+ _("Purchase Receipt") + ":Link/Purchase Receipt:100",
+ {
+ "fieldname": "currency",
+ "label": _("Currency"),
+ "fieldtype": "Data",
+ "width": 80
+ }
]
expense_accounts = tax_accounts = expense_columns = tax_columns = []
@@ -84,14 +95,14 @@
', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]))
- expense_columns = [(account + ":Currency:120") for account in expense_accounts]
+ expense_columns = [(account + ":Currency/currency:120") for account in expense_accounts]
for account in tax_accounts:
if account not in expense_accounts:
- tax_columns.append(account + ":Currency:120")
+ tax_columns.append(account + ":Currency/currency:120")
- columns = columns + expense_columns + [_("Net Total") + ":Currency:120"] + tax_columns + \
- [_("Total Tax") + ":Currency:120", _("Grand Total") + ":Currency:120",
- _("Rounded Total") + ":Currency:120", _("Outstanding Amount") + ":Currency:120"]
+ columns = columns + expense_columns + [_("Net Total") + ":Currency/currency:120"] + tax_columns + \
+ [_("Total Tax") + ":Currency/currency:120", _("Grand Total") + ":Currency/currency:120",
+ _("Rounded Total") + ":Currency/currency:120", _("Outstanding Amount") + ":Currency/currency:120"]
return columns, expense_accounts, tax_accounts
diff --git a/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.json b/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.json
index e803a91..c38a7bb 100644
--- a/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.json
+++ b/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.json
@@ -7,12 +7,12 @@
"doctype": "Report",
"idx": 1,
"is_standard": "Yes",
- "modified": "2016-04-01 08:27:07.033939",
+ "modified": "2016-04-04 17:27:29.449124",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Received Items To Be Billed",
"owner": "Administrator",
- "query": "select\n `tabPurchase Receipt`.`name` as \"Purchase Receipt:Link/Purchase Receipt:120\",\n `tabPurchase Receipt`.`supplier` as \"Supplier:Link/Supplier:120\",\n\t`tabPurchase Receipt`.`posting_date` as \"Date:Date\",\n\t`tabPurchase Receipt Item`.`project` as \"Project\",\n\t`tabPurchase Receipt Item`.`item_code` as \"Item:Link/Item:120\",\n\t(`tabPurchase Receipt Item`.`qty` - ifnull((select sum(qty) from `tabPurchase Invoice Item` \n\t where `tabPurchase Invoice Item`.purchase_receipt = `tabPurchase Receipt`.name and\n `tabPurchase Invoice Item`.docstatus = 1 and\n\t `tabPurchase Invoice Item`.pr_detail = `tabPurchase Receipt Item`.name), 0))\n\t as \"Qty:Float:110\",\n\t(`tabPurchase Receipt Item`.`base_amount` - ifnull((select sum(base_amount) \n from `tabPurchase Invoice Item` \n where `tabPurchase Invoice Item`.purchase_receipt = `tabPurchase Receipt`.name and\n `tabPurchase Invoice Item`.docstatus = 1 and\n `tabPurchase Invoice Item`.pr_detail = `tabPurchase Receipt Item`.name), 0))\n\t as \"Amount:Currency:110\",\n\t`tabPurchase Receipt Item`.`item_name` as \"Item Name::150\",\n\t`tabPurchase Receipt Item`.`description` as \"Description::200\",\n\t`tabPurchase Receipt`.`company` as \"Company:Link/Company:\"\nfrom `tabPurchase Receipt`, `tabPurchase Receipt Item`\nwhere\n `tabPurchase Receipt`.docstatus = 1 and `tabPurchase Receipt`.status != \"Closed\" and \n `tabPurchase Receipt`.name = `tabPurchase Receipt Item`.parent and\n (`tabPurchase Receipt Item`.qty > ifnull((select sum(qty) from `tabPurchase Invoice Item` \n where `tabPurchase Invoice Item`.purchase_receipt = `tabPurchase Receipt`.name and\n `tabPurchase Invoice Item`.docstatus=1 and \n `tabPurchase Invoice Item`.pr_detail = `tabPurchase Receipt Item`.name), 0))\norder by `tabPurchase Receipt`.`name` desc",
+ "query": "select\n `tabPurchase Receipt`.`name` as \"Purchase Receipt:Link/Purchase Receipt:120\",\n `tabPurchase Receipt`.`supplier` as \"Supplier:Link/Supplier:120\",\n\t`tabPurchase Receipt`.`posting_date` as \"Date:Date\",\n\t`tabPurchase Receipt Item`.`project` as \"Project\",\n\t`tabPurchase Receipt Item`.`item_code` as \"Item:Link/Item:120\",\n\t`tabPurchase Receipt Item`.`billed_amt` as \"Pending Amount:Currency:110\",\n\t`tabPurchase Receipt Item`.`item_name` as \"Item Name::150\",\n\t`tabPurchase Receipt Item`.`description` as \"Description::200\",\n\t`tabPurchase Receipt`.`company` as \"Company:Link/Company:\"\nfrom `tabPurchase Receipt`, `tabPurchase Receipt Item`\nwhere\n `tabPurchase Receipt`.docstatus = 1 and `tabPurchase Receipt`.status != \"Closed\" and \n `tabPurchase Receipt`.name = `tabPurchase Receipt Item`.parent and\n `tabPurchase Receipt`.per_billed < 100\norder by `tabPurchase Receipt`.`name` desc",
"ref_doctype": "Purchase Invoice",
"report_name": "Received Items To Be Billed",
"report_type": "Query Report"
diff --git a/erpnext/accounts/report/sales_register/sales_register.py b/erpnext/accounts/report/sales_register/sales_register.py
index f68adad..d09cfc1 100644
--- a/erpnext/accounts/report/sales_register/sales_register.py
+++ b/erpnext/accounts/report/sales_register/sales_register.py
@@ -22,6 +22,7 @@
invoice_so_dn_map = get_invoice_so_dn_map(invoice_list)
customer_map = get_customer_deatils(invoice_list)
+ company_currency = frappe.db.get_value("Company", filters.company, "default_currency")
data = []
for inv in invoice_list:
@@ -32,7 +33,8 @@
row = [inv.name, inv.posting_date, inv.customer, inv.customer_name,
customer_map.get(inv.customer, {}).get("customer_group"),
customer_map.get(inv.customer, {}).get("territory"),
- inv.debit_to, inv.project, inv.remarks, ", ".join(sales_order), ", ".join(delivery_note)]
+ inv.debit_to, inv.project, inv.remarks,
+ ", ".join(sales_order), ", ".join(delivery_note), company_currency]
# map income values
base_net_total = 0
@@ -66,7 +68,13 @@
_("Invoice") + ":Link/Sales Invoice:120", _("Posting Date") + ":Date:80", _("Customer Id") + "::120",
_("Customer Name") + "::120", _("Customer Group") + ":Link/Customer Group:120", _("Territory") + ":Link/Territory:80",
_("Receivable Account") + ":Link/Account:120", _("Project") +":Link/Project:80", _("Remarks") + "::150",
- _("Sales Order") + ":Link/Sales Order:100", _("Delivery Note") + ":Link/Delivery Note:100"
+ _("Sales Order") + ":Link/Sales Order:100", _("Delivery Note") + ":Link/Delivery Note:100",
+ {
+ "fieldname": "currency",
+ "label": _("Currency"),
+ "fieldtype": "Data",
+ "width": 80
+ }
]
income_accounts = tax_accounts = income_columns = tax_columns = []
@@ -83,14 +91,14 @@
and parent in (%s) order by account_head""" %
', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]))
- income_columns = [(account + ":Currency:120") for account in income_accounts]
+ income_columns = [(account + ":Currency/currency:120") for account in income_accounts]
for account in tax_accounts:
if account not in income_accounts:
- tax_columns.append(account + ":Currency:120")
+ tax_columns.append(account + ":Currency/currency:120")
- columns = columns + income_columns + [_("Net Total") + ":Currency:120"] + tax_columns + \
- [_("Total Tax") + ":Currency:120", _("Grand Total") + ":Currency:120",
- _("Rounded Total") + ":Currency:120", _("Outstanding Amount") + ":Currency:120"]
+ columns = columns + income_columns + [_("Net Total") + ":Currency/currency:120"] + tax_columns + \
+ [_("Total Tax") + ":Currency/currency:120", _("Grand Total") + ":Currency/currency:120",
+ _("Rounded Total") + ":Currency/currency:120", _("Outstanding Amount") + ":Currency/currency:120"]
return columns, income_accounts, tax_accounts
diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.js b/erpnext/buying/doctype/purchase_common/purchase_common.js
index 9a9a865..c67a30f 100644
--- a/erpnext/buying/doctype/purchase_common/purchase_common.js
+++ b/erpnext/buying/doctype/purchase_common/purchase_common.js
@@ -171,18 +171,10 @@
erpnext.buying.get_items_from_product_bundle(me.frm);
}, __("Get items from"));
},
-
- company: function() {
- var me = this;
- if (frappe.meta.get_docfield(this.frm.doctype, "shipping_address")
- && !this.frm.doc.shipping_address) {
- erpnext.utils.get_shipping_address(this.frm)
- }
- },
-
+
shipping_address: function(){
var me = this;
-
+
this.frm.set_query("shipping_address", function(){
if(me.frm.doc.customer){
return{
@@ -200,8 +192,8 @@
}
}
});
-
- erpnext.utils.get_address_display(this.frm, "shipping_address",
+
+ erpnext.utils.get_address_display(this.frm, "shipping_address",
"shipping_address_display", is_your_company_address=true)
}
});
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index fd54dd7..cf418f6 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -7,7 +7,7 @@
app_description = """ERP made simple"""
app_icon = "icon-th"
app_color = "#e74c3c"
-app_version = "6.27.5"
+app_version = "6.27.7"
app_email = "info@erpnext.com"
app_license = "GNU General Public License (v3)"
source_link = "https://github.com/frappe/erpnext"
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
index 6740c6e..331a82b 100755
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
@@ -77,7 +77,9 @@
frappe.throw(_("Total leaves allocated is mandatory"))
def validate_total_leaves_allocated(self):
- if date_diff(self.to_date, self.from_date) <= flt(self.total_leaves_allocated):
+ # Adding a day to include To Date in the difference
+ date_difference = date_diff(self.to_date, self.from_date) + 1
+ if date_difference < self.total_leaves_allocated:
frappe.throw(_("Total allocated leaves are more than days in the period"), OverAllocationError)
def validate_against_leave_applications(self):
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index f9f7377..63147d5 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -4,10 +4,11 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import add_days, cint, cstr, flt, getdate, nowdate, rounded, date_diff
+from frappe.utils import add_days, cint, cstr, flt, getdate, nowdate, rounded, date_diff, money_in_words
from frappe.model.naming import make_autoname
from frappe import msgprint, _
+from erpnext.accounts.utils import get_fiscal_year
from erpnext.setup.utils import get_company_currency
from erpnext.hr.utils import set_employee_name
from erpnext.hr.doctype.process_payroll.process_payroll import get_month_details
@@ -18,6 +19,22 @@
def autoname(self):
self.name = make_autoname('Sal Slip/' +self.employee + '/.#####')
+ def validate(self):
+ self.check_existing()
+
+ if not (len(self.get("earnings")) or len(self.get("deductions"))):
+ self.get_emp_and_leave_details()
+ else:
+ self.get_leave_details(lwp = self.leave_without_pay)
+
+ if not self.net_pay:
+ self.calculate_net_pay()
+
+ company_currency = get_company_currency(self.company)
+ self.total_in_words = money_in_words(self.rounded_total, company_currency)
+
+ set_employee_name(self)
+
def get_emp_and_leave_details(self):
if self.employee:
joining_date, relieving_date = frappe.db.get_value("Employee", self.employee,
@@ -59,7 +76,9 @@
def get_leave_details(self, joining_date=None, relieving_date=None, lwp=None):
if not self.fiscal_year:
- self.fiscal_year = frappe.db.get_default("fiscal_year")
+ # if default fiscal year is not set, get from nowdate
+ self.fiscal_year = get_fiscal_year(nowdate())[0]
+
if not self.month:
self.month = "%02d" % getdate(nowdate()).month
@@ -150,23 +169,6 @@
self.employee = ''
frappe.throw(_("Salary Slip of employee {0} already created for this month").format(self.employee))
- def validate(self):
- from frappe.utils import money_in_words
- self.check_existing()
-
- if not (len(self.get("earnings")) or len(self.get("deductions"))):
- self.get_emp_and_leave_details()
- else:
- self.get_leave_details(lwp = self.leave_without_pay)
-
- if not self.net_pay:
- self.calculate_net_pay()
-
- company_currency = get_company_currency(self.company)
- self.total_in_words = money_in_words(self.rounded_total, company_currency)
-
- set_employee_name(self)
-
def calculate_earning_total(self):
self.gross_pay = flt(self.arrear_amount) + flt(self.leave_encashment_amount)
for d in self.get("earnings"):
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index efcceb3..1b9cbe5 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -257,4 +257,5 @@
execute:frappe.delete_doc_if_exists("Web Form", "contact") #2016-03-10
erpnext.patches.v6_20x.remove_fiscal_year_from_holiday_list
erpnext.patches.v6_24.map_customer_address_to_shipping_address_on_po
-erpnext.patches.v6_27.fix_recurring_order_status
\ No newline at end of file
+erpnext.patches.v6_27.fix_recurring_order_status
+erpnext.patches.v6_20x.update_product_bundle_description
diff --git a/erpnext/patches/v6_20x/update_product_bundle_description.py b/erpnext/patches/v6_20x/update_product_bundle_description.py
new file mode 100644
index 0000000..1fac44b
--- /dev/null
+++ b/erpnext/patches/v6_20x/update_product_bundle_description.py
@@ -0,0 +1,11 @@
+from __future__ import unicode_literals
+import frappe
+from frappe.utils import sanitize_html
+
+def execute():
+ for product_bundle in frappe.get_all('Product Bundle'):
+ doc = frappe.get_doc('Product Bundle', product_bundle.name)
+ for item in doc.items:
+ if item.description:
+ description = sanitize_html(item.description)
+ item.db_set('description', description, update_modified=False)
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index 6de5154..a1b3846 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -308,7 +308,15 @@
if (this.frm.doc.posting_date) var date = this.frm.doc.posting_date;
else var date = this.frm.doc.transaction_date;
- set_party_account(set_pricing);
+
+ if (frappe.meta.get_docfield(this.frm.doctype, "shipping_address") &&
+ in_list(['Purchase Order', 'Purchase Receipt', 'Purchase Invoice'], this.frm.doctype)){
+ erpnext.utils.get_shipping_address(this.frm, function(){
+ set_party_account(set_pricing);
+ })
+ }else{
+ set_party_account(set_pricing);
+ }
if(this.frm.doc.company) {
erpnext.last_selected_company = this.frm.doc.company;
diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js
index 1896f88..a31d841 100644
--- a/erpnext/public/js/utils/party.js
+++ b/erpnext/public/js/utils/party.js
@@ -69,7 +69,7 @@
if(r.message) {
frm.set_value(display_field, r.message)
}
-
+
if(frappe.meta.get_docfield(frm.doc.doctype, "taxes") && !is_your_company_address) {
if(!erpnext.utils.validate_mandatory(frm, "Customer/Supplier",
frm.doc.customer || frm.doc.supplier, address_field)) return;
@@ -99,7 +99,7 @@
} else {
frm.set_value(display_field, null);
}
-
+
}
erpnext.utils.get_contact_details = function(frm) {
@@ -127,7 +127,7 @@
return true;
}
-erpnext.utils.get_shipping_address = function(frm){
+erpnext.utils.get_shipping_address = function(frm, callback){
frappe.call({
method: "erpnext.utilities.doctype.address.address.get_shipping_address",
args: {company: frm.doc.company},
@@ -136,6 +136,10 @@
frm.set_value("shipping_address", r.message[0]) //Address title or name
frm.set_value("shipping_address_display", r.message[1]) //Address to be displayed on the page
}
+
+ if(callback){
+ return callback();
+ }
}
});
}
diff --git a/erpnext/setup/page/welcome_to_erpnext/welcome_to_erpnext.html b/erpnext/setup/page/welcome_to_erpnext/welcome_to_erpnext.html
index 5fe7a14..fe8a963 100644
--- a/erpnext/setup/page/welcome_to_erpnext/welcome_to_erpnext.html
+++ b/erpnext/setup/page/welcome_to_erpnext/welcome_to_erpnext.html
@@ -21,7 +21,7 @@
<h3>{%= __("Next Steps") %}</h3>
<ul class="list-unstyled">
<li><a class="text-muted" href="#">{%= __("Go to the Desktop and start using ERPNext") %}</a></li>
- <li><a class="text-muted" href="#Module/Learn">{%= __("View a list of all the help videos") %}</a></li>
+ <li><a class="text-muted" href="#modules/Learn">{%= __("View a list of all the help videos") %}</a></li>
<li><a class="text-muted" href="https://manual.erpnext.com" target="_blank">{%= __("Read the ERPNext Manual") %}</a></li>
<li><a class="text-muted" href="https://discuss.erpnext.com" target="_blank">{%= __("Community Forum") %}</a></li>
</ul>
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 0c0b582..2fe3bb7 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -27,9 +27,8 @@
return _("From {0} to {1}").format(self.from_warehouse, self.to_warehouse)
def onload(self):
- if self.docstatus==1:
- for item in self.get("items"):
- item.update(get_bin_details(item.item_code, item.s_warehouse))
+ for item in self.get("items"):
+ item.update(get_bin_details(item.item_code, item.s_warehouse))
def validate(self):
self.pro_doc = None
diff --git a/setup.py b/setup.py
index 581e065..ac55dce 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
from setuptools import setup, find_packages
from pip.req import parse_requirements
-version = "6.27.5"
+version = "6.27.7"
requirements = parse_requirements("requirements.txt", session="")
setup(
diff --git a/travis/bench_init.sh b/travis/bench_init.sh
new file mode 100755
index 0000000..a8bb492
--- /dev/null
+++ b/travis/bench_init.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+cd ~/
+curl -I https://github.com/frappe/frappe/tree/$TRAVIS_BRANCH | head -n 1 | cut -d $' ' -f2 | (
+ read response;
+ [ $response == '200' ] && branch=$TRAVIS_BRANCH || branch='develop';
+ bench init frappe-bench --frappe-path https://github.com/frappe/frappe.git --frappe-branch $branch
+)