Merge branch 'develop'
This commit is contained in:
commit
e3910d02a5
@ -1,2 +1,2 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
__version__ = '6.6.0'
|
__version__ = '6.6.1'
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import frappe
|
|||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.utils import flt, fmt_money, getdate, formatdate
|
from frappe.utils import flt, fmt_money, getdate, formatdate
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from erpnext.accounts.party import validate_party_gle_currency, get_party_account_currency
|
from erpnext.accounts.party import validate_party_gle_currency
|
||||||
from erpnext.accounts.utils import get_account_currency
|
from erpnext.accounts.utils import get_account_currency
|
||||||
from erpnext.setup.doctype.company.company import get_company_currency
|
from erpnext.setup.doctype.company.company import get_company_currency
|
||||||
from erpnext.exceptions import InvalidAccountCurrency, CustomerFrozen
|
from erpnext.exceptions import InvalidAccountCurrency, CustomerFrozen
|
||||||
@ -114,13 +114,7 @@ class GLEntry(Document):
|
|||||||
.format(self.account, (account_currency or company_currency)), InvalidAccountCurrency)
|
.format(self.account, (account_currency or company_currency)), InvalidAccountCurrency)
|
||||||
|
|
||||||
if self.party_type and self.party:
|
if self.party_type and self.party:
|
||||||
party_account_currency = get_party_account_currency(self.party_type, self.party, self.company)
|
validate_party_gle_currency(self.party_type, self.party, self.company, self.account_currency)
|
||||||
|
|
||||||
if party_account_currency != self.account_currency:
|
|
||||||
frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}")
|
|
||||||
.format(self.party_type, self.party, party_account_currency), InvalidAccountCurrency)
|
|
||||||
|
|
||||||
validate_party_gle_currency(self.party_type, self.party, self.company)
|
|
||||||
|
|
||||||
def validate_balance_type(account, adv_adj=False):
|
def validate_balance_type(account, adv_adj=False):
|
||||||
if not adv_adj and account:
|
if not adv_adj and account:
|
||||||
|
|||||||
@ -203,9 +203,11 @@ def get_party_gle_currency(party_type, party, company):
|
|||||||
|
|
||||||
return frappe.local_cache("party_gle_currency", (party_type, party, company), generator)
|
return frappe.local_cache("party_gle_currency", (party_type, party, company), generator)
|
||||||
|
|
||||||
def validate_party_gle_currency(party_type, party, company):
|
def validate_party_gle_currency(party_type, party, company, party_account_currency=None):
|
||||||
"""Validate party account currency with existing GL Entry's currency"""
|
"""Validate party account currency with existing GL Entry's currency"""
|
||||||
party_account_currency = get_party_account_currency(party_type, party, company)
|
if not party_account_currency:
|
||||||
|
party_account_currency = get_party_account_currency(party_type, party, company)
|
||||||
|
|
||||||
existing_gle_currency = get_party_gle_currency(party_type, party, company)
|
existing_gle_currency = get_party_gle_currency(party_type, party, company)
|
||||||
|
|
||||||
if existing_gle_currency and party_account_currency != existing_gle_currency:
|
if existing_gle_currency and party_account_currency != existing_gle_currency:
|
||||||
@ -221,10 +223,10 @@ def validate_party_accounts(doc):
|
|||||||
.format(doc.doctype, doc.name), DuplicatePartyAccountError)
|
.format(doc.doctype, doc.name), DuplicatePartyAccountError)
|
||||||
else:
|
else:
|
||||||
companies.append(account.company)
|
companies.append(account.company)
|
||||||
|
|
||||||
party_account_currency = frappe.db.get_value("Account", account.account, "account_currency")
|
party_account_currency = frappe.db.get_value("Account", account.account, "account_currency")
|
||||||
existing_gle_currency = get_party_gle_currency(doc.doctype, doc.name, account.company)
|
existing_gle_currency = get_party_gle_currency(doc.doctype, doc.name, account.company)
|
||||||
|
|
||||||
if existing_gle_currency and party_account_currency != existing_gle_currency:
|
if existing_gle_currency and party_account_currency != existing_gle_currency:
|
||||||
frappe.throw(_("Accounting entries have already been made in currency {0} for company {1}. Please select a receivable or payable account with currency {0}.").format(existing_gle_currency, account.company))
|
frappe.throw(_("Accounting entries have already been made in currency {0} for company {1}. Please select a receivable or payable account with currency {0}.").format(existing_gle_currency, account.company))
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ from erpnext.accounts.utils import get_fiscal_year, validate_fiscal_year, get_ac
|
|||||||
from erpnext.utilities.transaction_base import TransactionBase
|
from erpnext.utilities.transaction_base import TransactionBase
|
||||||
from erpnext.controllers.recurring_document import convert_to_recurring, validate_recurring_document
|
from erpnext.controllers.recurring_document import convert_to_recurring, validate_recurring_document
|
||||||
from erpnext.controllers.sales_and_purchase_return import validate_return
|
from erpnext.controllers.sales_and_purchase_return import validate_return
|
||||||
from erpnext.accounts.party import get_party_account_currency, validate_party_gle_currency
|
from erpnext.accounts.party import get_party_account_currency
|
||||||
from erpnext.exceptions import CustomerFrozen, InvalidCurrency
|
from erpnext.exceptions import CustomerFrozen, InvalidCurrency
|
||||||
|
|
||||||
force_item_fields = ("item_group", "barcode", "brand", "stock_uom")
|
force_item_fields = ("item_group", "barcode", "brand", "stock_uom")
|
||||||
@ -435,6 +435,8 @@ class AccountsController(TransactionBase):
|
|||||||
frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}")
|
frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}")
|
||||||
.format(party_type, party, party_account_currency), InvalidCurrency)
|
.format(party_type, party, party_account_currency), InvalidCurrency)
|
||||||
|
|
||||||
|
# Note: not validating with gle account because we don't have the account at quotation / sales order level and we shouldn't stop someone from creating a sales invoice if sales order is already created
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_tax_rate(account_head):
|
def get_tax_rate(account_head):
|
||||||
return frappe.db.get_value("Account", account_head, "tax_rate")
|
return frappe.db.get_value("Account", account_head, "tax_rate")
|
||||||
|
|||||||
@ -29,7 +29,7 @@ blogs.
|
|||||||
"""
|
"""
|
||||||
app_icon = "icon-th"
|
app_icon = "icon-th"
|
||||||
app_color = "#e74c3c"
|
app_color = "#e74c3c"
|
||||||
app_version = "6.6.0"
|
app_version = "6.6.1"
|
||||||
github_link = "https://github.com/frappe/erpnext"
|
github_link = "https://github.com/frappe/erpnext"
|
||||||
|
|
||||||
error_report_email = "support@erpnext.com"
|
error_report_email = "support@erpnext.com"
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
// License: GNU General Public License v3. See license.txt
|
// License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
cur_frm.add_fetch('employee','employee_name','employee_name');
|
cur_frm.add_fetch('employee','employee_name','employee_name');
|
||||||
|
cur_frm.add_fetch('employee','company','company');
|
||||||
|
|
||||||
frappe.ui.form.on("Leave Application", {
|
frappe.ui.form.on("Leave Application", {
|
||||||
onload: function(frm) {
|
onload: function(frm) {
|
||||||
|
|||||||
@ -8,13 +8,13 @@ from frappe.utils import cstr
|
|||||||
def execute():
|
def execute():
|
||||||
for company in frappe.db.sql("select name, expenses_included_in_valuation from tabCompany", as_dict=1):
|
for company in frappe.db.sql("select name, expenses_included_in_valuation from tabCompany", as_dict=1):
|
||||||
frozen_date = get_frozen_date(company.name, company.expenses_included_in_valuation)
|
frozen_date = get_frozen_date(company.name, company.expenses_included_in_valuation)
|
||||||
|
|
||||||
# Purchase Invoices after frozen date
|
# Purchase Invoices after frozen date
|
||||||
# which are not against Receipt, but valuation related tax is there
|
# which are not against Receipt, but valuation related tax is there
|
||||||
pi_list = frappe.db.sql("""
|
pi_list = frappe.db.sql("""
|
||||||
select distinct pi.name
|
select distinct pi.name
|
||||||
from `tabPurchase Invoice` pi, `tabPurchase Invoice Item` pi_item
|
from `tabPurchase Invoice` pi, `tabPurchase Invoice Item` pi_item
|
||||||
where
|
where
|
||||||
pi.name = pi_item.parent
|
pi.name = pi_item.parent
|
||||||
and pi.company = %s
|
and pi.company = %s
|
||||||
and pi.posting_date > %s
|
and pi.posting_date > %s
|
||||||
@ -25,40 +25,50 @@ def execute():
|
|||||||
and (pi_item.item_code is not null and pi_item.item_code != '')
|
and (pi_item.item_code is not null and pi_item.item_code != '')
|
||||||
and exists(select name from `tabItem` where name=pi_item.item_code and is_stock_item=1)
|
and exists(select name from `tabItem` where name=pi_item.item_code and is_stock_item=1)
|
||||||
""", (company.name, frozen_date), as_dict=1)
|
""", (company.name, frozen_date), as_dict=1)
|
||||||
|
|
||||||
for pi in pi_list:
|
for pi in pi_list:
|
||||||
# Check whether gle exists for Expenses Included in Valuation account against the PI
|
# Check whether gle exists for Expenses Included in Valuation account against the PI
|
||||||
gle_for_expenses_included_in_valuation = frappe.db.sql("""select name from `tabGL Entry`
|
gle_for_expenses_included_in_valuation = frappe.db.sql("""select name from `tabGL Entry`
|
||||||
where voucher_type='Purchase Invoice' and voucher_no=%s and account=%s""",
|
where voucher_type='Purchase Invoice' and voucher_no=%s and account=%s""",
|
||||||
(pi.name, company.expenses_included_in_valuation))
|
(pi.name, company.expenses_included_in_valuation))
|
||||||
|
|
||||||
if gle_for_expenses_included_in_valuation:
|
if gle_for_expenses_included_in_valuation:
|
||||||
|
print pi.name
|
||||||
|
|
||||||
frappe.db.sql("""delete from `tabGL Entry`
|
frappe.db.sql("""delete from `tabGL Entry`
|
||||||
where voucher_type='Purchase Invoice' and voucher_no=%s""", pi.name)
|
where voucher_type='Purchase Invoice' and voucher_no=%s""", pi.name)
|
||||||
|
|
||||||
purchase_invoice = frappe.get_doc("Purchase Invoice", pi.name)
|
purchase_invoice = frappe.get_doc("Purchase Invoice", pi.name)
|
||||||
|
|
||||||
|
# some old entries have missing expense accounts
|
||||||
|
if purchase_invoice.against_expense_account:
|
||||||
|
expense_account = purchase_invoice.against_expense_account.split(",")
|
||||||
|
if len(expense_account) == 1:
|
||||||
|
expense_account = expense_account[0]
|
||||||
|
for item in purchase_invoice.items:
|
||||||
|
if not item.expense_account:
|
||||||
|
item.db_set("expense_account", expense_account, update_modified=False)
|
||||||
|
|
||||||
purchase_invoice.make_gl_entries()
|
purchase_invoice.make_gl_entries()
|
||||||
|
|
||||||
print pi.name
|
|
||||||
|
|
||||||
def get_frozen_date(company, account):
|
def get_frozen_date(company, account):
|
||||||
# Accounting frozen upto
|
# Accounting frozen upto
|
||||||
accounts_frozen_upto = frappe.db.get_single_value("Accounts Settings", "acc_frozen_upto")
|
accounts_frozen_upto = frappe.db.get_single_value("Accounts Settings", "acc_frozen_upto")
|
||||||
|
|
||||||
# Last adjustment entry to correct Expenses Included in Valuation account balance
|
# Last adjustment entry to correct Expenses Included in Valuation account balance
|
||||||
last_adjustment_entry = frappe.db.sql("""select posting_date from `tabGL Entry`
|
last_adjustment_entry = frappe.db.sql("""select posting_date from `tabGL Entry`
|
||||||
where account=%s and company=%s and voucher_type = 'Journal Entry'
|
where account=%s and company=%s and voucher_type = 'Journal Entry'
|
||||||
order by posting_date desc limit 1""", (account, company))
|
order by posting_date desc limit 1""", (account, company))
|
||||||
|
|
||||||
last_adjustment_date = cstr(last_adjustment_entry[0][0]) if last_adjustment_entry else None
|
last_adjustment_date = cstr(last_adjustment_entry[0][0]) if last_adjustment_entry else None
|
||||||
|
|
||||||
# Last period closing voucher
|
# Last period closing voucher
|
||||||
last_closing_entry = frappe.db.sql("""select posting_date from `tabGL Entry`
|
last_closing_entry = frappe.db.sql("""select posting_date from `tabGL Entry`
|
||||||
where company=%s and voucher_type = 'Period Closing Voucher'
|
where company=%s and voucher_type = 'Period Closing Voucher'
|
||||||
order by posting_date desc limit 1""", company)
|
order by posting_date desc limit 1""", company)
|
||||||
|
|
||||||
last_closing_date = cstr(last_closing_entry[0][0]) if last_closing_entry else None
|
last_closing_date = cstr(last_closing_entry[0][0]) if last_closing_entry else None
|
||||||
|
|
||||||
frozen_date = max([accounts_frozen_upto, last_adjustment_date, last_closing_date])
|
frozen_date = max([accounts_frozen_upto, last_adjustment_date, last_closing_date])
|
||||||
|
|
||||||
return frozen_date or '1900-01-01'
|
return frozen_date or '1900-01-01'
|
||||||
|
|||||||
2
setup.py
2
setup.py
@ -1,6 +1,6 @@
|
|||||||
from setuptools import setup, find_packages
|
from setuptools import setup, find_packages
|
||||||
|
|
||||||
version = "6.6.0"
|
version = "6.6.1"
|
||||||
|
|
||||||
with open("requirements.txt", "r") as f:
|
with open("requirements.txt", "r") as f:
|
||||||
install_requires = f.readlines()
|
install_requires = f.readlines()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user