Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ frappe.ui.form.on('Employee Travel Request', {
if (r.message) frm.set_value('requested_by', r.message.name);
});
}

set_expense_claim_html(frm)
},
refresh: function (frm) {
if (!frm.is_new() && frappe.user.has_role("Admin")) {
Expand All @@ -30,28 +32,34 @@ frappe.ui.form.on('Employee Travel Request', {
reqd: 1
},
{
label: 'Expense Claim Type',
label: 'Expense Type',
fieldtype: 'Link',
options: 'Expense Claim Type',
fieldname: 'expense_type',
in_list_view: 1,
reqd: 1
},
{
label: 'Budget Expense Type',
fieldtype: 'Link',
options: 'Budget Expense Type',
fieldname: 'budget_type',
in_list_view: 1
},
{
label: 'Amount',
fieldtype: 'Currency',
fieldname: 'amount',
in_list_view: 1,
reqd: 1
},
{
label: 'Description',
fieldtype: 'Small Text',
fieldname: 'description',
in_list_view: 1
}
]
},
{
label: 'Mode of Payment',
fieldtype: 'Link',
options: 'Mode of Payment',
fieldname: 'mode_of_payment',
reqd: 1
}
],
size: 'large',
Expand All @@ -67,7 +75,8 @@ frappe.ui.form.on('Employee Travel Request', {
args: {
employee: frm.doc.requested_by,
travel_request: frm.doc.name,
expenses: expenses
expenses: expenses,
mode_of_payment: values.mode_of_payment
},
callback: function (r) {
if (!r.exc) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ def get_permission_query_conditions(user):
return " OR ".join(f"({cond.strip()})" for cond in conditions)

@frappe.whitelist()
def create_journal_entry_from_travel(employee, travel_request, expenses):
def create_journal_entry_from_travel(employee, travel_request, expenses, mode_of_payment):
"""
Create a Journal Entry from Travel Request
"""
Expand All @@ -436,45 +436,47 @@ def create_journal_entry_from_travel(employee, travel_request, expenses):
if not isinstance(expenses, list):
frappe.throw(_("Expenses must be a list of expense items."))

company = frappe.defaults.get_user_default("Company")
mop_account = frappe.db.get_value(
"Mode of Payment Account",
{
"parent": mode_of_payment,
"company": company
},
"default_account"
)
if not mop_account:
frappe.throw(_(f"No default account found for Mode of Payment {mode_of_payment} for company {company}"))
jv = frappe.new_doc("Journal Entry")
jv.voucher_type = "Journal Entry"
jv.posting_date = nowdate()
jv.company = frappe.defaults.get_user_default("Company")
jv.company = company
jv.user_remark = f"Journal Entry for Travel Request {travel_request}"
jv.employee = employee
jv.custom_travel_request = travel_request
jv.docstatus = 0

for expense in expenses:
budget_type = expense.get("budget_type")
debit_account = None
if budget_type:
budget_expense = frappe.get_doc("Budget Expense Type", budget_type)
for account_row in budget_expense.get("accounts", []):
if account_row.default_account:
debit_account = account_row.default_account
break
if not debit_account:
frappe.throw(_(f"No default account found for Budget Expense Type {budget_type}"))
total_amount = 0

for expense in expenses:
expense_type = expense.get("expense_type")
credit_account = None
if expense_type:
expense_claim = frappe.get_doc("Expense Claim Type", expense_type)
for account_row in expense_claim.get("accounts", []):
if account_row.default_account:
credit_account = account_row.default_account
break
if not credit_account:
frappe.throw(_(f"No default account found for Expense Claim Type {expense_type}"))

amount = expense.get("amount")
expense_date = expense.get("expense_date")

if not expense_type:
frappe.throw(_("Expense Type is required for each expense item."))
if not amount or not expense_date:
frappe.throw(_("Amount and Expense Date are required for each expense item."))
if not debit_account or not credit_account:
frappe.throw(_("Both Budget Expense Type and Expense Claim Type must have valid default accounts."))

expense_claim = frappe.get_doc("Expense Claim Type", expense_type)
debit_account = None
for account_row in expense_claim.get("accounts", []):
if account_row.default_account:
debit_account = account_row.default_account
break
if not debit_account:
frappe.throw(_(f"No default account found for Expense Claim Type {expense_type}"))


jv.append("accounts", {
"account": debit_account,
Expand All @@ -483,14 +485,13 @@ def create_journal_entry_from_travel(employee, travel_request, expenses):
"debit_in_account_currency": amount,
"posting_date": expense_date
})
total_amount += amount

jv.append("accounts", {
"account": credit_account,
"party_type": "Employee",
"party": employee,
"credit_in_account_currency": amount,
"posting_date": expense_date
})
jv.append("accounts", {
"account": mop_account,
"credit_in_account_currency": total_amount,
"posting_date": expense_date
})

jv.insert()
return jv.name