Merge pull request #5919 from bcornwellmott/timesheet_dates
Timesheets update on date changes in Salary Slip
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index b592739..4470592 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -2,7 +2,7 @@
from __future__ import unicode_literals
import frappe
-__version__ = '7.0.10'
+__version__ = '7.0.11'
def get_default_company(user=None):
'''Get default company for user'''
diff --git a/erpnext/accounts/report/accounts_payable/accounts_payable.html b/erpnext/accounts/report/accounts_payable/accounts_payable.html
index 07f9e47..d3020b2 100644
--- a/erpnext/accounts/report/accounts_payable/accounts_payable.html
+++ b/erpnext/accounts/report/accounts_payable/accounts_payable.html
@@ -1 +1 @@
-{% include "erpnext/accounts/report/accounts_receivable/accounts_receivable.html" %}
+{% include "accounts/report/accounts_receivable/accounts_receivable.html" %}
diff --git a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html
index 07f9e47..d3020b2 100644
--- a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html
+++ b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html
@@ -1 +1 @@
-{% include "erpnext/accounts/report/accounts_receivable/accounts_receivable.html" %}
+{% include "accounts/report/accounts_receivable/accounts_receivable.html" %}
diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html
index 07f9e47..d3020b2 100644
--- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html
+++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html
@@ -1 +1 @@
-{% include "erpnext/accounts/report/accounts_receivable/accounts_receivable.html" %}
+{% include "accounts/report/accounts_receivable/accounts_receivable.html" %}
diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.html b/erpnext/accounts/report/balance_sheet/balance_sheet.html
index 14dc0a6..d4ae54d 100644
--- a/erpnext/accounts/report/balance_sheet/balance_sheet.html
+++ b/erpnext/accounts/report/balance_sheet/balance_sheet.html
@@ -1 +1 @@
-{% include "erpnext/accounts/report/financial_statements.html" %}
+{% include "accounts/report/financial_statements.html" %}
diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html
index 14dc0a6..d4ae54d 100644
--- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html
+++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html
@@ -1 +1 @@
-{% include "erpnext/accounts/report/financial_statements.html" %}
+{% include "accounts/report/financial_statements.html" %}
diff --git a/erpnext/accounts/report/trial_balance/trial_balance.html b/erpnext/accounts/report/trial_balance/trial_balance.html
index 14dc0a6..d4ae54d 100644
--- a/erpnext/accounts/report/trial_balance/trial_balance.html
+++ b/erpnext/accounts/report/trial_balance/trial_balance.html
@@ -1 +1 @@
-{% include "erpnext/accounts/report/financial_statements.html" %}
+{% include "accounts/report/financial_statements.html" %}
diff --git a/erpnext/demo/setup_data.py b/erpnext/demo/setup_data.py
index 3367527..cb33cb1 100644
--- a/erpnext/demo/setup_data.py
+++ b/erpnext/demo/setup_data.py
@@ -32,6 +32,7 @@
setup_employee()
setup_salary_structure()
setup_salary_structure_for_timesheet()
+ setup_leave_allocation()
setup_mode_of_payment()
setup_account_to_expense_type()
setup_user_roles()
@@ -430,3 +431,23 @@
})
pos.insert()
+
+def setup_leave_allocation():
+ year = now_datetime().year
+ for employee in frappe.get_all('Employee', fields=['name']):
+ leave_types = frappe.get_all("Leave Type", fields=['name', 'max_days_allowed'])
+ for leave_type in leave_types:
+ if not leave_type.max_days_allowed:
+ leave_type.max_days_allowed = 10
+
+ leave_allocation = frappe.get_doc({
+ "doctype": "Leave Allocation",
+ "employee": employee.name,
+ "from_date": "{0}-01-01".format(year),
+ "to_date": "{0}-12-31".format(year),
+ "leave_type": leave_type.name,
+ "new_leaves_allocated": random.randint(1, int(leave_type.max_days_allowed))
+ })
+ leave_allocation.insert()
+ leave_allocation.submit()
+ frappe.db.commit()
diff --git a/erpnext/demo/user/hr.py b/erpnext/demo/user/hr.py
index 28966ec..3d5ac83 100644
--- a/erpnext/demo/user/hr.py
+++ b/erpnext/demo/user/hr.py
@@ -1,15 +1,19 @@
from __future__ import unicode_literals
import frappe
import random
-from frappe.utils import random_string
+from frappe.utils import random_string, add_days
from erpnext.projects.doctype.timesheet.test_timesheet import make_timesheet
from erpnext.projects.doctype.timesheet.timesheet import make_salary_slip, make_sales_invoice
from frappe.utils.make_random import how_many, get_random
from erpnext.hr.doctype.expense_claim.expense_claim import get_expense_approver, make_bank_entry
+from erpnext.hr.doctype.leave_application.leave_application import get_leave_balance_on, OverlapError
def work():
frappe.set_user(frappe.db.get_global('demo_hr_user'))
year, month = frappe.flags.current_date.strftime("%Y-%m").split("-")
+
+ mark_attendance()
+ make_leave_application()
# process payroll
if not frappe.db.get_value("Salary Slip", {"month": month, "fiscal_year": year}):
@@ -123,4 +127,53 @@
sales_invoice.calculate_taxes_and_totals()
sales_invoice.insert()
sales_invoice.submit()
- frappe.db.commit()
\ No newline at end of file
+ frappe.db.commit()
+
+def make_leave_application():
+ allocated_leaves = frappe.get_all("Leave Allocation", fields=['employee', 'leave_type'])
+
+ for allocated_leave in allocated_leaves:
+ leave_balance = get_leave_balance_on(allocated_leave.employee, allocated_leave.leave_type, frappe.flags.current_date,
+ consider_all_leaves_in_the_allocation_period=True)
+ if leave_balance != 0:
+ if leave_balance == 1:
+ to_date = frappe.flags.current_date
+ else:
+ to_date = add_days(frappe.flags.current_date, random.randint(0, leave_balance-1))
+
+ leave_application = frappe.get_doc({
+ "doctype": "Leave Application",
+ "employee": allocated_leave.employee,
+ "from_date": frappe.flags.current_date,
+ "to_date": to_date,
+ "leave_type": allocated_leave.leave_type,
+ "status": "Approved"
+ })
+ try:
+ leave_application.insert()
+ leave_application.submit()
+ frappe.db.commit()
+ except (OverlapError):
+ frappe.db.rollback()
+
+def mark_attendance():
+ att_date = frappe.flags.current_date
+ for employee in frappe.get_all('Employee', fields=['name'], filters = {'status': 'Active'}):
+
+ if not frappe.db.get_value("Attendance", {"employee": employee.name, "att_date": att_date}):
+ attendance = frappe.get_doc({
+ "doctype": "Attendance",
+ "employee": employee.name,
+ "att_date": att_date
+ })
+ leave = frappe.db.sql("""select name from `tabLeave Application`
+ where employee = %s and %s between from_date and to_date and status = 'Approved'
+ and docstatus = 1""", (employee.name, att_date))
+
+ if leave:
+ attendance.status = "Absent"
+ else:
+ attendance.status = "Present"
+ attendance.save()
+ attendance.submit()
+ frappe.db.commit()
\ No newline at end of file
diff --git a/erpnext/docs/user/manual/en/website/setup/social-login-keys.md b/erpnext/docs/user/manual/en/website/setup/social-login-keys.md
index b8784a3..bb1329f 100644
--- a/erpnext/docs/user/manual/en/website/setup/social-login-keys.md
+++ b/erpnext/docs/user/manual/en/website/setup/social-login-keys.md
@@ -5,7 +5,9 @@
Checkout the following Video Tutorials to understand how to enable social logins on ERPNext
* for FaceBook - https://www.youtube.com/watch?v=zC6Q6gIfiw8
-* for Google - https://www.youtube.com/watch?v=w_EAttrE9sw
+* for Google - https://www.youtube.com/watch?v=w_EAttrE9sw
* for GitHub - https://www.youtube.com/watch?v=bG71DxxkVjQ
-{next}
\ No newline at end of file
+For Google the *Authorized redirect URI* is [yoursite]/api/method/frappe.www.login.login_via_google
+
+{next}
diff --git a/erpnext/portal/doctype/homepage/homepage.js b/erpnext/portal/doctype/homepage/homepage.js
index df7f5ce..100074f 100644
--- a/erpnext/portal/doctype/homepage/homepage.js
+++ b/erpnext/portal/doctype/homepage/homepage.js
@@ -15,7 +15,7 @@
method: 'frappe.client.get_value',
args: {
'doctype': 'Item',
- 'filters': featured_product.item_code,
+ 'filters': {'name': featured_product.item_code},
'fieldname': [
'item_name',
'web_long_description',
diff --git a/erpnext/projects/doctype/timesheet/timesheet.py b/erpnext/projects/doctype/timesheet/timesheet.py
index 895ace3..a1b757c 100644
--- a/erpnext/projects/doctype/timesheet/timesheet.py
+++ b/erpnext/projects/doctype/timesheet/timesheet.py
@@ -293,7 +293,7 @@
@frappe.whitelist()
def get_employee_list(doctype, txt, searchfield, start, page_len, filters):
- return frappe.db.sql("""select distinct(employee) as employee
+ return frappe.db.sql("""select distinct employee, employee_name
from `tabSalary Structure` where salary_slip_based_on_timesheet=1
- and employee like %(txt)s limit %(start)s, %(page_len)s""",
- {'txt': "%%%s%%"%(txt), 'start': start, 'page_len': page_len})
+ and employee like %(txt)s or employee_name like %(txt)s limit %(start)s, %(page_len)s""",
+ {'txt': "%%%s%%"% txt, 'start': start, 'page_len': page_len})
diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js
index 4081ca2..6c5f59a 100644
--- a/erpnext/public/js/utils.js
+++ b/erpnext/public/js/utils.js
@@ -179,6 +179,22 @@
}
}
+frappe.form.link_formatters['Item'] = function(value, doc) {
+ if(doc.item_name && doc.item_name !== value) {
+ return value + ': ' + doc.item_name;
+ } else {
+ return value;
+ }
+}
+
+frappe.form.link_formatters['Employee'] = function(value, doc) {
+ if(doc.employee_name && doc.employee_name !== value) {
+ return value + ': ' + doc.employee_name;
+ } else {
+ return value;
+ }
+}
+
// add description on posting time
$(document).on('app_ready', function() {
if(!frappe.datetime.is_timezone_same()) {
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index cedfb24..b546df4 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -120,7 +120,10 @@
'''set opening stock'''
if not self.is_stock_item or self.has_serial_no or self.has_batch_no:
return
-
+
+ if not self.valuation_rate and self.standard_rate:
+ self.valuation_rate = self.standard_rate
+
if not self.valuation_rate:
frappe.throw(_("Valuation Rate is mandatory if Opening Stock entered"))