mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-29 09:54:47 +00:00
Make payment entry button in expense claim and some minor cleanup
This commit is contained in:
@@ -71,7 +71,7 @@ frappe.ui.form.on('Payment Entry', {
|
|||||||
} else if (frm.doc.party_type=="Supplier") {
|
} else if (frm.doc.party_type=="Supplier") {
|
||||||
var doctypes = ["Purchase Order", "Purchase Invoice", "Journal Entry"];
|
var doctypes = ["Purchase Order", "Purchase Invoice", "Journal Entry"];
|
||||||
} else if (frm.doc.party_type=="Employee") {
|
} else if (frm.doc.party_type=="Employee") {
|
||||||
var doctypes = ["Expense Claim"];
|
var doctypes = ["Expense Claim", "Journal Entry"];
|
||||||
} else {
|
} else {
|
||||||
var doctypes = ["Journal Entry"];
|
var doctypes = ["Journal Entry"];
|
||||||
}
|
}
|
||||||
@@ -84,12 +84,18 @@ frappe.ui.form.on('Payment Entry', {
|
|||||||
frm.set_query("reference_name", "references", function(doc, cdt, cdn) {
|
frm.set_query("reference_name", "references", function(doc, cdt, cdn) {
|
||||||
child = locals[cdt][cdn];
|
child = locals[cdt][cdn];
|
||||||
filters = {"docstatus": 1, "company": doc.company};
|
filters = {"docstatus": 1, "company": doc.company};
|
||||||
party_type_doctypes = ['Sales Invoice', 'Sales Order', 'Purchase Invoice', 'Purchase Order', 'Expense Claim'];
|
party_type_doctypes = ['Sales Invoice', 'Sales Order', 'Purchase Invoice',
|
||||||
|
'Purchase Order', 'Expense Claim'];
|
||||||
|
|
||||||
if (in_list(party_type_doctypes, child.reference_doctype)) {
|
if (in_list(party_type_doctypes, child.reference_doctype)) {
|
||||||
filters[doc.party_type.toLowerCase()] = doc.party;
|
filters[doc.party_type.toLowerCase()] = doc.party;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(child.reference_doctype == "Expense Claim") {
|
||||||
|
filters["status"] = "Approved";
|
||||||
|
filters["is_paid"] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
filters: filters
|
filters: filters
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ def work():
|
|||||||
|
|
||||||
if random.randint(0, 1):
|
if random.randint(0, 1):
|
||||||
#make journal entry against expense claim
|
#make journal entry against expense claim
|
||||||
je = frappe.get_doc(make_bank_entry(expense_claim.name))
|
je = frappe.get_doc(make_bank_entry("Expense Claim", expense_claim.name))
|
||||||
je.posting_date = frappe.flags.current_date
|
je.posting_date = frappe.flags.current_date
|
||||||
je.cheque_no = random_string(10)
|
je.cheque_no = random_string(10)
|
||||||
je.cheque_date = frappe.flags.current_date
|
je.cheque_date = frappe.flags.current_date
|
||||||
|
|||||||
@@ -4,26 +4,12 @@
|
|||||||
frappe.provide("erpnext.hr");
|
frappe.provide("erpnext.hr");
|
||||||
|
|
||||||
erpnext.hr.ExpenseClaimController = frappe.ui.form.Controller.extend({
|
erpnext.hr.ExpenseClaimController = frappe.ui.form.Controller.extend({
|
||||||
make_bank_entry: function() {
|
|
||||||
var me = this;
|
|
||||||
return frappe.call({
|
|
||||||
method: "erpnext.hr.doctype.expense_claim.expense_claim.make_bank_entry",
|
|
||||||
args: {
|
|
||||||
"docname": cur_frm.doc.name,
|
|
||||||
},
|
|
||||||
callback: function(r) {
|
|
||||||
var doc = frappe.model.sync(r.message);
|
|
||||||
frappe.set_route('Form', 'Journal Entry', r.message.name);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
expense_type: function(doc, cdt, cdn) {
|
expense_type: function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if(!doc.company) {
|
if(!doc.company) {
|
||||||
d.expense_type = "";
|
d.expense_type = "";
|
||||||
frappe.msgprint(__("Please set the Company"));
|
frappe.msgprint(__("Please set the Company"));
|
||||||
this.frm.refresh_fields()
|
this.frm.refresh_fields();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,16 +30,16 @@ erpnext.hr.ExpenseClaimController = frappe.ui.form.Controller.extend({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
|
|
||||||
$.extend(cur_frm.cscript, new erpnext.hr.ExpenseClaimController({frm: cur_frm}));
|
$.extend(cur_frm.cscript, new erpnext.hr.ExpenseClaimController({frm: cur_frm}));
|
||||||
|
|
||||||
cur_frm.add_fetch('employee', 'company', 'company');
|
cur_frm.add_fetch('employee', 'company', 'company');
|
||||||
cur_frm.add_fetch('employee','employee_name','employee_name');
|
cur_frm.add_fetch('employee','employee_name','employee_name');
|
||||||
|
|
||||||
cur_frm.cscript.onload = function(doc,cdt,cdn) {
|
cur_frm.cscript.onload = function(doc) {
|
||||||
if(!doc.approval_status)
|
if(!doc.approval_status)
|
||||||
cur_frm.set_value("approval_status", "Draft")
|
cur_frm.set_value("approval_status", "Draft");
|
||||||
|
|
||||||
if (doc.__islocal) {
|
if (doc.__islocal) {
|
||||||
cur_frm.set_value("posting_date", frappe.datetime.get_today());
|
cur_frm.set_value("posting_date", frappe.datetime.get_today());
|
||||||
@@ -62,10 +48,10 @@ cur_frm.cscript.onload = function(doc,cdt,cdn) {
|
|||||||
cur_frm.cscript.clear_sanctioned(doc);
|
cur_frm.cscript.clear_sanctioned(doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict.employee.get_query = function(doc,cdt,cdn) {
|
cur_frm.fields_dict.employee.get_query = function() {
|
||||||
return{
|
return {
|
||||||
query: "erpnext.controllers.queries.employee_query"
|
query: "erpnext.controllers.queries.employee_query"
|
||||||
}
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
cur_frm.set_query("exp_approver", function() {
|
cur_frm.set_query("exp_approver", function() {
|
||||||
@@ -73,7 +59,7 @@ cur_frm.cscript.onload = function(doc,cdt,cdn) {
|
|||||||
query: "erpnext.hr.doctype.expense_claim.expense_claim.get_expense_approver"
|
query: "erpnext.hr.doctype.expense_claim.expense_claim.get_expense_approver"
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
cur_frm.cscript.clear_sanctioned = function(doc) {
|
cur_frm.cscript.clear_sanctioned = function(doc) {
|
||||||
var val = doc.expenses || [];
|
var val = doc.expenses || [];
|
||||||
@@ -83,9 +69,9 @@ cur_frm.cscript.clear_sanctioned = function(doc) {
|
|||||||
|
|
||||||
doc.total_sanctioned_amount = '';
|
doc.total_sanctioned_amount = '';
|
||||||
refresh_many(['sanctioned_amount', 'total_sanctioned_amount']);
|
refresh_many(['sanctioned_amount', 'total_sanctioned_amount']);
|
||||||
}
|
};
|
||||||
|
|
||||||
cur_frm.cscript.refresh = function(doc,cdt,cdn) {
|
cur_frm.cscript.refresh = function(doc) {
|
||||||
cur_frm.cscript.set_help(doc);
|
cur_frm.cscript.set_help(doc);
|
||||||
|
|
||||||
if(!doc.__islocal) {
|
if(!doc.__islocal) {
|
||||||
@@ -96,11 +82,6 @@ cur_frm.cscript.refresh = function(doc,cdt,cdn) {
|
|||||||
cur_frm.savesubmit();
|
cur_frm.savesubmit();
|
||||||
|
|
||||||
if (doc.docstatus===1 && doc.approval_status=="Approved") {
|
if (doc.docstatus===1 && doc.approval_status=="Approved") {
|
||||||
if (cint(doc.total_amount_reimbursed) < cint(doc.total_sanctioned_amount) && frappe.model.can_create("Journal Entry")) {
|
|
||||||
cur_frm.add_custom_button(__("Bank Entry"), cur_frm.cscript.make_bank_entry, __("Make"));
|
|
||||||
cur_frm.page.set_inner_btn_group_as_primary(__("Make"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
// no idea how `me` works here
|
// no idea how `me` works here
|
||||||
if (cint(doc.total_amount_reimbursed) > 0 && frappe.model.can_read("Journal Entry")) {
|
if (cint(doc.total_amount_reimbursed) > 0 && frappe.model.can_read("Journal Entry")) {
|
||||||
@@ -116,12 +97,12 @@ cur_frm.cscript.refresh = function(doc,cdt,cdn) {
|
|||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
cur_frm.cscript.set_help = function(doc) {
|
cur_frm.cscript.set_help = function(doc) {
|
||||||
cur_frm.set_intro("");
|
cur_frm.set_intro("");
|
||||||
if(doc.__islocal && !in_list(frappe.user_roles, "HR User")) {
|
if(doc.__islocal && !in_list(frappe.user_roles, "HR User")) {
|
||||||
cur_frm.set_intro(__("Fill the form and save it"))
|
cur_frm.set_intro(__("Fill the form and save it"));
|
||||||
} else {
|
} else {
|
||||||
if(doc.docstatus==0 && doc.approval_status=="Draft") {
|
if(doc.docstatus==0 && doc.approval_status=="Draft") {
|
||||||
if(frappe.session.user==doc.exp_approver) {
|
if(frappe.session.user==doc.exp_approver) {
|
||||||
@@ -131,13 +112,13 @@ cur_frm.cscript.set_help = function(doc) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
cur_frm.cscript.validate = function(doc) {
|
cur_frm.cscript.validate = function(doc) {
|
||||||
cur_frm.cscript.calculate_total(doc);
|
cur_frm.cscript.calculate_total(doc);
|
||||||
}
|
};
|
||||||
|
|
||||||
cur_frm.cscript.calculate_total = function(doc,cdt,cdn){
|
cur_frm.cscript.calculate_total = function(doc){
|
||||||
doc.total_claimed_amount = 0;
|
doc.total_claimed_amount = 0;
|
||||||
doc.total_sanctioned_amount = 0;
|
doc.total_sanctioned_amount = 0;
|
||||||
$.each((doc.expenses || []), function(i, d) {
|
$.each((doc.expenses || []), function(i, d) {
|
||||||
@@ -147,18 +128,17 @@ cur_frm.cscript.calculate_total = function(doc,cdt,cdn){
|
|||||||
|
|
||||||
refresh_field("total_claimed_amount");
|
refresh_field("total_claimed_amount");
|
||||||
refresh_field('total_sanctioned_amount');
|
refresh_field('total_sanctioned_amount');
|
||||||
|
};
|
||||||
}
|
|
||||||
|
|
||||||
cur_frm.cscript.calculate_total_amount = function(doc,cdt,cdn){
|
cur_frm.cscript.calculate_total_amount = function(doc,cdt,cdn){
|
||||||
cur_frm.cscript.calculate_total(doc,cdt,cdn);
|
cur_frm.cscript.calculate_total(doc,cdt,cdn);
|
||||||
}
|
};
|
||||||
|
|
||||||
cur_frm.cscript.on_submit = function(doc, cdt, cdn) {
|
cur_frm.cscript.on_submit = function() {
|
||||||
if(cint(frappe.boot.notification_settings && frappe.boot.notification_settings.expense_claim)) {
|
if(cint(frappe.boot.notification_settings && frappe.boot.notification_settings.expense_claim)) {
|
||||||
cur_frm.email_doc(frappe.boot.notification_settings.expense_claim_message);
|
cur_frm.email_doc(frappe.boot.notification_settings.expense_claim_message);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
erpnext.expense_claim = {
|
erpnext.expense_claim = {
|
||||||
set_title :function(frm) {
|
set_title :function(frm) {
|
||||||
@@ -169,11 +149,20 @@ erpnext.expense_claim = {
|
|||||||
frm.set_value("title", frm.doc.employee_name + " for "+ frm.doc.task);
|
frm.set_value("title", frm.doc.employee_name + " for "+ frm.doc.task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
frappe.ui.form.on("Expense Claim", {
|
frappe.ui.form.on("Expense Claim", {
|
||||||
|
setup: function(frm) {
|
||||||
|
frm.trigger("set_query_for_cost_center");
|
||||||
|
frm.trigger("set_query_for_payable_account");
|
||||||
|
frm.add_fetch("company", "cost_center", "cost_center");
|
||||||
|
frm.add_fetch("company", "default_payable_account", "payable_account");
|
||||||
|
},
|
||||||
|
|
||||||
refresh: function(frm) {
|
refresh: function(frm) {
|
||||||
if(frm.doc.docstatus == 1) {
|
frm.trigger("toggle_fields");
|
||||||
|
|
||||||
|
if(frm.doc.docstatus == 1 && frm.doc.approval_status == 'Approved') {
|
||||||
frm.add_custom_button(__('Accounting Ledger'), function() {
|
frm.add_custom_button(__('Accounting Ledger'), function() {
|
||||||
frappe.route_options = {
|
frappe.route_options = {
|
||||||
voucher_no: frm.doc.name,
|
voucher_no: frm.doc.name,
|
||||||
@@ -183,47 +172,41 @@ frappe.ui.form.on("Expense Claim", {
|
|||||||
frappe.set_route("query-report", "General Ledger");
|
frappe.set_route("query-report", "General Ledger");
|
||||||
}, __("View"));
|
}, __("View"));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
frappe.ui.form.on("Expense Claim Detail", {
|
if (frm.doc.docstatus===1 && frm.doc.approval_status=="Approved"
|
||||||
claim_amount: function(frm, cdt, cdn) {
|
&& (cint(frm.doc.total_amount_reimbursed) < cint(frm.doc.total_sanctioned_amount))
|
||||||
var child = locals[cdt][cdn];
|
&& frappe.model.can_create("Payment Entry")) {
|
||||||
var doc = frm.doc;
|
frm.add_custom_button(__('Payment'),
|
||||||
|
function() { frm.events.make_payment_entry(frm); }, __("Make"));
|
||||||
if(!child.sanctioned_amount){
|
|
||||||
frappe.model.set_value(cdt, cdn, 'sanctioned_amount', child.claim_amount)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.calculate_total(doc,cdt,cdn);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
sanctioned_amount: function(frm, cdt, cdn) {
|
make_payment_entry: function(frm) {
|
||||||
var doc = frm.doc;
|
var method = "erpnext.accounts.doctype.payment_entry.payment_entry.get_payment_entry";
|
||||||
cur_frm.cscript.calculate_total(doc,cdt,cdn);
|
if(frm.doc.__onload && frm.doc.__onload.make_payment_via_journal_entry) {
|
||||||
}
|
method = "erpnext.hr.doctype.expense_claim.expense_claim.make_bank_entry"
|
||||||
})
|
}
|
||||||
|
return frappe.call({
|
||||||
frappe.ui.form.on("Expense Claim",{
|
method: method,
|
||||||
setup: function(frm) {
|
args: {
|
||||||
frm.trigger("set_query_for_cost_center")
|
"dt": frm.doc.doctype,
|
||||||
frm.trigger("set_query_for_payable_account")
|
"dn": frm.doc.name
|
||||||
frm.add_fetch("company", "cost_center", "cost_center");
|
},
|
||||||
frm.add_fetch("company", "default_payable_account", "payable_account");
|
callback: function(r) {
|
||||||
|
var doclist = frappe.model.sync(r.message);
|
||||||
|
frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
refresh: function(frm) {
|
|
||||||
frm.trigger("toggle_fields")
|
|
||||||
},
|
|
||||||
|
|
||||||
set_query_for_cost_center: function(frm) {
|
set_query_for_cost_center: function(frm) {
|
||||||
frm.fields_dict["cost_center"].get_query = function() {
|
frm.fields_dict["cost_center"].get_query = function() {
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
"company": frm.doc.company
|
"company": frm.doc.company
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
}
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
set_query_for_payable_account: function(frm) {
|
set_query_for_payable_account: function(frm) {
|
||||||
@@ -233,25 +216,43 @@ frappe.ui.form.on("Expense Claim",{
|
|||||||
"report_type": "Balance Sheet",
|
"report_type": "Balance Sheet",
|
||||||
"account_type": "Payable"
|
"account_type": "Payable"
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
}
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
is_paid: function(frm) {
|
is_paid: function(frm) {
|
||||||
frm.trigger("toggle_fields")
|
frm.trigger("toggle_fields");
|
||||||
},
|
},
|
||||||
|
|
||||||
toggle_fields: function(frm) {
|
toggle_fields: function(frm) {
|
||||||
frm.toggle_reqd("mode_of_payment", frm.doc.is_paid)
|
frm.toggle_reqd("mode_of_payment", frm.doc.is_paid);
|
||||||
|
},
|
||||||
|
|
||||||
|
employee_name: function(frm) {
|
||||||
|
erpnext.expense_claim.set_title(frm);
|
||||||
|
},
|
||||||
|
|
||||||
|
task: function(frm) {
|
||||||
|
erpnext.expense_claim.set_title(frm);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
frappe.ui.form.on("Expense Claim", "employee_name", function(frm) {
|
frappe.ui.form.on("Expense Claim Detail", {
|
||||||
erpnext.expense_claim.set_title(frm);
|
claim_amount: function(frm, cdt, cdn) {
|
||||||
});
|
var child = locals[cdt][cdn];
|
||||||
|
var doc = frm.doc;
|
||||||
|
|
||||||
frappe.ui.form.on("Expense Claim", "task", function(frm) {
|
if(!child.sanctioned_amount){
|
||||||
erpnext.expense_claim.set_title(frm);
|
frappe.model.set_value(cdt, cdn, 'sanctioned_amount', child.claim_amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
cur_frm.cscript.calculate_total(doc,cdt,cdn);
|
||||||
|
},
|
||||||
|
|
||||||
|
sanctioned_amount: function(frm, cdt, cdn) {
|
||||||
|
var doc = frm.doc;
|
||||||
|
cur_frm.cscript.calculate_total(doc,cdt,cdn);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
cur_frm.fields_dict['task'].get_query = function(doc) {
|
cur_frm.fields_dict['task'].get_query = function(doc) {
|
||||||
@@ -259,5 +260,5 @@ cur_frm.fields_dict['task'].get_query = function(doc) {
|
|||||||
filters:{
|
filters:{
|
||||||
'project': doc.project
|
'project': doc.project
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
}
|
};
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ from frappe.utils.csvutils import getlink
|
|||||||
class InvalidExpenseApproverError(frappe.ValidationError): pass
|
class InvalidExpenseApproverError(frappe.ValidationError): pass
|
||||||
|
|
||||||
class ExpenseClaim(AccountsController):
|
class ExpenseClaim(AccountsController):
|
||||||
|
def onload(self):
|
||||||
|
self.get("__onload").make_payment_via_journal_entry = frappe.db.get_single_value('Accounts Settings',
|
||||||
|
'make_payment_via_journal_entry')
|
||||||
|
|
||||||
def get_feed(self):
|
def get_feed(self):
|
||||||
return _("{0}: From {0} for {1}").format(self.approval_status,
|
return _("{0}: From {0} for {1}").format(self.approval_status,
|
||||||
self.employee_name, self.total_claimed_amount)
|
self.employee_name, self.total_claimed_amount)
|
||||||
@@ -207,10 +211,10 @@ def get_expense_approver(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
""", ("%" + txt + "%"))
|
""", ("%" + txt + "%"))
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_bank_entry(docname):
|
def make_bank_entry(dt, dn):
|
||||||
from erpnext.accounts.doctype.journal_entry.journal_entry import get_default_bank_cash_account
|
from erpnext.accounts.doctype.journal_entry.journal_entry import get_default_bank_cash_account
|
||||||
|
|
||||||
expense_claim = frappe.get_doc("Expense Claim", docname)
|
expense_claim = frappe.get_doc(dt, dn)
|
||||||
default_bank_cash_account = get_default_bank_cash_account(expense_claim.company, "Bank")
|
default_bank_cash_account = get_default_bank_cash_account(expense_claim.company, "Bank")
|
||||||
if not default_bank_cash_account:
|
if not default_bank_cash_account:
|
||||||
default_bank_cash_account = get_default_bank_cash_account(expense_claim.company, "Cash")
|
default_bank_cash_account = get_default_bank_cash_account(expense_claim.company, "Cash")
|
||||||
@@ -218,7 +222,7 @@ def make_bank_entry(docname):
|
|||||||
je = frappe.new_doc("Journal Entry")
|
je = frappe.new_doc("Journal Entry")
|
||||||
je.voucher_type = 'Bank Entry'
|
je.voucher_type = 'Bank Entry'
|
||||||
je.company = expense_claim.company
|
je.company = expense_claim.company
|
||||||
je.remark = 'Payment against Expense Claim: ' + docname;
|
je.remark = 'Payment against Expense Claim: ' + dn;
|
||||||
|
|
||||||
je.append("accounts", {
|
je.append("accounts", {
|
||||||
"account": expense_claim.payable_account,
|
"account": expense_claim.payable_account,
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class TestExpenseClaim(unittest.TestCase):
|
|||||||
payable_account = get_payable_account("Wind Power LLC")
|
payable_account = get_payable_account("Wind Power LLC")
|
||||||
expense_claim = make_expense_claim(payable_account, 300, 200, "Wind Power LLC", "Travel Expenses - WP")
|
expense_claim = make_expense_claim(payable_account, 300, 200, "Wind Power LLC", "Travel Expenses - WP")
|
||||||
|
|
||||||
je_dict = make_bank_entry(expense_claim.name)
|
je_dict = make_bank_entry("Expense Claim", expense_claim.name)
|
||||||
je = frappe.get_doc(je_dict)
|
je = frappe.get_doc(je_dict)
|
||||||
je.posting_date = nowdate()
|
je.posting_date = nowdate()
|
||||||
je.cheque_no = random_string(5)
|
je.cheque_no = random_string(5)
|
||||||
|
|||||||
Reference in New Issue
Block a user