Merge pull request #4420 from rmehta/stock-entry-fix
[minor] allow stock entry for manufacture without production order
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js
index b1c355b..479eaaf 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.js
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js
@@ -368,10 +368,6 @@
credit: function(frm, dt, dn) {
cur_frm.cscript.update_totals(frm.doc);
- },
-
- exchange_rate: function(frm, cdt, cdn) {
- erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn);
}
})
@@ -418,7 +414,7 @@
if(row.account_currency == company_currency || !frm.doc.multi_currency) {
frappe.model.set_value(cdt, cdn, "exchange_rate", 1);
- } else if (!row.exchange_rate || row.account_type == "Bank") {
+ } else if (!row.exchange_rate || row.exchange_rate == 1 || row.account_type == "Bank") {
frappe.call({
method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_exchange_rate",
args: {
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index 8eaef8b..ec22483 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -295,7 +295,7 @@
for d in self.get("accounts"):
if d.account_currency == self.company_currency:
d.exchange_rate = 1
- elif not d.exchange_rate or d.account_type=="Bank" or \
+ elif not d.exchange_rate or d.exchange_rate == 1 or \
(d.reference_type in ("Sales Invoice", "Purchase Invoice") and d.reference_name):
d.exchange_rate = get_exchange_rate(d.account, d.account_currency, self.company,
d.reference_type, d.reference_name, d.debit, d.credit, d.exchange_rate)
diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.js b/erpnext/accounts/doctype/tax_rule/tax_rule.js
index 4b059dc..4c35370 100644
--- a/erpnext/accounts/doctype/tax_rule/tax_rule.js
+++ b/erpnext/accounts/doctype/tax_rule/tax_rule.js
@@ -4,19 +4,26 @@
cur_frm.add_fetch("customer", "customer_group", "customer_group" );
cur_frm.add_fetch("supplier", "supplier_type", "supplier_type" );
-cur_frm.toggle_reqd("sales_tax_template", cur_frm.doc.tax_type=="Sales");
-cur_frm.toggle_reqd("purchase_tax_template", cur_frm.doc.tax_type=="Purchase");
-
+frappe.ui.form.on("Tax Rule", "tax_type", function(frm) {
+ frm.toggle_reqd("sales_tax_template", frm.doc.tax_type=="Sales");
+ frm.toggle_reqd("purchase_tax_template", frm.doc.tax_type=="Purchase");
+})
frappe.ui.form.on("Tax Rule", "onload", function(frm) {
- if(frm.doc.__islocal){
+ if(frm.doc.__islocal) {
frm.set_value("use_for_shopping_cart", 1);
}
})
+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(!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"));
diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.js b/erpnext/accounts/page/accounts_browser/accounts_browser.js
index 6a2a831..403c1ce 100644
--- a/erpnext/accounts/page/accounts_browser/accounts_browser.js
+++ b/erpnext/accounts/page/accounts_browser/accounts_browser.js
@@ -166,7 +166,10 @@
var dr_or_cr = node.data.balance < 0 ? "Cr" : "Dr";
if (me.ctype == 'Account' && node.data && node.data.balance!==undefined) {
$('<span class="balance-area pull-right text-muted small">'
- + format_currency(Math.abs(node.data.balance), node.data.account_currency)
+ + (node.data.balance_in_account_currency ?
+ (format_currency(Math.abs(node.data.balance_in_account_currency),
+ node.data.account_currency) + " / ") : "")
+ + format_currency(Math.abs(node.data.balance), node.data.company_currency)
+ " " + dr_or_cr
+ '</span>').insertBefore(node.$ul);
}
diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.py b/erpnext/accounts/page/accounts_browser/accounts_browser.py
index 210c4bf..891a05d 100644
--- a/erpnext/accounts/page/accounts_browser/accounts_browser.py
+++ b/erpnext/accounts/page/accounts_browser/accounts_browser.py
@@ -44,7 +44,12 @@
args['parent'], as_dict=1)
if ctype == 'Account':
+ company_currency = frappe.db.get_value("Company", company, "default_currency")
for each in acc:
- each["balance"] = flt(get_balance_on(each.get("value")))
+ each["company_currency"] = company_currency
+ each["balance"] = flt(get_balance_on(each.get("value"), in_account_currency=False))
+
+ if each.account_currency != company_currency:
+ each["balance_in_account_currency"] = flt(get_balance_on(each.get("value")))
return acc
diff --git a/erpnext/hr/doctype/holiday_list/test_records.json b/erpnext/hr/doctype/holiday_list/test_records.json
index 342bacb..a8cf56b 100644
--- a/erpnext/hr/doctype/holiday_list/test_records.json
+++ b/erpnext/hr/doctype/holiday_list/test_records.json
@@ -8,6 +8,10 @@
"holiday_date": "2013-01-01"
},
{
+ "description": "Republic Day",
+ "holiday_date": "2013-01-26"
+ },
+ {
"description": "Test Holiday",
"holiday_date": "2013-02-01"
}
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index ea7c96e..818c95e 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -4,7 +4,7 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import add_days, cint, cstr, flt, getdate, nowdate, rounded
+from frappe.utils import add_days, cint, cstr, flt, getdate, nowdate, rounded, date_diff
from frappe.model.naming import make_autoname
from frappe import msgprint, _
@@ -20,19 +20,20 @@
def get_emp_and_leave_details(self):
if self.employee:
- self.get_leave_details()
- struct = self.check_sal_struct()
+ joining_date, relieving_date = frappe.db.get_value("Employee", self.employee,
+ ["date_of_joining", "relieving_date"])
+
+ self.get_leave_details(joining_date, relieving_date)
+
+ struct = self.check_sal_struct(joining_date, relieving_date)
if struct:
self.set("earnings", [])
self.set("deduction", [])
self.pull_sal_struct(struct)
- def check_sal_struct(self):
+ def check_sal_struct(self, joining_date, relieving_date):
m = get_month_details(self.fiscal_year, self.month)
- joining_date, relieving_date = frappe.db.get_value("Employee", self.employee,
- ["date_of_joining", "relieving_date"])
-
struct = frappe.db.sql("""select name from `tabSalary Structure`
where employee=%s and is_active = 'Yes'
and (from_date <= %s or from_date <= %s)
@@ -51,69 +52,76 @@
make_salary_slip(struct, self)
def pull_emp_details(self):
- emp = frappe.db.get_value("Employee", self.employee,
- ["bank_name", "bank_ac_no"], as_dict=1)
+ emp = frappe.db.get_value("Employee", self.employee, ["bank_name", "bank_ac_no"], as_dict=1)
if emp:
self.bank_name = emp.bank_name
self.bank_account_no = emp.bank_ac_no
- def get_leave_details(self, lwp=None):
+ 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 not self.month:
self.month = "%02d" % getdate(nowdate()).month
+
+ if not joining_date:
+ joining_date, relieving_date = frappe.db.get_value("Employee", self.employee,
+ ["date_of_joining", "relieving_date"])
m = get_month_details(self.fiscal_year, self.month)
- holidays = self.get_holidays_for_employee(m)
+ holidays = self.get_holidays_for_employee(m['month_start_date'], m['month_end_date'])
- if not cint(frappe.db.get_value("HR Settings", "HR Settings",
- "include_holidays_in_total_working_days")):
- m["month_days"] -= len(holidays)
- if m["month_days"] < 0:
- frappe.throw(_("There are more holidays than working days this month."))
+ working_days = m["month_days"]
+ if not cint(frappe.db.get_value("HR Settings", None, "include_holidays_in_total_working_days")):
+ working_days -= len(holidays)
+ if working_days < 0:
+ frappe.throw(_("There are more holidays than working days this month."))
if not lwp:
lwp = self.calculate_lwp(holidays, m)
- self.total_days_in_month = m['month_days']
+ self.total_days_in_month = working_days
self.leave_without_pay = lwp
- payment_days = flt(self.get_payment_days(m)) - flt(lwp)
+ payment_days = flt(self.get_payment_days(m, joining_date, relieving_date)) - flt(lwp)
self.payment_days = payment_days > 0 and payment_days or 0
+
+ def get_payment_days(self, month, joining_date, relieving_date):
+ start_date = month['month_start_date']
+ if joining_date:
+ if joining_date > month['month_start_date']:
+ start_date = joining_date
+ elif joining_date > month['month_end_date']:
+ return
+
+ if relieving_date:
+ if relieving_date > start_date and relieving_date < month['month_end_date']:
+ end_date = relieving_date
+ elif relieving_date < month['month_start_date']:
+ frappe.throw(_("Employee relieved on {0} must be set as 'Left'").format(relieving_date))
+ else:
+ end_date = month['month_end_date']
+
+ payment_days = date_diff(end_date, start_date) + 1
-
- def get_payment_days(self, m):
- payment_days = m['month_days']
- emp = frappe.db.sql("select date_of_joining, relieving_date from `tabEmployee` \
- where name = %s", self.employee, as_dict=1)[0]
-
- if emp['relieving_date']:
- if getdate(emp['relieving_date']) > m['month_start_date'] and \
- getdate(emp['relieving_date']) < m['month_end_date']:
- payment_days = getdate(emp['relieving_date']).day
- elif getdate(emp['relieving_date']) < m['month_start_date']:
- frappe.throw(_("Employee relieved on {0} must be set as 'Left'").format(emp["relieving_date"]))
-
- if emp['date_of_joining']:
- if getdate(emp['date_of_joining']) > m['month_start_date'] and \
- getdate(emp['date_of_joining']) < m['month_end_date']:
- payment_days = payment_days - getdate(emp['date_of_joining']).day + 1
- elif getdate(emp['date_of_joining']) > m['month_end_date']:
- payment_days = 0
+ if not cint(frappe.db.get_value("HR Settings", None, "include_holidays_in_total_working_days")):
+ holidays = self.get_holidays_for_employee(start_date, end_date)
+ payment_days -= len(holidays)
return payment_days
- def get_holidays_for_employee(self, m):
+ def get_holidays_for_employee(self, start_date, end_date):
holidays = frappe.db.sql("""select t1.holiday_date
from `tabHoliday` t1, tabEmployee t2
where t1.parent = t2.holiday_list and t2.name = %s
and t1.holiday_date between %s and %s""",
- (self.employee, m['month_start_date'], m['month_end_date']))
+ (self.employee, start_date, end_date))
+
if not holidays:
holidays = frappe.db.sql("""select t1.holiday_date
from `tabHoliday` t1, `tabHoliday List` t2
where t1.parent = t2.name and t2.is_default = 1
and t2.fiscal_year = %s
- and t1.holiday_date between %s and %s""", (self.fiscal_year,
- m['month_start_date'], m['month_end_date']))
+ and t1.holiday_date between %s and %s""",
+ (self.fiscal_year, start_date, end_date))
+
holidays = [cstr(i[0]) for i in holidays]
return holidays
@@ -148,11 +156,10 @@
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()
+ if not (len(self.get("earnings")) or len(self.get("deductions"))):
+ self.get_emp_and_leave_details()
else:
- self.get_leave_details(self.leave_without_pay)
+ self.get_leave_details(lwp = self.leave_without_pay)
if not self.net_pay:
self.calculate_net_pay()
diff --git a/erpnext/hr/doctype/salary_slip/test_salary_slip.py b/erpnext/hr/doctype/salary_slip/test_salary_slip.py
index 9eda231..387c593 100644
--- a/erpnext/hr/doctype/salary_slip/test_salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/test_salary_slip.py
@@ -25,11 +25,11 @@
la.submit()
def tearDown(self):
- frappe.db.set_value("HR Settings", "HR Settings", "include_holidays_in_total_working_days", 0)
+ frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0)
frappe.set_user("Administrator")
def test_salary_slip_with_holidays_included(self):
- frappe.db.set_value("HR Settings", "HR Settings", "include_holidays_in_total_working_days", 1)
+ frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 1)
ss = frappe.copy_doc(test_records[0])
ss.insert()
@@ -43,18 +43,46 @@
self.assertEquals(ss.net_pay, 14867.74)
def test_salary_slip_with_holidays_excluded(self):
- frappe.db.set_value("HR Settings", "HR Settings", "include_holidays_in_total_working_days", 0)
+ frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0)
ss = frappe.copy_doc(test_records[0])
ss.insert()
- self.assertEquals(ss.total_days_in_month, 30)
- self.assertEquals(ss.payment_days, 29)
- self.assertEquals(ss.earnings[0].e_modified_amount, 14500)
+ self.assertEquals(ss.total_days_in_month, 29)
+ self.assertEquals(ss.payment_days, 28)
+ self.assertEquals(ss.earnings[0].e_modified_amount, 14482.76)
self.assertEquals(ss.earnings[1].e_modified_amount, 500)
self.assertEquals(ss.deductions[0].d_modified_amount, 100)
- self.assertEquals(ss.deductions[1].d_modified_amount, 48.33)
- self.assertEquals(ss.gross_pay, 15000)
- self.assertEquals(ss.net_pay, 14851.67)
+ self.assertEquals(ss.deductions[1].d_modified_amount, 48.28)
+ self.assertEquals(ss.gross_pay, 14982.76)
+ self.assertEquals(ss.net_pay, 14834.48)
+
+ def test_payment_days(self):
+ # Holidays not included in working days
+ frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0)
+
+ # set joinng date in the same month
+ frappe.db.set_value("Employee", "_T-Employee-0001", "date_of_joining", "2013-01-11")
+
+ ss = frappe.copy_doc(test_records[0])
+ ss.insert()
+
+ self.assertEquals(ss.total_days_in_month, 29)
+ self.assertEquals(ss.payment_days, 19)
+
+ # set relieving date in the same month
+ frappe.db.set_value("Employee", "_T-Employee-0001", "relieving_date", "2013-01-28")
+ ss.save()
+ self.assertEquals(ss.total_days_in_month, 29)
+ self.assertEquals(ss.payment_days, 16)
+
+ # Holidays included in working days
+ frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 1)
+ ss.save()
+ self.assertEquals(ss.total_days_in_month, 31)
+ self.assertEquals(ss.payment_days, 17)
+
+ frappe.db.set_value("Employee", "_T-Employee-0001", "date_of_joining", "2001-01-11")
+ frappe.db.set_value("Employee", "_T-Employee-0001", "relieving_date", None)
def test_employee_salary_slip_read_permission(self):
self.make_employee("test_employee@example.com")