Merge branch 'develop' into crm-carry-forward-communication-comments
This commit is contained in:
commit
662c412e8b
@ -4,6 +4,7 @@ import frappe
|
|||||||
from frappe.utils import add_days, add_months, getdate, nowdate
|
from frappe.utils import add_days, add_months, getdate, nowdate
|
||||||
|
|
||||||
import erpnext
|
import erpnext
|
||||||
|
from erpnext.hr.doctype.employee.test_employee import make_employee
|
||||||
from erpnext.hr.doctype.leave_ledger_entry.leave_ledger_entry import process_expired_allocation
|
from erpnext.hr.doctype.leave_ledger_entry.leave_ledger_entry import process_expired_allocation
|
||||||
from erpnext.hr.doctype.leave_type.test_leave_type import create_leave_type
|
from erpnext.hr.doctype.leave_type.test_leave_type import create_leave_type
|
||||||
|
|
||||||
@ -11,18 +12,25 @@ from erpnext.hr.doctype.leave_type.test_leave_type import create_leave_type
|
|||||||
class TestLeaveAllocation(unittest.TestCase):
|
class TestLeaveAllocation(unittest.TestCase):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
|
from erpnext.payroll.doctype.salary_slip.test_salary_slip import make_holiday_list
|
||||||
|
|
||||||
frappe.db.sql("delete from `tabLeave Period`")
|
frappe.db.sql("delete from `tabLeave Period`")
|
||||||
|
emp_id = make_employee("test_emp_leave_allocation@salary.com")
|
||||||
|
cls.employee = frappe.get_doc("Employee", emp_id)
|
||||||
|
|
||||||
|
make_holiday_list()
|
||||||
|
frappe.db.set_value("Company", erpnext.get_default_company(), "default_holiday_list", "Salary Slip Test Holiday List")
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
frappe.db.rollback()
|
||||||
|
|
||||||
def test_overlapping_allocation(self):
|
def test_overlapping_allocation(self):
|
||||||
frappe.db.sql("delete from `tabLeave Allocation`")
|
|
||||||
|
|
||||||
employee = frappe.get_doc("Employee", frappe.db.sql_list("select name from tabEmployee limit 1")[0])
|
|
||||||
leaves = [
|
leaves = [
|
||||||
{
|
{
|
||||||
"doctype": "Leave Allocation",
|
"doctype": "Leave Allocation",
|
||||||
"__islocal": 1,
|
"__islocal": 1,
|
||||||
"employee": employee.name,
|
"employee": self.employee.name,
|
||||||
"employee_name": employee.employee_name,
|
"employee_name": self.employee.employee_name,
|
||||||
"leave_type": "_Test Leave Type",
|
"leave_type": "_Test Leave Type",
|
||||||
"from_date": getdate("2015-10-01"),
|
"from_date": getdate("2015-10-01"),
|
||||||
"to_date": getdate("2015-10-31"),
|
"to_date": getdate("2015-10-31"),
|
||||||
@ -32,8 +40,8 @@ class TestLeaveAllocation(unittest.TestCase):
|
|||||||
{
|
{
|
||||||
"doctype": "Leave Allocation",
|
"doctype": "Leave Allocation",
|
||||||
"__islocal": 1,
|
"__islocal": 1,
|
||||||
"employee": employee.name,
|
"employee": self.employee.name,
|
||||||
"employee_name": employee.employee_name,
|
"employee_name": self.employee.employee_name,
|
||||||
"leave_type": "_Test Leave Type",
|
"leave_type": "_Test Leave Type",
|
||||||
"from_date": getdate("2015-09-01"),
|
"from_date": getdate("2015-09-01"),
|
||||||
"to_date": getdate("2015-11-30"),
|
"to_date": getdate("2015-11-30"),
|
||||||
@ -45,13 +53,11 @@ class TestLeaveAllocation(unittest.TestCase):
|
|||||||
self.assertRaises(frappe.ValidationError, frappe.get_doc(leaves[1]).save)
|
self.assertRaises(frappe.ValidationError, frappe.get_doc(leaves[1]).save)
|
||||||
|
|
||||||
def test_invalid_period(self):
|
def test_invalid_period(self):
|
||||||
employee = frappe.get_doc("Employee", frappe.db.sql_list("select name from tabEmployee limit 1")[0])
|
|
||||||
|
|
||||||
doc = frappe.get_doc({
|
doc = frappe.get_doc({
|
||||||
"doctype": "Leave Allocation",
|
"doctype": "Leave Allocation",
|
||||||
"__islocal": 1,
|
"__islocal": 1,
|
||||||
"employee": employee.name,
|
"employee": self.employee.name,
|
||||||
"employee_name": employee.employee_name,
|
"employee_name": self.employee.employee_name,
|
||||||
"leave_type": "_Test Leave Type",
|
"leave_type": "_Test Leave Type",
|
||||||
"from_date": getdate("2015-09-30"),
|
"from_date": getdate("2015-09-30"),
|
||||||
"to_date": getdate("2015-09-1"),
|
"to_date": getdate("2015-09-1"),
|
||||||
@ -62,23 +68,21 @@ class TestLeaveAllocation(unittest.TestCase):
|
|||||||
self.assertRaises(frappe.ValidationError, doc.save)
|
self.assertRaises(frappe.ValidationError, doc.save)
|
||||||
|
|
||||||
def test_allocated_leave_days_over_period(self):
|
def test_allocated_leave_days_over_period(self):
|
||||||
employee = frappe.get_doc("Employee", frappe.db.sql_list("select name from tabEmployee limit 1")[0])
|
|
||||||
doc = frappe.get_doc({
|
doc = frappe.get_doc({
|
||||||
"doctype": "Leave Allocation",
|
"doctype": "Leave Allocation",
|
||||||
"__islocal": 1,
|
"__islocal": 1,
|
||||||
"employee": employee.name,
|
"employee": self.employee.name,
|
||||||
"employee_name": employee.employee_name,
|
"employee_name": self.employee.employee_name,
|
||||||
"leave_type": "_Test Leave Type",
|
"leave_type": "_Test Leave Type",
|
||||||
"from_date": getdate("2015-09-1"),
|
"from_date": getdate("2015-09-1"),
|
||||||
"to_date": getdate("2015-09-30"),
|
"to_date": getdate("2015-09-30"),
|
||||||
"new_leaves_allocated": 35
|
"new_leaves_allocated": 35
|
||||||
})
|
})
|
||||||
|
|
||||||
# allocated leave more than period
|
# allocated leave more than period
|
||||||
self.assertRaises(frappe.ValidationError, doc.save)
|
self.assertRaises(frappe.ValidationError, doc.save)
|
||||||
|
|
||||||
def test_carry_forward_calculation(self):
|
def test_carry_forward_calculation(self):
|
||||||
frappe.db.sql("delete from `tabLeave Allocation`")
|
|
||||||
frappe.db.sql("delete from `tabLeave Ledger Entry`")
|
|
||||||
leave_type = create_leave_type(leave_type_name="_Test_CF_leave", is_carry_forward=1)
|
leave_type = create_leave_type(leave_type_name="_Test_CF_leave", is_carry_forward=1)
|
||||||
leave_type.maximum_carry_forwarded_leaves = 10
|
leave_type.maximum_carry_forwarded_leaves = 10
|
||||||
leave_type.max_leaves_allowed = 30
|
leave_type.max_leaves_allowed = 30
|
||||||
@ -114,8 +118,6 @@ class TestLeaveAllocation(unittest.TestCase):
|
|||||||
self.assertEqual(leave_allocation_2.unused_leaves, 5)
|
self.assertEqual(leave_allocation_2.unused_leaves, 5)
|
||||||
|
|
||||||
def test_carry_forward_leaves_expiry(self):
|
def test_carry_forward_leaves_expiry(self):
|
||||||
frappe.db.sql("delete from `tabLeave Allocation`")
|
|
||||||
frappe.db.sql("delete from `tabLeave Ledger Entry`")
|
|
||||||
leave_type = create_leave_type(
|
leave_type = create_leave_type(
|
||||||
leave_type_name="_Test_CF_leave_expiry",
|
leave_type_name="_Test_CF_leave_expiry",
|
||||||
is_carry_forward=1,
|
is_carry_forward=1,
|
||||||
@ -151,8 +153,6 @@ class TestLeaveAllocation(unittest.TestCase):
|
|||||||
self.assertEqual(leave_allocation_1.unused_leaves, leave_allocation.new_leaves_allocated)
|
self.assertEqual(leave_allocation_1.unused_leaves, leave_allocation.new_leaves_allocated)
|
||||||
|
|
||||||
def test_creation_of_leave_ledger_entry_on_submit(self):
|
def test_creation_of_leave_ledger_entry_on_submit(self):
|
||||||
frappe.db.sql("delete from `tabLeave Allocation`")
|
|
||||||
|
|
||||||
leave_allocation = create_leave_allocation()
|
leave_allocation = create_leave_allocation()
|
||||||
leave_allocation.submit()
|
leave_allocation.submit()
|
||||||
|
|
||||||
@ -168,9 +168,6 @@ class TestLeaveAllocation(unittest.TestCase):
|
|||||||
self.assertFalse(frappe.db.exists("Leave Ledger Entry", {'transaction_name':leave_allocation.name}))
|
self.assertFalse(frappe.db.exists("Leave Ledger Entry", {'transaction_name':leave_allocation.name}))
|
||||||
|
|
||||||
def test_leave_addition_after_submit(self):
|
def test_leave_addition_after_submit(self):
|
||||||
frappe.db.sql("delete from `tabLeave Allocation`")
|
|
||||||
frappe.db.sql("delete from `tabLeave Ledger Entry`")
|
|
||||||
|
|
||||||
leave_allocation = create_leave_allocation()
|
leave_allocation = create_leave_allocation()
|
||||||
leave_allocation.submit()
|
leave_allocation.submit()
|
||||||
self.assertTrue(leave_allocation.total_leaves_allocated, 15)
|
self.assertTrue(leave_allocation.total_leaves_allocated, 15)
|
||||||
@ -179,8 +176,6 @@ class TestLeaveAllocation(unittest.TestCase):
|
|||||||
self.assertTrue(leave_allocation.total_leaves_allocated, 40)
|
self.assertTrue(leave_allocation.total_leaves_allocated, 40)
|
||||||
|
|
||||||
def test_leave_subtraction_after_submit(self):
|
def test_leave_subtraction_after_submit(self):
|
||||||
frappe.db.sql("delete from `tabLeave Allocation`")
|
|
||||||
frappe.db.sql("delete from `tabLeave Ledger Entry`")
|
|
||||||
leave_allocation = create_leave_allocation()
|
leave_allocation = create_leave_allocation()
|
||||||
leave_allocation.submit()
|
leave_allocation.submit()
|
||||||
self.assertTrue(leave_allocation.total_leaves_allocated, 15)
|
self.assertTrue(leave_allocation.total_leaves_allocated, 15)
|
||||||
@ -188,17 +183,14 @@ class TestLeaveAllocation(unittest.TestCase):
|
|||||||
leave_allocation.submit()
|
leave_allocation.submit()
|
||||||
self.assertTrue(leave_allocation.total_leaves_allocated, 10)
|
self.assertTrue(leave_allocation.total_leaves_allocated, 10)
|
||||||
|
|
||||||
def test_against_leave_application_validation_after_submit(self):
|
def test_validation_against_leave_application_after_submit(self):
|
||||||
frappe.db.sql("delete from `tabLeave Allocation`")
|
|
||||||
frappe.db.sql("delete from `tabLeave Ledger Entry`")
|
|
||||||
|
|
||||||
leave_allocation = create_leave_allocation()
|
leave_allocation = create_leave_allocation()
|
||||||
leave_allocation.submit()
|
leave_allocation.submit()
|
||||||
self.assertTrue(leave_allocation.total_leaves_allocated, 15)
|
self.assertTrue(leave_allocation.total_leaves_allocated, 15)
|
||||||
employee = frappe.get_doc("Employee", frappe.db.sql_list("select name from tabEmployee limit 1")[0])
|
|
||||||
leave_application = frappe.get_doc({
|
leave_application = frappe.get_doc({
|
||||||
"doctype": 'Leave Application',
|
"doctype": 'Leave Application',
|
||||||
"employee": employee.name,
|
"employee": self.employee.name,
|
||||||
"leave_type": "_Test Leave Type",
|
"leave_type": "_Test Leave Type",
|
||||||
"from_date": add_months(nowdate(), 2),
|
"from_date": add_months(nowdate(), 2),
|
||||||
"to_date": add_months(add_days(nowdate(), 10), 2),
|
"to_date": add_months(add_days(nowdate(), 10), 2),
|
||||||
@ -208,15 +200,20 @@ class TestLeaveAllocation(unittest.TestCase):
|
|||||||
"leave_approver": 'test@example.com'
|
"leave_approver": 'test@example.com'
|
||||||
})
|
})
|
||||||
leave_application.submit()
|
leave_application.submit()
|
||||||
leave_allocation.new_leaves_allocated = 8
|
leave_application.reload()
|
||||||
leave_allocation.total_leaves_allocated = 8
|
|
||||||
|
# allocate less leaves than the ones which are already approved
|
||||||
|
leave_allocation.new_leaves_allocated = leave_application.total_leave_days - 1
|
||||||
|
leave_allocation.total_leaves_allocated = leave_application.total_leave_days - 1
|
||||||
self.assertRaises(frappe.ValidationError, leave_allocation.submit)
|
self.assertRaises(frappe.ValidationError, leave_allocation.submit)
|
||||||
|
|
||||||
def create_leave_allocation(**args):
|
def create_leave_allocation(**args):
|
||||||
args = frappe._dict(args)
|
args = frappe._dict(args)
|
||||||
|
|
||||||
employee = frappe.get_doc("Employee", frappe.db.sql_list("select name from tabEmployee limit 1")[0])
|
emp_id = make_employee("test_emp_leave_allocation@salary.com")
|
||||||
leave_allocation = frappe.get_doc({
|
employee = frappe.get_doc("Employee", emp_id)
|
||||||
|
|
||||||
|
return frappe.get_doc({
|
||||||
"doctype": "Leave Allocation",
|
"doctype": "Leave Allocation",
|
||||||
"__islocal": 1,
|
"__islocal": 1,
|
||||||
"employee": args.employee or employee.name,
|
"employee": args.employee or employee.name,
|
||||||
@ -227,6 +224,5 @@ def create_leave_allocation(**args):
|
|||||||
"carry_forward": args.carry_forward or 0,
|
"carry_forward": args.carry_forward or 0,
|
||||||
"to_date": args.to_date or add_months(nowdate(), 12)
|
"to_date": args.to_date or add_months(nowdate(), 12)
|
||||||
})
|
})
|
||||||
return leave_allocation
|
|
||||||
|
|
||||||
test_dependencies = ["Employee", "Leave Type"]
|
test_dependencies = ["Employee", "Leave Type"]
|
||||||
|
|||||||
@ -8,7 +8,8 @@ const DIFFERNCE_FIELD_NAMES = [
|
|||||||
"fifo_value_diff",
|
"fifo_value_diff",
|
||||||
"fifo_valuation_diff",
|
"fifo_valuation_diff",
|
||||||
"valuation_diff",
|
"valuation_diff",
|
||||||
"fifo_difference_diff"
|
"fifo_difference_diff",
|
||||||
|
"diff_value_diff"
|
||||||
];
|
];
|
||||||
|
|
||||||
frappe.query_reports["Stock Ledger Invariant Check"] = {
|
frappe.query_reports["Stock Ledger Invariant Check"] = {
|
||||||
|
|||||||
@ -50,6 +50,7 @@ def get_stock_ledger_entries(filters):
|
|||||||
|
|
||||||
def add_invariant_check_fields(sles):
|
def add_invariant_check_fields(sles):
|
||||||
balance_qty = 0.0
|
balance_qty = 0.0
|
||||||
|
balance_stock_value = 0.0
|
||||||
for idx, sle in enumerate(sles):
|
for idx, sle in enumerate(sles):
|
||||||
queue = json.loads(sle.stock_queue)
|
queue = json.loads(sle.stock_queue)
|
||||||
|
|
||||||
@ -60,6 +61,7 @@ def add_invariant_check_fields(sles):
|
|||||||
fifo_value += qty * rate
|
fifo_value += qty * rate
|
||||||
|
|
||||||
balance_qty += sle.actual_qty
|
balance_qty += sle.actual_qty
|
||||||
|
balance_stock_value += sle.stock_value_difference
|
||||||
if sle.voucher_type == "Stock Reconciliation" and not sle.batch_no:
|
if sle.voucher_type == "Stock Reconciliation" and not sle.batch_no:
|
||||||
balance_qty = sle.qty_after_transaction
|
balance_qty = sle.qty_after_transaction
|
||||||
|
|
||||||
@ -70,6 +72,7 @@ def add_invariant_check_fields(sles):
|
|||||||
sle.stock_value / sle.qty_after_transaction if sle.qty_after_transaction else None
|
sle.stock_value / sle.qty_after_transaction if sle.qty_after_transaction else None
|
||||||
)
|
)
|
||||||
sle.expected_qty_after_transaction = balance_qty
|
sle.expected_qty_after_transaction = balance_qty
|
||||||
|
sle.stock_value_from_diff = balance_stock_value
|
||||||
|
|
||||||
# set difference fields
|
# set difference fields
|
||||||
sle.difference_in_qty = sle.qty_after_transaction - sle.expected_qty_after_transaction
|
sle.difference_in_qty = sle.qty_after_transaction - sle.expected_qty_after_transaction
|
||||||
@ -81,6 +84,7 @@ def add_invariant_check_fields(sles):
|
|||||||
sle.valuation_diff = (
|
sle.valuation_diff = (
|
||||||
sle.valuation_rate - sle.balance_value_by_qty if sle.balance_value_by_qty else None
|
sle.valuation_rate - sle.balance_value_by_qty if sle.balance_value_by_qty else None
|
||||||
)
|
)
|
||||||
|
sle.diff_value_diff = sle.stock_value_from_diff - sle.stock_value
|
||||||
|
|
||||||
if idx > 0:
|
if idx > 0:
|
||||||
sle.fifo_stock_diff = sle.fifo_stock_value - sles[idx - 1].fifo_stock_value
|
sle.fifo_stock_diff = sle.fifo_stock_value - sles[idx - 1].fifo_stock_value
|
||||||
@ -191,12 +195,21 @@ def get_columns():
|
|||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"label": "D - E",
|
"label": "D - E",
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"fieldname": "stock_value_difference",
|
"fieldname": "stock_value_difference",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"label": "(F) Stock Value Difference",
|
"label": "(F) Stock Value Difference",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "stock_value_from_diff",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"label": "Balance Stock Value using (F)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "diff_value_diff",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"label": "K - D",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "fifo_stock_diff",
|
"fieldname": "fifo_stock_diff",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user