-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Closed
Description
Information about bug
when i submit payroll entry, I get the following error.
Module
Loan Management
Version
ERPNext: v15.54.1 (version-15)
Frappe Framework: v15.57.2 (version-15)
Frappe HR: v15.41.0 (version-15)
Lending: v0.0.1 (develop)
Payments: v0.0.1 (develop)
Installation method
None
Relevant log output / Stack trace / Full Error Message.
Traceback with variables (most recent call last):
File "apps/hrms/hrms/payroll/doctype/payroll_entry/payroll_entry.py", line 1440, in create_salary_slips_for_employees
frappe.get_doc(args).insert()
employees = ['HR-EMP-00034', 'HR-EMP-00293', 'HR-EMP-00282', 'HR-EMP-00002']
args = {'salary_slip_based_on_timesheet': 0, 'payroll_frequency': 'Monthly', 'start_date': '2025-02-01', 'end_date': '2025-02-28', 'company': 'Shamo Jee Internal', 'posting_date': '2025-02-28', 'deduct_tax_for_unclaimed_employee_benefits': 0, 'deduct_tax_for_unsubmitted_tax_exemption_proof': 0, 'payroll_entry': 'HR-PRUN-2025-00028-2', 'exchange_rate': 1, 'currency': 'PKR', 'doctype': 'Salary Slip', 'employee': 'HR-EMP-00034'}
publish_progress = False
payroll_entry = <PayrollEntry: HR-PRUN-2025-00028-2 docstatus=1>
salary_slips_exist_for = []
count = 0
emp = 'HR-EMP-00034'
e = ImportError("cannot import name 'process_loan_interest_accrual_for_term_loans' from 'lending.loan_management.doctype.loan_interest_accrual.loan_interest_accrual' (apps/lending/lending/loan_management/doctype/loan_interest_accrual/loan_interest_accrual.py)")
File "apps/frappe/frappe/model/document.py", line 309, in insert
self.run_before_save_methods()
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
ignore_permissions = None
ignore_links = None
ignore_if_duplicate = False
ignore_mandatory = None
set_name = None
set_child_names = True
File "apps/frappe/frappe/model/document.py", line 1136, in run_before_save_methods
self.run_method("validate")
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
File "apps/frappe/frappe/model/document.py", line 1007, in run_method
out = Document.hook(fn)(self, *args, **kwargs)
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
args = ()
kwargs = {}
fn = <function Document.run_method.<locals>.fn at 0x7fe9a1497eb0>
method = 'validate'
File "apps/frappe/frappe/model/document.py", line 1367, in composer
return composed(self, method, *args, **kwargs)
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
args = ()
kwargs = {}
hooks = [<function apply at 0x7fe9a16c8a60>, <function check_for_running_deletion_job at 0x7fe9a16ca680>]
method = 'validate'
doc_events = {'*': {'on_update': ['frappe.desk.notifications.clear_doctype_notifications', 'frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions', 'frappe.core.doctype.file.utils.attach_files_to_document', 'frappe.automation.doctype.assignment_rule.assignment_rule.apply', 'frappe.automation.doctype.assignment_rule.assignment_rule.update_due_date', 'frappe.core.doctype.user_type.user_type.apply_permissions_for_non_standard_user_type'], 'after_rename': ['frappe.desk.notifications.clear_doctype_notifications'], 'on_cancel': ['frappe.desk.notifications.clear_doctype_notifications', 'frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions', 'frappe.automation.doctype.assignment_rule.assignment_rule.apply'], 'on_trash': ['frappe.desk.notifications.clear_doctype_notifications', 'frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions'], 'on_update_after_submit': ['frappe.workflow.doctype.workflow_action.workflow_action.process_w...
handler = 'erpnext.setup.doctype.transaction_deletion_record.transaction_deletion_record.check_for_running_deletion_job'
composed = <function Document.hook.<locals>.compose.<locals>.runner at 0x7fe9a14ec0d0>
compose = <function Document.hook.<locals>.compose at 0x7fe9a1497d90>
f = <function Document.run_method.<locals>.fn at 0x7fe9a1497eb0>
File "apps/frappe/frappe/model/document.py", line 1349, in runner
add_to_return_value(self, fn(self, *args, **kwargs))
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
method = 'validate'
args = ()
kwargs = {}
add_to_return_value = <function Document.hook.<locals>.add_to_return_value at 0x7fe9a1497910>
fn = <function Document.run_method.<locals>.fn at 0x7fe9a1497eb0>
hooks = (<function apply at 0x7fe9a16c8a60>, <function check_for_running_deletion_job at 0x7fe9a16ca680>)
File "apps/frappe/frappe/model/document.py", line 1004, in fn
return method_object(*args, **kwargs)
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
args = ()
kwargs = {}
method_object = <bound method SalarySlip.validate of <SalarySlip: Sal Slip/HR-EMP-00034/00040>>
method = 'validate'
File "apps/hrms/hrms/payroll/doctype/salary_slip/salary_slip.py", line 149, in validate
self.get_emp_and_working_day_details()
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
File "apps/frappe/frappe/utils/typing_validations.py", line 31, in wrapper
return func(*args, **kwargs)
args = (<SalarySlip: Sal Slip/HR-EMP-00034/00040>,)
kwargs = {}
apply_condition = <function whitelist.<locals>.innerfn.<locals>.<lambda> at 0x7fe9a1494160>
func = <function SalarySlip.get_emp_and_working_day_details at 0x7fe9a14940d0>
File "apps/hrms/hrms/payroll/doctype/salary_slip/salary_slip.py", line 347, in get_emp_and_working_day_details
self.pull_sal_struct()
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
struct = '2024-2025'
File "apps/hrms/hrms/payroll/doctype/salary_slip/salary_slip.py", line 421, in pull_sal_struct
make_salary_slip(self._salary_structure_doc.name, self)
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
make_salary_slip = <function make_salary_slip at 0x7fe9a1389cf0>
File "apps/frappe/frappe/utils/typing_validations.py", line 31, in wrapper
return func(*args, **kwargs)
args = ('2024-2025', <SalarySlip: Sal Slip/HR-EMP-00034/00040>)
kwargs = {}
apply_condition = <function whitelist.<locals>.innerfn.<locals>.<lambda> at 0x7fe9a1389c60>
func = <function make_salary_slip at 0x7fe9a1389bd0>
File "apps/hrms/hrms/payroll/doctype/salary_structure/salary_structure.py", line 377, in make_salary_slip
doc = get_mapped_doc(
source_name = '2024-2025'
target_doc = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
as_print = False
print_format = None
ignore_permissions = False
postprocess = <function make_salary_slip.<locals>.postprocess at 0x7fe9a14ec280>
employee = None
for_preview = 0
posting_date = None
File "apps/frappe/frappe/model/mapper.py", line 155, in get_mapped_doc
postprocess(source_doc, target_doc)
from_doctype = 'Salary Structure'
from_docname = '2024-2025'
table_maps = {'Salary Structure': {'doctype': 'Salary Slip', 'field_map': {'total_earning': 'gross_pay', 'name': 'salary_structure', 'currency': 'currency'}}}
target_doc = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
postprocess = <function make_salary_slip.<locals>.postprocess at 0x7fe9a14ec280>
ignore_permissions = False
ignore_child_tables = True
cached = True
apply_strict_user_permissions = 1
source_doc = <SalaryStructure: 2024-2025 docstatus=1>
row_exists_for_parentfield = {}
File "apps/hrms/hrms/payroll/doctype/salary_structure/salary_structure.py", line 375, in postprocess
target.run_method("process_salary_structure", for_preview=for_preview)
source = <SalaryStructure: 2024-2025 docstatus=1>
target = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
employee = None
for_preview = 0
posting_date = None
File "apps/frappe/frappe/model/document.py", line 1007, in run_method
out = Document.hook(fn)(self, *args, **kwargs)
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
args = ()
kwargs = {'for_preview': 0}
fn = <function Document.run_method.<locals>.fn at 0x7fe9a138a200>
method = 'process_salary_structure'
File "apps/frappe/frappe/model/document.py", line 1367, in composer
return composed(self, method, *args, **kwargs)
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
args = ()
kwargs = {'for_preview': 0}
hooks = []
method = 'process_salary_structure'
doc_events = {'*': {'on_update': ['frappe.desk.notifications.clear_doctype_notifications', 'frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions', 'frappe.core.doctype.file.utils.attach_files_to_document', 'frappe.automation.doctype.assignment_rule.assignment_rule.apply', 'frappe.automation.doctype.assignment_rule.assignment_rule.update_due_date', 'frappe.core.doctype.user_type.user_type.apply_permissions_for_non_standard_user_type'], 'after_rename': ['frappe.desk.notifications.clear_doctype_notifications'], 'on_cancel': ['frappe.desk.notifications.clear_doctype_notifications', 'frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions', 'frappe.automation.doctype.assignment_rule.assignment_rule.apply'], 'on_trash': ['frappe.desk.notifications.clear_doctype_notifications', 'frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions'], 'on_update_after_submit': ['frappe.workflow.doctype.workflow_action.workflow_action.process_w...
composed = <function Document.hook.<locals>.compose.<locals>.runner at 0x7fe9a138a0e0>
compose = <function Document.hook.<locals>.compose at 0x7fe9a138a290>
f = <function Document.run_method.<locals>.fn at 0x7fe9a138a200>
File "apps/frappe/frappe/model/document.py", line 1349, in runner
add_to_return_value(self, fn(self, *args, **kwargs))
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
method = 'process_salary_structure'
args = ()
kwargs = {'for_preview': 0}
add_to_return_value = <function Document.hook.<locals>.add_to_return_value at 0x7fe9a138a320>
fn = <function Document.run_method.<locals>.fn at 0x7fe9a138a200>
hooks = ()
File "apps/frappe/frappe/model/document.py", line 1004, in fn
return method_object(*args, **kwargs)
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
args = ()
kwargs = {'for_preview': 0}
method_object = <bound method SalarySlip.process_salary_structure of <SalarySlip: Sal Slip/HR-EMP-00034/00040>>
method = 'process_salary_structure'
File "apps/hrms/hrms/payroll/doctype/salary_slip/salary_slip.py", line 1931, in process_salary_structure
self.calculate_net_pay()
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
for_preview = 0
File "apps/hrms/hrms/payroll/doctype/salary_slip/salary_slip.py", line 805, in calculate_net_pay
set_loan_repayment(self)
skip_tax_breakup_computation = False
set_gross_pay_and_base_gross_pay = <function SalarySlip.calculate_net_pay.<locals>.set_gross_pay_and_base_gross_pay at 0x7fe9a138a560>
self = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
File "apps/hrms/hrms/payroll/doctype/salary_slip/salary_slip_loan_utils.py", line 18, in wrapper
return function(*args, **kwargs)
args = (<SalarySlip: Sal Slip/HR-EMP-00034/00040>,)
kwargs = {}
function = <function set_loan_repayment at 0x7fe9a177e320>
File "apps/hrms/hrms/payroll/doctype/salary_slip/salary_slip_loan_utils.py", line 35, in set_loan_repayment
process_loan_interest_accruals(loan_details, doc.end_date)
doc = <SalarySlip: Sal Slip/HR-EMP-00034/00040>
calculate_amounts = <function calculate_amounts at 0x7fe9a11d3eb0>
loan_details = [{'name': 'ACC-LOAN-2025-00036', 'interest_income_account': 'Employee Loans Income - SJ', 'loan_account': 'Employee Loans - SJ', 'loan_product': 'Employee Loans', 'is_term_loan': 1}]
File "apps/hrms/hrms/payroll/doctype/salary_slip/salary_slip_loan_utils.py", line 91, in process_loan_interest_accruals
from lending.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import (
loan_details = [{'name': 'ACC-LOAN-2025-00036', 'interest_income_account': 'Employee Loans Income - SJ', 'loan_account': 'Employee Loans - SJ', 'loan_product': 'Employee Loans', 'is_term_loan': 1}]
posting_date = '2025-02-28'
File "apps/lending/lending/loan_management/doctype/process_loan_interest_accrual/process_loan_interest_accrual.py", line 9, in <module>
from lending.loan_management.doctype.loan_interest_accrual.loan_interest_accrual import (
__name__ = 'lending.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual'
__doc__ = None
__package__ = 'lending.loan_management.doctype.process_loan_interest_accrual'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x7fe9a11bd870>
__spec__ = ModuleSpec(name='lending.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7fe9a11bd870>, origin='apps/lending/lending/loan_management/doctype/process_loan_interest_accrual/process_loan_interest_accrual.py')
__file__ = 'apps/lending/lending/loan_management/doctype/process_loan_interest_accrual/process_loan_interest_accrual.py'
__cached__ = 'apps/lending/lending/loan_management/doctype/process_loan_interest_accrual/__pycache__/process_loan_interest_accrual.cpython-310.pyc'
__builtins__ = {'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", '__package__': '', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>, origin='built-in'), '__build_class__': <built-in function __build_class__>, '__import__': <built-in function __import__>, 'abs': <built-in function abs>, 'all': <built-in function all>, 'any': <built-in function any>, 'ascii': <built-in function ascii>, 'bin': <built-in function bin>, 'breakpoint': <built-in function breakpoint>, 'callable': <built-in function callable>, 'chr': <built-in function chr>, 'compile': <built-in function compile>, 'delattr': <built-in function delattr>, 'dir': <built-in function dir>, 'divmod': <built-in function divmod>, 'eval': <built-in function eval>, 'exec': <built-in function exec>, 'format': <built-in function format>, ...
frappe = <module 'frappe' from 'apps/frappe/frappe/__init__.py'>
Document = <class 'frappe.model.document.Document'>
add_days = <function add_days at 0x7fe9a56a5240>
nowdate = <function nowdate at 0x7fe9a56a5bd0>
get_loan_accrual_frequency = <function get_loan_accrual_frequency at 0x7fe9a11da4d0>
is_posting_date_accrual_day = <function is_posting_date_accrual_day at 0x7fe9a11d9bd0>
make_accrual_interest_entry_for_loans = <function make_accrual_interest_entry_for_loans at 0x7fe9a11d9fc0>
builtins.ImportError: cannot import name 'process_loan_interest_accrual_for_term_loans' from 'lending.loan_management.doctype.loan_interest_accrual.loan_interest_accrual' (apps/lending/lending/loan_management/doctype/loan_interest_accrual/loan_interest_accrual.py)Code of Conduct
- I agree to follow this project's Code of Conduct
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels