diff --git a/.travis.yml b/.travis.yml index 12a73c9b85..966dfd37d9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ install: - 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 886ec5e0d0..0000000000 --- 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 5247b5b39b..0000000000 --- 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 ) 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 - so, practically, -- before including any system headers). -- -- __GLIBC__ is defined in --*/ --#ifdef __GLIBC__ --#error MUST be included first! --#endif -- - #endif - diff --git a/erpnext/__version__.py b/erpnext/__version__.py index 9ebc832a59..ec6775d8c9 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.8' diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index b667c549a3..5f9a915868 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -353,25 +353,31 @@ class JournalEntry(AccountsController): self.remark = ("\n").join(r) #User Remarks is not mandatory def set_print_format_fields(self): - total_amount = 0.0 - bank_account_currency = None - pay_to_recd_from = None + bank_amount = party_amount = total_amount = 0.0 + currency = bank_account_currency = party_account_currency = pay_to_recd_from= None for d in self.get('accounts'): if d.party_type and d.party: if not pay_to_recd_from: pay_to_recd_from = frappe.db.get_value(d.party_type, d.party, "customer_name" if d.party_type=="Customer" else "supplier_name") + party_amount += (d.debit_in_account_currency or d.credit_in_account_currency) + party_account_currency = d.account_currency + elif frappe.db.get_value("Account", d.account, "account_type") in ["Bank", "Cash"]: - total_amount += (d.debit_in_account_currency or d.credit_in_account_currency) + bank_amount += (d.debit_in_account_currency or d.credit_in_account_currency) bank_account_currency = d.account_currency if pay_to_recd_from: self.pay_to_recd_from = pay_to_recd_from - else: - total_amount = 0 + if bank_amount: + total_amount = bank_amount + currency = bank_account_currency + else: + total_amount = party_amount + currency = party_account_currency - self.set_total_amount(total_amount, bank_account_currency) + self.set_total_amount(total_amount, currency) def set_total_amount(self, amt, currency): self.total_amount = amt @@ -664,7 +670,7 @@ def get_payment_entry(ref_doc, args): bank_row.cost_center = cost_center amount = args.get("debit_in_account_currency") or args.get("amount") - + if bank_row.account_currency == args.get("party_account_currency"): bank_row.set(args.get("amount_field_bank"), amount) else: diff --git a/erpnext/accounts/doctype/payment_request/payment_request.json b/erpnext/accounts/doctype/payment_request/payment_request.json index e916034d29..74a18fcf59 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/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 9ffe8a9789..bc1d73d15c 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -368,7 +368,7 @@ class SalesInvoice(SellingController): frappe.throw(_("Cash or Bank Account is mandatory for making payment entry")) if flt(self.paid_amount) + flt(self.write_off_amount) \ - - flt(self.base_grand_total) > 1/(10**(self.precision("base_grand_total") + 1)): + - flt(self.grand_total) > 1/(10**(self.precision("grand_total") + 1)): frappe.throw(_("""Paid amount + Write Off Amount can not be greater than Grand Total""")) @@ -475,7 +475,7 @@ class SalesInvoice(SellingController): frappe.db.set(self,'paid_amount',0) frappe.db.set(self, 'base_paid_amount', - flt(self.paid_amount*self.conversion_rate, self.precision("base_paid_amount"))) + flt(self.paid_amount*self.conversion_rate, self.precision("base_paid_amount"))) def check_prev_docstatus(self): for d in self.get('items'): diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.js b/erpnext/accounts/doctype/tax_rule/tax_rule.js index 4c35370eae..935ea62b67 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.on("Tax Rule", "refresh", function(frm) { 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 @@ frappe.ui.form.on("Tax Rule", "supplier", function(frm) { } } }); -}); \ 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 7b6208293a..ce20d3a3d5 100644 --- a/erpnext/accounts/doctype/tax_rule/tax_rule.py +++ b/erpnext/accounts/doctype/tax_rule/tax_rule.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals 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 @@ class TaxRule(Document): 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 @@ class TaxRule(Document): 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_party_details(party, party_type, args=None): 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/party.py b/erpnext/accounts/party.py index 02d4244a55..d348715103 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -305,8 +305,12 @@ def set_taxes(party, party_type, posting_date, company, customer_group=None, sup else: args.update(get_party_details(party, party_type)) - if party_type=="Customer": + if party_type in ("Customer", "Lead"): args.update({"tax_type": "Sales"}) + + if party_type=='Lead': + args['customer'] = None + del args['lead'] else: args.update({"tax_type": "Purchase"}) diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html index 69c88ed3c4..712d35b38e 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html @@ -37,9 +37,12 @@
{%= data[i][__("Voucher No")] %} {%= data[i][__("Customer Name")] || data[i][__("Customer")] || data[i][__("Supplier Name")] || data[i][__("Supplier")] %}
{%= __("Remarks") %}: {%= data[i][__("Remarks")] %} - {%= format_currency(data[i][__("Invoiced Amount")]) %} - {%= format_currency(data[i][__("Paid Amount")]) %} - {%= format_currency(data[i][__("Outstanding Amount")]) %} + + {%= format_currency(data[i][__("Invoiced Amount")], data[i]["currency"]) %} + + {%= format_currency(data[i][__("Paid Amount")], data[i]["currency"]) %} + + {%= format_currency(data[i][__("Outstanding Amount")], data[i]["currency"]) %} {% } else { %} diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index 39fe5c4ba7..365212a163 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -58,21 +58,19 @@ class ReceivablePayableReport(object): "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 @@ class ReceivablePayableReport(object): 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 60eade4706..36e97343e6 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 @@ class AccountsReceivableSummary(ReceivablePayableReport): 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 @@ class AccountsReceivableSummary(ReceivablePayableReport): 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 @@ class AccountsReceivableSummary(ReceivablePayableReport): ) 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 @@ class AccountsReceivableSummary(ReceivablePayableReport): 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 41b7dd1544..691a5c30cc 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": "2015-11-02 12:32:02.048551", + "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 ba87cf1c14..4ae0e6794d 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -145,11 +145,11 @@ class GrossProfitGenerator(object): 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 @@ class GrossProfitGenerator(object): 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 7be5649aa2..f1e706e5d6 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 @@ def execute(filters=None): 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 @@ def execute(filters=None): 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 @@ def get_columns(): "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 @@ def get_tax_accounts(item_list, columns): (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 e3c475303e..2401202937 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 @@ def execute(filters=None): 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 @@ def execute(filters=None): 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 @@ def get_columns(): _("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 @@ def get_tax_accounts(item_list, columns): 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/ordered_items_to_be_billed/ordered_items_to_be_billed.json b/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.json index 8f41ac45f0..47b62a8499 100644 --- a/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.json +++ b/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.json @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2016-02-23 18:48:42.372321", + "modified": "2016-04-01 08:26:43.868609", "modified_by": "Administrator", "module": "Accounts", "name": "Ordered Items To Be Billed", diff --git a/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.json b/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.json index c5314e60a8..72e9396d58 100644 --- a/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.json +++ b/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.json @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2016-02-23 18:51:21.968327", + "modified": "2016-04-01 08:27:32.122070", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Order Items To Be Billed", diff --git a/erpnext/accounts/report/purchase_register/purchase_register.py b/erpnext/accounts/report/purchase_register/purchase_register.py index c8698030e7..7934bf25cd 100644 --- a/erpnext/accounts/report/purchase_register/purchase_register.py +++ b/erpnext/accounts/report/purchase_register/purchase_register.py @@ -21,6 +21,8 @@ def execute(filters=None): 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 @@ def execute(filters=None): 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 execute(filters=None): 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 @@ def get_columns(invoice_list): ', '.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 0b8597d204..c38a7bb595 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": "2015-11-02 12:33:11.681513", + "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 f68adad7d9..d09cfc1924 100644 --- a/erpnext/accounts/report/sales_register/sales_register.py +++ b/erpnext/accounts/report/sales_register/sales_register.py @@ -22,6 +22,7 @@ def execute(filters=None): 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 @@ def execute(filters=None): 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 @@ def get_columns(invoice_list): _("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 @@ def get_columns(invoice_list): 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 6dcc8653e0..c67a30fb69 100644 --- a/erpnext/buying/doctype/purchase_common/purchase_common.js +++ b/erpnext/buying/doctype/purchase_common/purchase_common.js @@ -171,21 +171,10 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({ 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) - } - var company_doc = frappe.get_doc(":Company", me.frm.doc.company); - me.frm.set_value("letter_head", company_doc.default_letter_head); - }, - shipping_address: function(){ var me = this; - + this.frm.set_query("shipping_address", function(){ if(me.frm.doc.customer){ return{ @@ -203,8 +192,8 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({ } } }); - - 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/buying/report/item_wise_purchase_history/item_wise_purchase_history.json b/erpnext/buying/report/item_wise_purchase_history/item_wise_purchase_history.json index c06d33d0b8..4a8d608c99 100644 --- a/erpnext/buying/report/item_wise_purchase_history/item_wise_purchase_history.json +++ b/erpnext/buying/report/item_wise_purchase_history/item_wise_purchase_history.json @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2016-02-22 11:27:39.445257", + "modified": "2016-04-01 08:26:52.361800", "modified_by": "Administrator", "module": "Buying", "name": "Item-wise Purchase History", diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index b40e6f4811..f53ad531d6 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -184,8 +184,8 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals idx desc, name, item_name limit %(start)s, %(page_len)s """.format(key=searchfield, - fcond=get_filters_cond(doctype, filters, conditions), - mcond=get_match_cond(doctype)), + fcond=get_filters_cond(doctype, filters, conditions).replace('%', '%%'), + mcond=get_match_cond(doctype).replace('%', '%%')), { "today": nowdate(), "txt": "%%%s%%" % txt, diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index b8b2c31385..d12486d304 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -51,7 +51,10 @@ class SellingController(StockController): elif getattr(self, "lead", None): from erpnext.crm.doctype.lead.lead import get_lead_details - self.update_if_missing(get_lead_details(self.lead)) + self.update_if_missing(get_lead_details( + self.lead, + posting_date=self.get('transaction_date') or self.get('posting_date'), + company=self.company)) def set_price_list_and_item_details(self): self.set_price_list_currency("Selling") diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 67cec8a50e..7210d76c03 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -288,8 +288,8 @@ class calculate_taxes_and_totals(object): last_tax.tax_amount += diff last_tax.tax_amount_after_discount_amount += diff last_tax.total += diff - - self._set_in_company_currency(last_tax, + + self._set_in_company_currency(last_tax, ["total", "tax_amount", "tax_amount_after_discount_amount"]) def calculate_totals(self): @@ -324,22 +324,22 @@ class calculate_taxes_and_totals(object): self.doc.round_floats_in(self.doc, ["grand_total", "base_grand_total"]) if self.doc.meta.get_field("rounded_total"): - self.doc.rounded_total = round_based_on_smallest_currency_fraction(self.doc.grand_total, + self.doc.rounded_total = round_based_on_smallest_currency_fraction(self.doc.grand_total, self.doc.currency, self.doc.precision("rounded_total")) if self.doc.meta.get_field("base_rounded_total"): company_currency = get_company_currency(self.doc.company) - + self.doc.base_rounded_total = \ - round_based_on_smallest_currency_fraction(self.doc.base_grand_total, + round_based_on_smallest_currency_fraction(self.doc.base_grand_total, company_currency, self.doc.precision("base_rounded_total")) def _cleanup(self): for tax in self.doc.get("taxes"): tax.item_wise_tax_detail = json.dumps(tax.item_wise_tax_detail, separators=(',', ':')) - + def set_discount_amount(self): if not self.doc.discount_amount and self.doc.additional_discount_percentage: - self.doc.discount_amount = flt(flt(self.doc.get(scrub(self.doc.apply_discount_on))) + self.doc.discount_amount = flt(flt(self.doc.get(scrub(self.doc.apply_discount_on))) * self.doc.additional_discount_percentage / 100, self.doc.precision("discount_amount")) def apply_discount_amount(self): @@ -402,13 +402,13 @@ class calculate_taxes_and_totals(object): for adv in self.doc.get("advances")]) self.doc.total_advance = flt(total_allocated_amount, self.doc.precision("total_advance")) - + if self.doc.party_account_currency == self.doc.currency: invoice_total = self.doc.grand_total else: - invoice_total = flt(self.doc.grand_total * self.doc.conversion_rate, + invoice_total = flt(self.doc.grand_total * self.doc.conversion_rate, self.doc.precision("grand_total")) - + if invoice_total > 0 and self.doc.total_advance > invoice_total: frappe.throw(_("Advance amount cannot be greater than {0} {1}") .format(self.doc.party_account_currency, invoice_total)) @@ -422,21 +422,23 @@ class calculate_taxes_and_totals(object): # total_advance is only for non POS Invoice if self.doc.is_return: return - + self.doc.round_floats_in(self.doc, ["grand_total", "total_advance", "write_off_amount"]) + self._set_in_company_currency(self.doc, ['write_off_amount']) + if self.doc.party_account_currency == self.doc.currency: - total_amount_to_pay = flt(self.doc.grand_total - self.doc.total_advance + total_amount_to_pay = flt(self.doc.grand_total - self.doc.total_advance - flt(self.doc.write_off_amount), self.doc.precision("grand_total")) else: total_amount_to_pay = flt(flt(self.doc.grand_total * - self.doc.conversion_rate, self.doc.precision("grand_total")) - self.doc.total_advance + self.doc.conversion_rate, self.doc.precision("grand_total")) - self.doc.total_advance - flt(self.doc.base_write_off_amount), self.doc.precision("grand_total")) - + if self.doc.doctype == "Sales Invoice": self.doc.round_floats_in(self.doc, ["paid_amount"]) paid_amount = self.doc.paid_amount \ if self.doc.party_account_currency == self.doc.currency else self.doc.base_paid_amount - self.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount), + self.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount), self.doc.precision("outstanding_amount")) elif self.doc.doctype == "Purchase Invoice": self.doc.outstanding_amount = flt(total_amount_to_pay, self.doc.precision("outstanding_amount")) diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py index 497e8c7050..0c3652f7eb 100644 --- a/erpnext/crm/doctype/lead/lead.py +++ b/erpnext/crm/doctype/lead/lead.py @@ -10,6 +10,7 @@ from frappe.model.mapper import get_mapped_doc from erpnext.controllers.selling_controller import SellingController from erpnext.utilities.address_and_contact import load_address_and_contact +from erpnext.accounts.party import set_taxes sender_field = "email_id" @@ -140,7 +141,7 @@ def make_quotation(source_name, target_doc=None): return target_doc @frappe.whitelist() -def get_lead_details(lead): +def get_lead_details(lead, posting_date=None, company=None): if not lead: return {} from erpnext.accounts.party import set_address_details @@ -160,4 +161,9 @@ def get_lead_details(lead): set_address_details(out, lead, "Lead") + taxes_and_charges = set_taxes(None, 'Lead', posting_date, company, + billing_address=out.get('customer_address'), shipping_address=out.get('shipping_address_name')) + if taxes_and_charges: + out['taxes_and_charges'] = taxes_and_charges + return out diff --git a/erpnext/hooks.py b/erpnext/hooks.py index fe4d0b6b09..806299f53e 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -7,7 +7,7 @@ app_publisher = "Frappe Technologies Pvt. Ltd." app_description = """ERP made simple""" app_icon = "icon-th" app_color = "#e74c3c" -app_version = "6.27.5" +app_version = "6.27.8" 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 6740c6e9a4..331a82bd8a 100755 --- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py +++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py @@ -77,7 +77,9 @@ class LeaveAllocation(Document): 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 f9f7377aa2..63147d5d9c 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 @@ class SalarySlip(TransactionBase): 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 @@ class SalarySlip(TransactionBase): 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 @@ class SalarySlip(TransactionBase): 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/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py index 57eca4bd98..e482cc3d50 100644 --- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py +++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py @@ -74,7 +74,7 @@ class ProductionPlanningTool(Document): pp_so.sales_order_date = cstr(r['transaction_date']) pp_so.customer = cstr(r['customer']) pp_so.grand_total = flt(r['base_grand_total']) - + def get_pending_material_requests(self): """ Pull Material Requests that are pending based on criteria selected""" mr_filter = item_filter = "" @@ -84,7 +84,7 @@ class ProductionPlanningTool(Document): mr_filter += " and mr.transaction_date <= %(to_date)s" if self.warehouse: mr_filter += " and mr_item.warehouse = %(warehouse)s" - + if self.fg_item: item_filter += " and item.name = %(item)s" @@ -105,7 +105,7 @@ class ProductionPlanningTool(Document): }, as_dict=1) self.add_mr_in_table(pending_mr) - + def add_mr_in_table(self, pending_mr): """ Add Material Requests in the table""" self.clear_table("material_requests") @@ -122,7 +122,7 @@ class ProductionPlanningTool(Document): self.get_so_items() elif self.get_items_from == "Material Request": self.get_mr_items() - + def get_so_items(self): so_list = [d.sales_order for d in self.get('sales_orders') if d.sales_order] if not so_list: @@ -131,7 +131,7 @@ class ProductionPlanningTool(Document): item_condition = "" if self.fg_item: - item_condition = ' and so_item.item_code = "' + self.fg_item + '"' + item_condition = ' and so_item.item_code = "{0}"'.format(frappe.db.escape(self.fg_item)) items = frappe.db.sql("""select distinct parent, item_code, warehouse, (qty - delivered_qty) as pending_qty @@ -142,7 +142,7 @@ class ProductionPlanningTool(Document): (", ".join(["%s"] * len(so_list)), item_condition), tuple(so_list), as_dict=1) if self.fg_item: - item_condition = ' and pi.item_code = "' + self.fg_item + '"' + item_condition = ' and pi.item_code = "{0}"'.format(frappe.db.escape(self.fg_item)) packed_items = frappe.db.sql("""select distinct pi.parent, pi.item_code, pi.warehouse as warehouse, (((so_item.qty - so_item.delivered_qty) * pi.qty) / so_item.qty) @@ -156,7 +156,7 @@ class ProductionPlanningTool(Document): (", ".join(["%s"] * len(so_list)), item_condition), tuple(so_list), as_dict=1) self.add_items(items + packed_items) - + def get_mr_items(self): mr_list = [d.material_request for d in self.get('material_requests') if d.material_request] if not mr_list: @@ -176,7 +176,7 @@ class ProductionPlanningTool(Document): (", ".join(["%s"] * len(mr_list)), item_condition), tuple(mr_list), as_dict=1) self.add_items(items) - + def add_items(self, items): self.clear_table("items") @@ -190,13 +190,13 @@ class ProductionPlanningTool(Document): pi.bom_no = item_details and item_details.bom_no or '' pi.planned_qty = flt(p['pending_qty']) pi.pending_qty = flt(p['pending_qty']) - + if self.get_items_from == "Sales Order": pi.sales_order = p['parent'] elif self.get_items_from == "Material Request": pi.material_request = p['parent'] pi.material_request_item = p['name'] - + def validate_data(self): self.validate_company() for d in self.get('items'): @@ -204,7 +204,7 @@ class ProductionPlanningTool(Document): frappe.throw(_("Please select BOM for Item in Row {0}".format(d.idx))) else: validate_bom_no(d.item_code, d.bom_no) - + if not flt(d.planned_qty): frappe.throw(_("Please enter Planned Qty for Item {0} at row {1}").format(d.item_code, d.idx)) @@ -216,17 +216,17 @@ class ProductionPlanningTool(Document): validate_uom_is_integer(self, "stock_uom", "planned_qty") items = self.get_production_items() - + pro_list = [] frappe.flags.mute_messages = True - + for key in items: production_order = self.create_production_order(items[key]) if production_order: pro_list.append(production_order) - + frappe.flags.mute_messages = False - + if pro_list: pro_list = ["""%s""" % \ (p, p) for p in pro_list] @@ -250,14 +250,14 @@ class ProductionPlanningTool(Document): "fg_warehouse" : d.warehouse, "status" : "Draft", } - + """ Club similar BOM and item for processing in case of Sales Orders """ if self.get_items_from == "Material Request": item_details.update({ "qty": d.planned_qty }) item_dict[(d.item_code, d.material_request_item, d.warehouse)] = item_details - + else: item_details.update({ "qty":flt(item_dict.get((d.item_code, d.sales_order, d.warehouse),{}) @@ -278,7 +278,7 @@ class ProductionPlanningTool(Document): pro.wip_warehouse = warehouse.get('wip_warehouse') if not pro.fg_warehouse: pro.fg_warehouse = warehouse.get('fg_warehouse') - + try: pro.insert() return pro.name @@ -286,7 +286,7 @@ class ProductionPlanningTool(Document): pass def get_so_wise_planned_qty(self): - """ + """ bom_dict { bom_no: ['sales_order', 'qty'] } @@ -298,7 +298,7 @@ class ProductionPlanningTool(Document): else: bom_dict.setdefault(d.bom_no, []).append([d.sales_order, flt(d.planned_qty)]) return bom_dict - + def download_raw_materials(self): """ Create csv data for required raw material to produce finished goods""" self.validate_data() diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 84a4e199b5..125be6046d 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -262,3 +262,4 @@ erpnext.patches.v6_20x.remove_customer_supplier_roles erpnext.patches.v6_24.rename_item_field erpnext.patches.v7_0.update_party_status erpnext.patches.v7_0.update_item_projected +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 0000000000..1fac44b001 --- /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 28a3691bf8..78584fab13 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -119,7 +119,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ setup_sms: function() { var me = this; - if(this.frm.doc.docstatus===1 && !in_list(["Lost", "Stopped"], this.frm.doc.status) + if(this.frm.doc.docstatus===1 && !in_list(["Lost", "Stopped", "Closed"], this.frm.doc.status) && this.frm.doctype != "Purchase Invoice") { this.frm.page.add_menu_item(__('Send SMS'), function() { me.send_sms(); }); } @@ -309,7 +309,15 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ 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/setup_wizard.js b/erpnext/public/js/setup_wizard.js index 5e16dd89d2..2eb73a3e98 100644 --- a/erpnext/public/js/setup_wizard.js +++ b/erpnext/public/js/setup_wizard.js @@ -28,7 +28,6 @@ function load_erpnext_slides() { {"label": __("Manufacturing"), "value": "Manufacturing"}, {"label": __("Retail"), "value": "Retail"}, {"label": __("Services"), "value": "Services"}, - {"label": __("Education"), "value": "Education"}, {"label": __("Other"), "value": "Other"}, ], reqd:1}, {fieldname:'chart_of_accounts', label: __('Chart of Accounts'), diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js index 5f9a2769a0..f5496ed1d1 100644 --- a/erpnext/public/js/utils/party.js +++ b/erpnext/public/js/utils/party.js @@ -70,37 +70,57 @@ erpnext.utils.get_address_display = function(frm, address_field, display_field, 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; - - if(!erpnext.utils.validate_mandatory(frm, "Posting/Transaction Date", - frm.doc.posting_date || frm.doc.transaction_date, address_field)) return; - } else return; - - frappe.call({ - method: "erpnext.accounts.party.set_taxes", - args: { - "party": frm.doc.customer || frm.doc.supplier, - "party_type": (frm.doc.customer ? "Customer" : "Supplier"), - "posting_date": frm.doc.posting_date || frm.doc.transaction_date, - "company": frm.doc.company, - "billing_address": ((frm.doc.customer) ? (frm.doc.customer_address) : (frm.doc.supplier_address)), - "shipping_address": frm.doc.shipping_address_name - }, - callback: function(r) { - if(r.message){ - frm.set_value("taxes_and_charges", r.message) - } - } - }); + erpnext.utils.set_taxes(frm, address_field, display_field, is_your_company_address); } }) } else { frm.set_value(display_field, null); } +}; +erpnext.utils.set_taxes = function(frm, address_field, display_field, is_your_company_address) { + if(frappe.meta.get_docfield(frm.doc.doctype, "taxes") && !is_your_company_address) { + if(!erpnext.utils.validate_mandatory(frm, "Lead/Customer/Supplier", + frm.doc.customer || frm.doc.supplier || frm.doc.lead, address_field)) { + return; + } + + if(!erpnext.utils.validate_mandatory(frm, "Posting/Transaction Date", + frm.doc.posting_date || frm.doc.transaction_date, address_field)) { + return; + } + } else { + return; + } + + var party_type, party; + if (frm.doc.lead) { + party_type = 'Lead'; + party = frm.doc.lead; + } else if (frm.doc.customer) { + party_type = 'Customer'; + party = frm.doc.customer; + } else if (frm.doc.supplier) { + party_type = 'Supplier'; + party = frm.doc.supplier; + } + + frappe.call({ + method: "erpnext.accounts.party.set_taxes", + args: { + "party": party, + "party_type": party_type, + "posting_date": frm.doc.posting_date || frm.doc.transaction_date, + "company": frm.doc.company, + "billing_address": ((frm.doc.customer || frm.doc.lead) ? (frm.doc.customer_address) : (frm.doc.supplier_address)), + "shipping_address": frm.doc.shipping_address_name + }, + callback: function(r) { + if(r.message){ + frm.set_value("taxes_and_charges", r.message) + } + } + }); } erpnext.utils.get_contact_details = function(frm) { @@ -128,7 +148,7 @@ erpnext.utils.validate_mandatory = function(frm, label, value, trigger_on) { 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}, @@ -137,6 +157,10 @@ erpnext.utils.get_shipping_address = function(frm){ 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(); + } } }); } \ No newline at end of file diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index 9902441df7..591b9c1c0b 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -186,7 +186,7 @@ def get_customer_outstanding(customer, company): select sum(base_grand_total*(100 - per_billed)/100) from `tabSales Order` where customer=%s and docstatus = 1 and company=%s - and per_billed < 100 and status != 'Stopped'""", (customer, company)) + and per_billed < 100 and status != 'Closed'""", (customer, company)) outstanding_based_on_so = flt(outstanding_based_on_so[0][0]) if outstanding_based_on_so else 0.0 @@ -197,7 +197,7 @@ def get_customer_outstanding(customer, company): where dn.name = dn_item.parent and dn.customer=%s and dn.company=%s - and dn.docstatus = 1 and dn.status != 'Stopped' + and dn.docstatus = 1 and dn.status not in ('Closed', 'Stopped') and ifnull(dn_item.against_sales_order, '') = '' and ifnull(dn_item.against_sales_invoice, '') = ''""", (customer, company), as_dict=True) diff --git a/erpnext/selling/doctype/quotation/quotation.js b/erpnext/selling/doctype/quotation/quotation.js index 06f94fea0f..7c46983367 100644 --- a/erpnext/selling/doctype/quotation/quotation.js +++ b/erpnext/selling/doctype/quotation/quotation.js @@ -94,7 +94,11 @@ erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({ var me = this; frappe.call({ method: "erpnext.crm.doctype.lead.lead.get_lead_details", - args: { "lead": this.frm.doc.lead }, + args: { + 'lead': this.frm.doc.lead, + 'posting_date': this.frm.doc.transaction_date, + 'company': this.frm.doc.company, + }, callback: function(r) { if(r.message) { me.frm.updating_party_details = true; @@ -166,4 +170,4 @@ frappe.ui.form.on("Quotation Item", "stock_balance", function(frm, cdt, cdn) { var d = frappe.model.get_doc(cdt, cdn); frappe.route_options = {"item_code": d.item_code}; frappe.set_route("query-report", "Stock Balance"); -}) \ No newline at end of file +}) diff --git a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.json b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.json index 4116568ef6..bd49d0bc93 100644 --- a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.json +++ b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.json @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2016-01-28 14:59:04.611174", + "modified": "2016-04-01 08:26:55.705992", "modified_by": "Administrator", "module": "Selling", "name": "Item-wise Sales History", @@ -16,4 +16,4 @@ "ref_doctype": "Sales Order", "report_name": "Item-wise Sales History", "report_type": "Query Report" -} +} \ No newline at end of file diff --git a/erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.json b/erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.json index 6b19b6394b..a0a7505827 100644 --- a/erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.json +++ b/erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.json @@ -7,12 +7,12 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2015-10-06 12:43:48.259027", + "modified": "2016-04-12 18:45:49.733159", "modified_by": "Administrator", "module": "Selling", "name": "Pending SO Items For Purchase Request", "owner": "Administrator", - "query": "select so_item.item_code as \"Item Code:Link/Item:120\",\n so_item.item_name as \"Item Name::120\",\n so_item.description as \"Description::120\",\n so.`name` as \"S.O. No.:Link/Sales Order:120\",\n so.`transaction_date` as \"Date:Date:120\",\n mr.name as \"Material Request:Link/Material Request:120\",\n so.customer as \"Customer:Link/Customer:120\",\n so.territory as \"Terretory:Link/Territory:120\",\n sum(so_item.qty) as \"SO Qty:Float:100 \",\n sum(mr_item.qty) as \"Requested Qty:Float:100\",\n sum(so_item.qty) - sum(mr_item.qty) as \"Pending Qty:Float:100 \", \n so.company as \"Company:Link/Company:\"\nfrom\n `tabSales Order` so, `tabSales Order Item` so_item, \n `tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere \n so_item.`parent` = so.`name` \n and mr_item.parent = mr.name\n and mr_item.sales_order = so.name\n and mr_item.item_code = so_item.item_code\n and so.docstatus = 1 and so.status != \"Stopped\" \n and mr.docstatus = 1 and mr.status != \"Stopped\"\ngroup by so.name, so_item.item_code\nhaving sum(so_item.qty) > sum(mr_item.qty)\norder by so.name desc, so_item.item_code asc", + "query": "select so_item.item_code as \"Item Code:Link/Item:120\",\n so_item.item_name as \"Item Name::120\",\n so_item.description as \"Description::120\",\n so.`name` as \"S.O. No.:Link/Sales Order:120\",\n so.`transaction_date` as \"Date:Date:120\",\n mr.name as \"Material Request:Link/Material Request:120\",\n so.customer as \"Customer:Link/Customer:120\",\n so.territory as \"Terretory:Link/Territory:120\",\n sum(so_item.qty) as \"SO Qty:Float:100 \",\n sum(mr_item.qty) as \"Requested Qty:Float:100\",\n sum(so_item.qty) - sum(mr_item.qty) as \"Pending Qty:Float:100 \", \n so.company as \"Company:Link/Company:\"\nfrom\n `tabSales Order` so, `tabSales Order Item` so_item, \n `tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere \n so_item.`parent` = so.`name` \n and mr_item.parent = mr.name\n and mr_item.sales_order = so.name\n and mr_item.item_code = so_item.item_code\n and so.docstatus = 1 and so.status != \"Closed\" \n and mr.docstatus = 1 and mr.status != \"Stopped\"\ngroup by so.name, so_item.item_code\nhaving sum(so_item.qty) > sum(mr_item.qty)\norder by so.name desc, so_item.item_code asc", "ref_doctype": "Sales Order", "report_name": "Pending SO Items For Purchase Request", "report_type": "Query Report" 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 5fe7a140fb..fe8a963bc9 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 @@

{%= __("Next Steps") %}

diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py index 864d2d0c04..98a601902b 100644 --- a/erpnext/setup/setup_wizard/setup_wizard.py +++ b/erpnext/setup/setup_wizard/setup_wizard.py @@ -426,7 +426,7 @@ def create_users(args): # create employee for self emp = frappe.get_doc({ "doctype": "Employee", - "full_name": " ".join(filter(None, [args.get("first_name"), args.get("last_name")])), + "employee_name": " ".join(filter(None, [args.get("first_name"), args.get("last_name")])), "user_id": frappe.session.user, "status": "Active", "company": args.get("company_name") @@ -470,7 +470,7 @@ def create_users(args): # create employee emp = frappe.get_doc({ "doctype": "Employee", - "full_name": fullname, + "employee_name": fullname, "user_id": email, "status": "Active", "company": args.get("company_name") diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 0c0b582856..2fe3bb70e3 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -27,9 +27,8 @@ class StockEntry(StockController): 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/erpnext/stock/report/items_to_be_requested/items_to_be_requested.json b/erpnext/stock/report/items_to_be_requested/items_to_be_requested.json index 340577beef..92072a894b 100644 --- a/erpnext/stock/report/items_to_be_requested/items_to_be_requested.json +++ b/erpnext/stock/report/items_to_be_requested/items_to_be_requested.json @@ -1,17 +1,19 @@ { - "apply_user_permissions": 1, - "creation": "2013-08-20 15:08:10", - "docstatus": 0, - "doctype": "Report", - "idx": 1, - "is_standard": "Yes", - "modified": "2014-06-03 07:18:17.128918", - "modified_by": "Administrator", - "module": "Stock", - "name": "Items To Be Requested", - "owner": "Administrator", + "add_total_row": 0, + "apply_user_permissions": 1, + "creation": "2013-08-20 15:08:10", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 1, + "is_standard": "Yes", + "modified": "2016-04-01 08:27:14.436178", + "modified_by": "Administrator", + "module": "Stock", + "name": "Items To Be Requested", + "owner": "Administrator", "query": "SELECT\n tabBin.item_code as \"Item:Link/Item:120\",\n tabBin.warehouse as \"Warehouse:Link/Warehouse:120\",\n tabBin.actual_qty as \"Actual:Float:90\",\n tabBin.indented_qty as \"Requested:Float:90\",\n tabBin.reserved_qty as \"Reserved:Float:90\",\n tabBin.ordered_qty as \"Ordered:Float:90\",\n tabBin.projected_qty as \"Projected:Float:90\"\nFROM\n tabBin, tabItem\nWHERE\n tabBin.item_code = tabItem.name\n AND tabItem.is_purchase_item = 1\n AND tabBin.projected_qty < 0\nORDER BY\n tabBin.projected_qty ASC", - "ref_doctype": "Item", - "report_name": "Items To Be Requested", + "ref_doctype": "Item", + "report_name": "Items To Be Requested", "report_type": "Query Report" -} +} \ No newline at end of file diff --git a/erpnext/stock/report/ordered_items_to_be_delivered/ordered_items_to_be_delivered.json b/erpnext/stock/report/ordered_items_to_be_delivered/ordered_items_to_be_delivered.json index 6f857a0b83..4d565193d9 100644 --- a/erpnext/stock/report/ordered_items_to_be_delivered/ordered_items_to_be_delivered.json +++ b/erpnext/stock/report/ordered_items_to_be_delivered/ordered_items_to_be_delivered.json @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2015-11-04 12:00:40.085130", + "modified": "2016-04-01 08:27:03.318987", "modified_by": "Administrator", "module": "Stock", "name": "Ordered Items To Be Delivered", diff --git a/erpnext/stock/report/purchase_order_items_to_be_received/purchase_order_items_to_be_received.json b/erpnext/stock/report/purchase_order_items_to_be_received/purchase_order_items_to_be_received.json index d62bf76a57..fd78f28bb1 100644 --- a/erpnext/stock/report/purchase_order_items_to_be_received/purchase_order_items_to_be_received.json +++ b/erpnext/stock/report/purchase_order_items_to_be_received/purchase_order_items_to_be_received.json @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2015-11-04 12:01:22.108641", + "modified": "2016-04-01 08:26:59.904034", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Order Items To Be Received", diff --git a/erpnext/support/doctype/warranty_claim/warranty_claim.js b/erpnext/support/doctype/warranty_claim/warranty_claim.js index 25d65e34a9..39285779d7 100644 --- a/erpnext/support/doctype/warranty_claim/warranty_claim.js +++ b/erpnext/support/doctype/warranty_claim/warranty_claim.js @@ -85,13 +85,18 @@ cur_frm.add_fetch('item_code', 'description', 'description'); cur_frm.fields_dict['item_code'].get_query = function(doc, cdt, cdn) { if(doc.serial_no) { return{ - filters:{ 'serial_no': doc.serial_no} + doctype: "Serial No", + fields: "item_code", + filters:{ + name: doc.serial_no + } } } else{ return{ filters:[ - ['Item', 'docstatus', '!=', 2] + ['Item', 'docstatus', '!=', 2], + ['Item', 'disabled', '=', 0] ] } } diff --git a/setup.py b/setup.py index 581e065565..eb7c1ef51a 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.8" requirements = parse_requirements("requirements.txt", session="") setup( diff --git a/travis/bench_init.sh b/travis/bench_init.sh new file mode 100755 index 0000000000..a8bb492ae9 --- /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 +)