[enhancement] Quick Entry in Journal Entry, remember Posting Date

This commit is contained in:
Anand Doshi 2015-10-19 14:59:32 +05:30
parent 7f66983309
commit 87da662703
2 changed files with 168 additions and 85 deletions

View File

@ -8,10 +8,10 @@ frappe.require("assets/erpnext/js/utils.js");
frappe.ui.form.on("Journal Entry", { frappe.ui.form.on("Journal Entry", {
refresh: function(frm) { refresh: function(frm) {
erpnext.toggle_naming_series(); erpnext.toggle_naming_series();
cur_frm.cscript.voucher_type(frm.doc); frm.cscript.voucher_type(frm.doc);
if(frm.doc.docstatus==1) { if(frm.doc.docstatus==1) {
cur_frm.add_custom_button(__('View Ledger'), function() { frm.add_custom_button(__('View Ledger'), function() {
frappe.route_options = { frappe.route_options = {
"voucher_no": frm.doc.name, "voucher_no": frm.doc.name,
"from_date": frm.doc.posting_date, "from_date": frm.doc.posting_date,
@ -22,34 +22,22 @@ frappe.ui.form.on("Journal Entry", {
frappe.set_route("query-report", "General Ledger"); frappe.set_route("query-report", "General Ledger");
}, "icon-table"); }, "icon-table");
} }
if (frm.doc.__islocal) {
frm.add_custom_button(__('Quick Entry'), function() {
return erpnext.journal_entry.quick_entry(frm);
});
}
// hide /unhide fields based on currency // hide /unhide fields based on currency
erpnext.journal_entry.toggle_fields_based_on_currency(frm); erpnext.journal_entry.toggle_fields_based_on_currency(frm);
}, },
multi_currency: function(frm) { multi_currency: function(frm) {
erpnext.journal_entry.toggle_fields_based_on_currency(frm); erpnext.journal_entry.toggle_fields_based_on_currency(frm);
} }
}) })
erpnext.journal_entry.toggle_fields_based_on_currency = function(frm) {
var fields = ["currency_section", "account_currency", "exchange_rate", "debit", "credit"];
var grid = frm.get_field("accounts").grid;
if(grid) grid.set_column_disp(fields, frm.doc.multi_currency);
// dynamic label
var field_label_map = {
"debit_in_account_currency": "Debit",
"credit_in_account_currency": "Credit"
};
$.each(field_label_map, function (fieldname, label) {
var df = frappe.meta.get_docfield("Journal Entry Account", fieldname, frm.doc.name);
df.label = frm.doc.multi_currency ? (label + " in Account Currency") : label;
})
}
erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({
onload: function() { onload: function() {
this.load_defaults(); this.load_defaults();
@ -69,28 +57,19 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({
} }
); );
if(!this.frm.doc.amended_from) this.frm.doc.posting_date = get_today(); if(!this.frm.doc.amended_from) this.frm.doc.posting_date = this.frm.posting_date || get_today();
} }
}, },
setup_queries: function() { setup_queries: function() {
var me = this; var me = this;
me.frm.set_query("account", "accounts", function(doc, cdt, cdn) { me.frm.set_query("account", "accounts", function(doc, cdt, cdn) {
var filters = { return erpnext.journal_entry.account_query(me.frm);
company: me.frm.doc.company,
is_group: 0
};
if(!doc.multi_currency) {
$.extend(filters, {
account_currency: frappe.get_doc(":Company", me.frm.doc.company).default_currency
});
}
return { filters: filters };
}); });
me.frm.set_query("cost_center", "accounts", function(doc, cdt, cdn) { me.frm.set_query("cost_center", "accounts", function(doc, cdt, cdn) {
return { return {
filters: { filters: {
company: me.frm.doc.company, company: me.frm.doc.company,
is_group: 0 is_group: 0
@ -132,22 +111,22 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({
if(in_list(["Sales Invoice", "Purchase Invoice"], jvd.reference_type)) { if(in_list(["Sales Invoice", "Purchase Invoice"], jvd.reference_type)) {
out.filters.push([jvd.reference_type, "outstanding_amount", "!=", 0]); out.filters.push([jvd.reference_type, "outstanding_amount", "!=", 0]);
// account filter // account filter
frappe.model.validate_missing(jvd, "account"); frappe.model.validate_missing(jvd, "account");
party_account_field = jvd.reference_type==="Sales Invoice" ? "debit_to": "credit_to"; party_account_field = jvd.reference_type==="Sales Invoice" ? "debit_to": "credit_to";
out.filters.push([jvd.reference_type, party_account_field, "=", jvd.account]); out.filters.push([jvd.reference_type, party_account_field, "=", jvd.account]);
} else { } else {
// party_type and party mandatory // party_type and party mandatory
frappe.model.validate_missing(jvd, "party_type"); frappe.model.validate_missing(jvd, "party_type");
frappe.model.validate_missing(jvd, "party"); frappe.model.validate_missing(jvd, "party");
out.filters.push([jvd.reference_type, "per_billed", "<", 100]); out.filters.push([jvd.reference_type, "per_billed", "<", 100]);
} }
if(jvd.party_type && jvd.party) { if(jvd.party_type && jvd.party) {
out.filters.push([jvd.reference_type, out.filters.push([jvd.reference_type,
(jvd.reference_type.indexOf("Sales")===0 ? "customer" : "supplier"), "=", jvd.party]); (jvd.reference_type.indexOf("Sales")===0 ? "customer" : "supplier"), "=", jvd.party]);
} }
@ -244,6 +223,7 @@ cur_frm.cscript.company = function(doc, cdt, cdn) {
} }
cur_frm.cscript.posting_date = function(doc, cdt, cdn){ cur_frm.cscript.posting_date = function(doc, cdt, cdn){
cur_frm.posting_date = cur_frm.doc.posting_date;
erpnext.get_fiscal_year(doc.company, doc.posting_date); erpnext.get_fiscal_year(doc.company, doc.posting_date);
} }
@ -347,17 +327,17 @@ frappe.ui.form.on("Journal Entry Account", {
}); });
} }
}, },
account: function(frm, dt, dn) { account: function(frm, dt, dn) {
var d = locals[dt][dn]; var d = locals[dt][dn];
if(d.account) { if(d.account) {
if(!frm.doc.company) frappe.throw(__("Please select Company first")); if(!frm.doc.company) frappe.throw(__("Please select Company first"));
if(!frm.doc.posting_date) frappe.throw(__("Please select Posting Date first")); if(!frm.doc.posting_date) frappe.throw(__("Please select Posting Date first"));
return frappe.call({ return frappe.call({
method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_account_balance_and_party_type", method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_account_balance_and_party_type",
args: { args: {
account: d.account, account: d.account,
date: frm.doc.posting_date, date: frm.doc.posting_date,
company: frm.doc.company, company: frm.doc.company,
debit: flt(d.debit_in_account_currency), debit: flt(d.debit_in_account_currency),
@ -373,23 +353,23 @@ frappe.ui.form.on("Journal Entry Account", {
}); });
} }
}, },
debit_in_account_currency: function(frm, cdt, cdn) { debit_in_account_currency: function(frm, cdt, cdn) {
erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn); erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn);
}, },
credit_in_account_currency: function(frm, cdt, cdn) { credit_in_account_currency: function(frm, cdt, cdn) {
erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn); erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn);
}, },
debit: function(frm, dt, dn) { debit: function(frm, dt, dn) {
cur_frm.cscript.update_totals(frm.doc); cur_frm.cscript.update_totals(frm.doc);
}, },
credit: function(frm, dt, dn) { credit: function(frm, dt, dn) {
cur_frm.cscript.update_totals(frm.doc); cur_frm.cscript.update_totals(frm.doc);
}, },
exchange_rate: function(frm, cdt, cdn) { exchange_rate: function(frm, cdt, cdn) {
erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn); erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn);
} }
@ -399,41 +379,132 @@ frappe.ui.form.on("Journal Entry Account", "accounts_remove", function(frm) {
cur_frm.cscript.update_totals(frm.doc); cur_frm.cscript.update_totals(frm.doc);
}); });
erpnext.journal_entry.set_debit_credit_in_company_currency = function(frm, cdt, cdn) { $.extend(erpnext.journal_entry, {
erpnext.journal_entry.set_exchange_rate(frm, cdt, cdn); toggle_fields_based_on_currency: function(frm) {
var fields = ["currency_section", "account_currency", "exchange_rate", "debit", "credit"];
var row = locals[cdt][cdn];
frappe.model.set_value(cdt, cdn, "debit",
flt(flt(row.debit_in_account_currency)*row.exchange_rate), precision("debit", row));
frappe.model.set_value(cdt, cdn, "credit",
flt(flt(row.credit_in_account_currency)*row.exchange_rate), precision("credit", row));
}
erpnext.journal_entry.set_exchange_rate = function(frm, cdt, cdn) { var grid = frm.get_field("accounts").grid;
var company_currency = frappe.get_doc(":Company", frm.doc.company).default_currency; if(grid) grid.set_column_disp(fields, frm.doc.multi_currency);
var row = locals[cdt][cdn];
// dynamic label
if(row.account_currency == company_currency || !frm.doc.multi_currency) { var field_label_map = {
frappe.model.set_value(cdt, cdn, "exchange_rate", 1); "debit_in_account_currency": "Debit",
} else if (!row.exchange_rate || row.account_type == "Bank") { "credit_in_account_currency": "Credit"
frappe.call({ };
method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_exchange_rate",
args: { $.each(field_label_map, function (fieldname, label) {
account: row.account, var df = frappe.meta.get_docfield("Journal Entry Account", fieldname, frm.doc.name);
account_currency: row.account_currency, df.label = frm.doc.multi_currency ? (label + " in Account Currency") : label;
company: frm.doc.company,
reference_type: cstr(row.reference_type),
reference_name: cstr(row.reference_name),
debit: flt(row.debit_in_account_currency),
credit: flt(row.credit_in_account_currency),
exchange_rate: row.exchange_rate
},
callback: function(r) {
if(r.message) {
frappe.model.set_value(cdt, cdn, "exchange_rate", r.message);
}
}
}) })
},
set_debit_credit_in_company_currency: function(frm, cdt, cdn) {
erpnext.journal_entry.set_exchange_rate(frm, cdt, cdn);
var row = locals[cdt][cdn];
frappe.model.set_value(cdt, cdn, "debit",
flt(flt(row.debit_in_account_currency)*row.exchange_rate), precision("debit", row));
frappe.model.set_value(cdt, cdn, "credit",
flt(flt(row.credit_in_account_currency)*row.exchange_rate), precision("credit", row));
},
set_exchange_rate: function(frm, cdt, cdn) {
var company_currency = frappe.get_doc(":Company", frm.doc.company).default_currency;
var row = locals[cdt][cdn];
if(row.account_currency == company_currency || !frm.doc.multi_currency) {
frappe.model.set_value(cdt, cdn, "exchange_rate", 1);
} else if (!row.exchange_rate || row.account_type == "Bank") {
frappe.call({
method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_exchange_rate",
args: {
account: row.account,
account_currency: row.account_currency,
company: frm.doc.company,
reference_type: cstr(row.reference_type),
reference_name: cstr(row.reference_name),
debit: flt(row.debit_in_account_currency),
credit: flt(row.credit_in_account_currency),
exchange_rate: row.exchange_rate
},
callback: function(r) {
if(r.message) {
frappe.model.set_value(cdt, cdn, "exchange_rate", r.message);
}
}
})
}
},
quick_entry: function(frm) {
var naming_series_options = frm.fields_dict.naming_series.df.options;
var naming_series_default = frm.fields_dict.naming_series.df.default || naming_series_options.split("\n")[0];
var dialog = new frappe.ui.Dialog({
title: __("Quick Journal Entry"),
fields: [
{fieldtype: "Currency", fieldname: "debit", label: __("Amount"), reqd: 1},
{fieldtype: "Link", fieldname: "debit_account", label: __("Debit Account"), reqd: 1,
options: "Account",
get_query: function() {
return erpnext.journal_entry.account_query(frm);
}
},
{fieldtype: "Link", fieldname: "credit_account", label: __("Credit Account"), reqd: 1,
options: "Account",
get_query: function() {
return erpnext.journal_entry.account_query(frm);
}
},
{fieldtype: "Date", fieldname: "posting_date", label: __("Date"), reqd: 1,
default: frm.doc.posting_date},
{fieldtype: "Select", fieldname: "naming_series", label: __("Series"), reqd: 1,
options: naming_series_options, default: naming_series_default},
]
});
dialog.set_primary_action(__("Save"), function() {
var btn = this;
var values = dialog.get_values();
frm.set_value("posting_date", values.posting_date);
frm.set_value("naming_series", values.naming_series);
// clear table is used because there might've been an error while adding child
// and cleanup didn't happen
frm.clear_table("accounts");
// using grid.add_new_row() to add a row in UI as well as locals
// this is required because triggers try to refresh the grid
var debit_row = frm.fields_dict.accounts.grid.add_new_row();
frappe.model.set_value(debit_row.doctype, debit_row.name, "account", values.debit_account);
frappe.model.set_value(debit_row.doctype, debit_row.name, "debit_in_account_currency", values.debit);
var credit_row = frm.fields_dict.accounts.grid.add_new_row();
frappe.model.set_value(credit_row.doctype, credit_row.name, "account", values.credit_account);
frappe.model.set_value(credit_row.doctype, credit_row.name, "credit_in_account_currency", values.debit);
frm.save();
dialog.hide();
});
dialog.show();
},
account_query: function(frm) {
var filters = {
company: frm.doc.company,
is_group: 0
};
if(!frm.doc.multi_currency) {
$.extend(filters, {
account_currency: frappe.get_doc(":Company", frm.doc.company).default_currency
});
}
return { filters: filters };
} }
} });

View File

@ -12,6 +12,12 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
var today = get_today(), var today = get_today(),
currency = frappe.defaults.get_user_default("currency"); currency = frappe.defaults.get_user_default("currency");
$.each(["posting_date", "transaction_date"], function(i, fieldname) {
if (me.frm.fields_dict[fieldname] && !me.frm.doc[fieldname] && me.frm[fieldname]) {
me.frm.set_value(fieldname, me.frm[fieldname]);
}
});
$.each({ $.each({
posting_date: today, posting_date: today,
transaction_date: today, transaction_date: today,
@ -277,12 +283,18 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
}, },
transaction_date: function() { transaction_date: function() {
if (this.frm.doc.transaction_date) {
this.frm.transaction_date = this.frm.doc.transaction_date;
}
erpnext.get_fiscal_year(this.frm.doc.company, this.frm.doc.transaction_date); erpnext.get_fiscal_year(this.frm.doc.company, this.frm.doc.transaction_date);
}, },
posting_date: function() { posting_date: function() {
var me = this; var me = this;
if (this.frm.doc.posting_date) { if (this.frm.doc.posting_date) {
this.frm.posting_date = this.frm.doc.posting_date;
if ((this.frm.doc.doctype == "Sales Invoice" && this.frm.doc.customer) || if ((this.frm.doc.doctype == "Sales Invoice" && this.frm.doc.customer) ||
(this.frm.doc.doctype == "Purchase Invoice" && this.frm.doc.supplier)) { (this.frm.doc.doctype == "Purchase Invoice" && this.frm.doc.supplier)) {
return frappe.call({ return frappe.call({
@ -429,7 +441,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
setup_field_label_map(["total", "net_total", "total_taxes_and_charges", "discount_amount", setup_field_label_map(["total", "net_total", "total_taxes_and_charges", "discount_amount",
"grand_total", "taxes_and_charges_added", "taxes_and_charges_deducted", "grand_total", "taxes_and_charges_added", "taxes_and_charges_deducted",
"rounded_total", "in_words", "paid_amount", "write_off_amount"], this.frm.doc.currency); "rounded_total", "in_words", "paid_amount", "write_off_amount"], this.frm.doc.currency);
setup_field_label_map(["outstanding_amount", "total_advance"], this.frm.doc.party_account_currency); setup_field_label_map(["outstanding_amount", "total_advance"], this.frm.doc.party_account_currency);
cur_frm.set_df_property("conversion_rate", "description", "1 " + this.frm.doc.currency cur_frm.set_df_property("conversion_rate", "description", "1 " + this.frm.doc.currency