Patch system changes, Inclusive Price feature and session cache clear on disabling user or on new login
diff --git a/erpnext/accounts/doctype/rv_tax_detail/rv_tax_detail.txt b/erpnext/accounts/doctype/rv_tax_detail/rv_tax_detail.txt
index a9326a0..784c3b7 100644
--- a/erpnext/accounts/doctype/rv_tax_detail/rv_tax_detail.txt
+++ b/erpnext/accounts/doctype/rv_tax_detail/rv_tax_detail.txt
@@ -5,8 +5,8 @@
{
'creation': '2010-08-08 17:09:20',
'docstatus': 0,
- 'modified': '2010-09-20 14:06:57',
- 'modified_by': 'nabin@webnotestech.com',
+ 'modified': '2011-12-28 17:33:30',
+ 'modified_by': 'Administrator',
'owner': 'Administrator'
},
@@ -14,6 +14,7 @@
{
'autoname': 'INVTD.######',
'colour': 'White:FFF',
+ 'default_print_format': 'Standard',
'doctype': 'DocType',
'hide_heading': 1,
'istable': 1,
@@ -22,7 +23,7 @@
'section_style': 'Tray',
'server_code_error': ' ',
'show_in_menu': 0,
- 'version': 15
+ 'version': 18
},
# These values are common for all DocField
@@ -45,7 +46,6 @@
'doctype': 'DocField',
'fieldname': 'charge_type',
'fieldtype': 'Select',
- 'idx': 1,
'label': 'Type',
'oldfieldname': 'charge_type',
'oldfieldtype': 'Select',
@@ -60,7 +60,6 @@
'doctype': 'DocField',
'fieldname': 'account_head',
'fieldtype': 'Link',
- 'idx': 2,
'label': 'Account Head',
'oldfieldname': 'account_head',
'oldfieldtype': 'Link',
@@ -75,13 +74,11 @@
'doctype': 'DocField',
'fieldname': 'cost_center_other_charges',
'fieldtype': 'Link',
- 'idx': 3,
'label': 'Cost Center',
'oldfieldname': 'cost_center_other_charges',
'oldfieldtype': 'Link',
'options': 'Cost Center',
- 'permlevel': 0,
- 'search_index': 0
+ 'permlevel': 0
},
# DocField
@@ -89,7 +86,6 @@
'doctype': 'DocField',
'fieldname': 'description',
'fieldtype': 'Small Text',
- 'idx': 4,
'label': 'Description',
'oldfieldname': 'description',
'oldfieldtype': 'Small Text',
@@ -103,7 +99,6 @@
'doctype': 'DocField',
'fieldname': 'rate',
'fieldtype': 'Currency',
- 'idx': 5,
'label': 'Rate',
'oldfieldname': 'rate',
'oldfieldtype': 'Currency',
@@ -117,7 +112,6 @@
'doctype': 'DocField',
'fieldname': 'tax_amount',
'fieldtype': 'Currency',
- 'idx': 6,
'label': 'Amount*',
'oldfieldname': 'tax_amount',
'oldfieldtype': 'Currency',
@@ -131,7 +125,6 @@
'doctype': 'DocField',
'fieldname': 'total',
'fieldtype': 'Currency',
- 'idx': 7,
'label': 'Total*',
'oldfieldname': 'total',
'oldfieldtype': 'Currency',
@@ -144,7 +137,6 @@
'fieldname': 'row_id',
'fieldtype': 'Data',
'hidden': 0,
- 'idx': 8,
'label': 'Enter Row',
'oldfieldname': 'row_id',
'oldfieldtype': 'Data',
@@ -157,7 +149,6 @@
'doctype': 'DocField',
'fieldname': 'item_wise_tax_detail',
'fieldtype': 'Small Text',
- 'idx': 9,
'label': 'Item Wise Tax Detail ',
'oldfieldname': 'item_wise_tax_detail',
'oldfieldtype': 'Small Text',
@@ -170,7 +161,6 @@
'fieldname': 'parenttype',
'fieldtype': 'Data',
'hidden': 1,
- 'idx': 10,
'in_filter': 1,
'label': 'Parenttype',
'oldfieldname': 'parenttype',
@@ -188,7 +178,6 @@
'fieldname': 'total_tax_amount',
'fieldtype': 'Currency',
'hidden': 1,
- 'idx': 11,
'label': 'Total Tax Amount',
'no_copy': 1,
'oldfieldname': 'total_tax_amount',
@@ -205,7 +194,6 @@
'fieldname': 'total_amount',
'fieldtype': 'Currency',
'hidden': 1,
- 'idx': 12,
'label': 'Total Amount',
'no_copy': 1,
'oldfieldname': 'total_amount',
@@ -213,5 +201,20 @@
'permlevel': 0,
'print_hide': 1,
'report_hide': 1
+ },
+
+ # DocField
+ {
+ 'allow_on_submit': 0,
+ 'description': 'If checked, the tax amount will be considered as already included in the Print Rate / Print Amount',
+ 'doctype': 'DocField',
+ 'fieldname': 'included_in_print_rate',
+ 'fieldtype': 'Check',
+ 'label': 'Included in Print Rate',
+ 'no_column': 0,
+ 'no_copy': 1,
+ 'permlevel': 0,
+ 'print_hide': 1,
+ 'report_hide': 1
}
]
\ No newline at end of file
diff --git a/erpnext/home/page/my_company/my_company.py b/erpnext/home/page/my_company/my_company.py
index ad0089d..4931ea9 100644
--- a/erpnext/home/page/my_company/my_company.py
+++ b/erpnext/home/page/my_company/my_company.py
@@ -34,6 +34,11 @@
return 'Cannot disable Administrator'
webnotes.conn.sql("update tabProfile set enabled=0 where name=%s", arg)
+ sid_list = webnotes.conn.sql("SELECT sid FROM `tabSessions` WHERE user=%s", arg)
+ from webnotes.auth import LoginManager
+ login_manager = LoginManager()
+ for sid in sid_list:
+ login_manager.logout(sid=sid)
return 0
#
diff --git a/erpnext/patches/patch_list.py b/erpnext/patches/patch_list.py
new file mode 100644
index 0000000..80f1cc1
--- /dev/null
+++ b/erpnext/patches/patch_list.py
@@ -0,0 +1,11 @@
+patch_list = [
+ {
+ 'patch_file': 'reload_print_format',
+ 'description': 'Reload doctype print format'
+ },
+ {
+ 'patch_module': 'patches',
+ 'patch_file': 'reload_project_task',
+ 'description': 'Reload doctype task of project module'
+ }
+]
diff --git a/erpnext/selling/doctype/sales_common/sales_common.js b/erpnext/selling/doctype/sales_common/sales_common.js
index 23e0420..0cc8868 100644
--- a/erpnext/selling/doctype/sales_common/sales_common.js
+++ b/erpnext/selling/doctype/sales_common/sales_common.js
@@ -130,26 +130,47 @@
// ************************ REF RATE ****************************
cur_frm.cscript.ref_rate = function(doc, cdt, cdn){
- var d = locals[cdt][cdn];
- set_multiple(cur_frm.cscript.tname, d.name, {'export_rate': flt(d.ref_rate) * (100 - flt(d.adj_rate)) / 100}, cur_frm.cscript.fname);
- cur_frm.cscript.recalc(doc, 3);
+ var d = locals[cdt][cdn];
+ var consider_incl_rate = cur_frm.cscript.consider_incl_rate(doc, cur_frm.cscript.other_fname);
+ if(!consider_incl_rate) {
+ set_multiple(cur_frm.cscript.tname, d.name, {'export_rate': flt(d.ref_rate) * (100 - flt(d.adj_rate)) / 100}, cur_frm.cscript.fname);
+ }
+ cur_frm.cscript.recalc(doc, 1);
}
// *********************** BASIC RATE **************************
cur_frm.cscript.basic_rate = function(doc, cdt, cdn) {
- var fname = cur_frm.cscript.fname;
- var d = locals[cdt][cdn];;
- if(!d.qty)
- {
- d.qty = 1;
- refresh_field('qty', d.name, fname);
-
- }
- cur_frm.cscript.recalc(doc, 2);
+ var fname = cur_frm.cscript.fname;
+ var d = locals[cdt][cdn];
+ if(!d.qty) {
+ d.qty = 1;
+ refresh_field('qty', d.name, fname);
+ }
+ var consider_incl_rate = cur_frm.cscript.consider_incl_rate(doc, cur_frm.cscript.other_fname);
+ if(!consider_incl_rate) {
+ cur_frm.cscript.recalc(doc, 2);
+ } else {
+ var basic_rate = cur_frm.cscript.back_calc_basic_rate(
+ doc, cur_frm.cscript.tname, fname, d, cur_frm.cscript.other_fname
+ );
+ if (d.basic_rate != basic_rate.toFixed(2)) {
+ d.basic_rate = basic_rate;
+ refresh_field('basic_rate', d.name, fname);
+ msgprint("You cannot change Basic Rate* (Base Currency) when \
+ considering rates inclusive of taxes.<br /> \
+ Please either <br /> \
+ * Specify Basic Rate (i.e. Rate which will be displayed in print) <br /> \
+ -- or -- <br />\
+ * Uncheck 'Included in Print Rate' in the tax entries of Taxes section.");
+ }
+ }
}
// ************************ EXPORT RATE *************************
-cur_frm.cscript.export_rate = function(doc,cdt,cdn) { cur_frm.cscript.recalc(doc, 3);}
+cur_frm.cscript.export_rate = function(doc,cdt,cdn) {
+ doc = locals[doc.doctype][doc.name];
+ cur_frm.cscript.recalc(doc, 1);
+}
@@ -177,7 +198,7 @@
if(!flt(doc.conversion_rate)) { doc.conversion_rate = 1; refresh_field('conversion_rate'); }
if(!flt(doc.plc_conversion_rate)) { doc.plc_conversion_rate = 1; refresh_field('plc_conversion_rate'); }
- if(n > 0) cur_frm.cscript.update_fname_table(doc , tname , fname , n); // updates all values in table (i.e. amount, export amount, net total etc.)
+ if(n > 0) cur_frm.cscript.update_fname_table(doc , tname , fname , n, other_fname); // updates all values in table (i.e. amount, export amount, net total etc.)
if(flt(doc.net_total) > 0) {
var cl = getchildren('RV Tax Detail', doc.name, other_fname,doc.doctype);
@@ -218,11 +239,18 @@
for(var i = 0; i<cl.length; i++){
net_total += flt(cl[i].amount);
}
+ net_total_incl = net_total
var d = getchildren('RV Tax Detail', doc.name, other_fname,doc.doctype);
for(var j = 0; j<d.length; j++){
other_charges_total += flt(d[j].amount);
+ if(d[j].included_in_print_rate) {
+ net_total_incl += flt(d[j].amount);
+ }
}
- doc.net_total = flt(net_total);
+ console.log("Net Total: " + net_total);
+ console.log("Net Total Incl: " + net_total_incl);
+ console.log("Other Charges: " + other_charges_total);
+ doc.net_total = net_total_incl > net_total ? flt(net_total_incl) : flt(net_total);
doc.other_charges_total = flt(other_charges_total);
doc.grand_total = flt(flt(net_total) + flt(other_charges_total));
doc.rounded_total = Math.round(doc.grand_total);
@@ -278,9 +306,12 @@
// this is calculation part for all types
if(tax[t].charge_type != "Actual") tax[t].item_wise_tax_detail += item_wise_tax_detail;
- tax[t].total_amount = flt(tax_amount.toFixed(2)); //stores actual tax amount in virtual field
- tax[t].total_tax_amount = flt(prev_total.toFixed(2)); //stores total amount in virtual field
- tax[t].tax_amount += flt(tax_amount.toFixed(2));
+ //tax[t].total_amount = flt(tax_amount.toFixed(2)); //stores actual tax amount in virtual field
+ //tax[t].total_tax_amount = flt(prev_total.toFixed(2)); //stores total amount in virtual field
+ //tax[t].tax_amount += flt(tax_amount.toFixed(2));
+ tax[t].total_amount = flt(tax_amount); //stores actual tax amount in virtual field
+ tax[t].total_tax_amount = flt(prev_total); //stores total amount in virtual field
+ tax[t].tax_amount += flt(tax_amount);
var total_amount = flt(tax[t].tax_amount);
total_tax_amount = flt(tax[t].total_tax_amount) + flt(total_amount);
set_multiple('RV Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':total_amount, 'total':flt(total)+flt(tax[t].tax_amount)/*_tax_amount)*/}, other_fname);
@@ -311,7 +342,8 @@
refresh_field('total_excise_rate');
return
}
- return tax_amount = (flt(rate) * flt(cl.amount) / 100);
+
+ return tax_amount = (flt(rate) * flt(cl.amount) / 100);
}
else if(tax[t].charge_type == 'On Previous Row Amount'){
if(flt(print_amt) == 1) {
@@ -347,28 +379,150 @@
}
}
+// ********************** Functions for inclusive value calc ******************************
+cur_frm.cscript.consider_incl_rate = function(doc, other_fname) {
+ var tax_list = getchildren('RV Tax Detail', doc.name, other_fname, doc.doctype);
+ for(var i=0; i<tax_list.length; i++) {
+ if(tax_list[i].included_in_print_rate) {
+ console.log('consider incl rate');
+ return true;
+ }
+ }
+ console.log('do not consider incl rate');
+ return false;
+}
+
+cur_frm.cscript.back_calc_basic_rate = function(doc, tname, fname, child, other_fname) {
+
+ var get_item_tax_rate = function(item, tax) {
+ if(item.item_tax_rate) {
+ // Should to replace eval with JSON.parse when item_tax_rate is converted to json string notation
+ var item_tax = eval('var a='+item.item_tax_rate+';a');
+ if(item_tax[tax.account_head]!=null) {
+ return flt(item_tax[tax.account_head]);
+ }
+ }
+ };
+
+ var tax_list = getchildren('RV Tax Detail', doc.name, other_fname, doc.doctype);
+ var total = 1;
+ var temp_tax_list = [];
+ var amt = 0;
+ var item_tax_rate = 0;
+ var rate = 0;
+ for(var i=0; i<tax_list.length; i++) {
+ amt = 0;
+ item_tax_rate = get_item_tax_rate(child, tax_list[i]);
+ rate = item_tax_rate ? item_tax_rate : flt(tax_list[i].rate);
+ if(tax_list[i].included_in_print_rate) {
+ if(tax_list[i].charge_type=='On Net Total') {
+ amt = flt(rate / 100);
+ } else if(tax_list[i].charge_type=='On Previous Row Total') {
+ amt = flt((rate * temp_tax_list[tax_list[i].row_id-1]['total']) / 100);
+ } else if(tax_list[i].charge_type=='On Previous Row Amount') {
+ amt = flt((rate * temp_tax_list[tax_list[i].row_id-1]['amt']) / 100);
+ }
+ }
+ total += flt(amt);
+ temp_tax_list[i] = {
+ amt: amt,
+ total: total
+ };
+ }
+ var basic_rate = flt((child.export_rate * flt(doc.conversion_rate)) / total);
+ console.log(temp_tax_list);
+ console.log('in basic rate back calc');
+ console.log(basic_rate);
+ return basic_rate;
+}
+
+cur_frm.cscript.included_in_print_rate = function(doc, cdt, cdn) {
+ var tax = locals[cdt][cdn];
+ if(tax.included_in_print_rate==1) {
+ if(!inList(['On Net Total', 'On Previous Row Total', 'On Previous Row Amount'], tax.charge_type)) {
+ msgprint("Included in Print Rate (i.e. Inclusive Price) is only valid for charges of type: <br /> \
+ * On Net Total <br /> \
+ * On Previous Row Amount <br /> \
+ * On Previous Row Total");
+ tax.included_in_print_rate = 0;
+ refresh_field('included_in_print_rate', tax.name, cur_frm.cscript.other_fname);
+ } else if(inList(['On Previous Row Total', 'On Previous Row Amount'], tax.charge_type)){
+ if(tax.row_id) {
+ var tax_list = getchildren('RV Tax Detail', doc.name, cur_frm.cscript.other_fname, doc.doctype);
+ if(tax_list[tax.row_id-1].charge_type=='Actual') {
+ msgprint("Row of type 'Actual' cannot be depended on for type '" + tax.charge_type + "'\
+ when using tax inclusive prices.<br />\
+ This will lead to incorrect values.<br /><br /> \
+ <b>Please specify correct value in 'Enter Row' column of <span style='color:red'>Row: "
+ + tax.idx + "</span> in Taxes table</b>");
+ validated = false;
+ tax.included_in_print_rate = 0;
+ refresh_field('included_in_print_rate', tax.name, cur_frm.cscript.other_fname);
+ }
+ }
+ }
+ }
+}
+
// ********************** Update values in table ******************************
-cur_frm.cscript.update_fname_table = function(doc , tname , fname , n) {
+cur_frm.cscript.update_fname_table = function(doc , tname , fname , n, other_fname) {
doc = locals[doc.doctype][doc.name]
var net_total = 0
var cl = getchildren(tname, doc.name, fname);
+ var consider_incl_rate = cur_frm.cscript.consider_incl_rate(doc, other_fname);
for(var i=0;i<cl.length;i++) {
if(n == 1){
- if(flt(cl[i].ref_rate) > 0)
- set_multiple(tname, cl[i].name, {'export_rate': flt(flt(cl[i].ref_rate) * (100 - flt(cl[i].adj_rate)) / 100)}, fname);
- set_multiple(tname, cl[i].name, {'export_amount': flt(flt(cl[i].qty) * flt(cl[i].export_rate)), 'basic_rate': flt(flt(cl[i].export_rate) * flt(doc.conversion_rate)), 'amount': flt((flt(cl[i].export_rate) * flt(doc.conversion_rate)) * flt(cl[i].qty)) }, fname);
+ if(!consider_incl_rate && (flt(cl[i].ref_rate) > 0)) {
+ set_multiple(tname, cl[i].name, {
+ 'export_rate': flt(flt(cl[i].ref_rate) * (100 - flt(cl[i].adj_rate)) / 100)
+ }, fname);
+
+ set_multiple(tname, cl[i].name, {
+ 'export_amount': flt(flt(cl[i].qty) * flt(cl[i].export_rate)),
+ 'basic_rate': flt(flt(cl[i].export_rate) * flt(doc.conversion_rate)),
+ 'amount': flt((flt(cl[i].export_rate) * flt(doc.conversion_rate)) * flt(cl[i].qty))
+ }, fname);
+
+ var base_ref_rate = flt(cl[i].basic_rate) + flt(flt(cl[i].basic_rate) * flt(cl[i].adj_rate) / 100);
+ set_multiple(tname, cl[i].name, {
+ 'base_ref_rate': flt(base_ref_rate)
+ }, fname);
+
+ } else if(consider_incl_rate) {
+ if(flt(cl[i].export_rate) > 0) {
+ // calculate basic rate based on taxes
+ // then calculate and set basic_rate, base_ref_rate, ref_rate, amount, export_amount
+ var ref_rate = flt(cl[i].adj_rate)!=flt(100) ?
+ flt((100 * flt(cl[i].export_rate))/flt(100 - flt(cl[i].adj_rate))) :
+ flt(0)
+ set_multiple(tname, cl[i].name, { 'ref_rate': ref_rate }, fname);
+ } else if((flt(cl[i].ref_rate) > 0) && (flt(cl[i].adj_rate) > 0)) {
+ var export_rate = flt(cl[i].ref_rate) * flt(1 - flt(cl[i].adj_rate / 100));
+ set_multiple(tname, cl[i].name, { 'export_rate': flt(export_rate) }, fname);
+ }
+ console.log("export_rate: " + cl[i].export_rate);
+
+ var basic_rate = cur_frm.cscript.back_calc_basic_rate(doc, tname, fname, cl[i], other_fname);
+ var base_ref_rate = basic_rate + flt(basic_rate * flt(cl[i].adj_rate) / 100);
+ set_multiple(tname, cl[i].name, {
+ 'basic_rate': flt(basic_rate),
+ 'amount': flt(basic_rate * flt(cl[i].qty)),
+ 'export_amount': flt(flt(cl[i].qty) * flt(cl[i].export_rate)),
+ 'base_ref_rate': flt(base_ref_rate)
+ }, fname);
+ }
}
else if(n == 2){
if(flt(cl[i].ref_rate) > 0)
set_multiple(tname, cl[i].name, {'adj_rate': 100 - flt(flt(cl[i].basic_rate) * 100 / (flt(cl[i].ref_rate) * flt(doc.conversion_rate)))}, fname);
set_multiple(tname, cl[i].name, {'amount': flt(flt(cl[i].qty) * flt(cl[i].basic_rate)), 'export_rate': flt(flt(cl[i].basic_rate) / flt(doc.conversion_rate)), 'export_amount': flt((flt(cl[i].basic_rate) / flt(doc.conversion_rate)) * flt(cl[i].qty)) }, fname);
}
- else if(n == 3){
+ /*else if(n == 3){
set_multiple(tname, cl[i].name, {'basic_rate': flt(flt(cl[i].export_rate) * flt(doc.conversion_rate))}, fname);
set_multiple(tname, cl[i].name, {'amount' : flt(flt(cl[i].basic_rate) * flt(cl[i].qty)), 'export_amount': flt(flt(cl[i].export_rate) * flt(cl[i].qty))}, fname);
if(cl[i].ref_rate > 0)
set_multiple(tname, cl[i].name, {'adj_rate': 100 - flt(flt(cl[i].export_rate) * 100 / flt(cl[i].ref_rate)), 'base_ref_rate': flt(flt(cl[i].ref_rate) * flt(doc.conversion_rate)) }, fname);
- }
+ }*/
net_total += flt(flt(cl[i].qty) * flt(cl[i].basic_rate));
}
doc.net_total = net_total;
@@ -389,20 +543,31 @@
}
cur_frm.cscript['Calculate Charges'] = function(doc, cdt, cdn) {
- var other_fname = cur_frm.cscript.other_fname;
+ var other_fname = cur_frm.cscript.other_fname;
- var cl = getchildren('RV Tax Detail', doc.name, other_fname, doc.doctype);
- for(var i = 0; i<cl.length; i++){
- cl[i].total_tax_amount = 0;
- cl[i].total_amount = 0;
- cl[i].tax_amount = 0; // this is done to calculate other charges
- cl[i].total = 0;
- if(in_list(['On Previous Row Amount','On Previous Row Total'],cl[i].charge_type) && !cl[i].row_id){
- alert("Please Enter Row on which amount needs to be calculated for row : "+cl[i].idx);
- validated = false;
- }
- }
- cur_frm.cscript.recalc(doc, 1);
+ var cl = getchildren('RV Tax Detail', doc.name, other_fname, doc.doctype);
+ for(var i = 0; i<cl.length; i++){
+ cl[i].total_tax_amount = 0;
+ cl[i].total_amount = 0;
+ cl[i].tax_amount = 0; // this is done to calculate other charges
+ cl[i].total = 0;
+ if(in_list(['On Previous Row Amount','On Previous Row Total'], cl[i].charge_type)) {
+ if(!cl[i].row_id){
+ alert("Please Enter Row on which amount needs to be calculated for row : "+cl[i].idx);
+ validated = false;
+ } else if(cl[cl[i].row_id-1].charge_type=='Actual') {
+ msgprint("Row of type 'Actual' cannot be depended on for type '" + cl[i].charge_type + "'\
+ when using tax inclusive prices.<br />\
+ This will lead to incorrect values.<br /><br /> \
+ <b>Please specify correct value in 'Enter Row' column of <span style='color:red'>Row: "
+ + cl[i].idx + "</span> in Taxes table</b>");
+ validated = false;
+ cl[i].included_in_print_rate = 0;
+ refresh_field('included_in_print_rate', cl[i].name, other_fname);
+ }
+ }
+ }
+ cur_frm.cscript.recalc(doc, 1);
}
// Get Sales Partner Commission
diff --git a/erpnext/setup/doctype/other_charges/other_charges.js b/erpnext/setup/doctype/other_charges/other_charges.js
index 4c154f5..ddc9755 100644
--- a/erpnext/setup/doctype/other_charges/other_charges.js
+++ b/erpnext/setup/doctype/other_charges/other_charges.js
@@ -36,7 +36,7 @@
// add rows
if(cl.length){
for(var i=0;i<cl.length;i++){
- if(fmt_money(convert_rate(cl[i].tax_amount))!=0)
+ if(fmt_money(convert_rate(cl[i].tax_amount))!=0 && !cl[i].included_in_print_rate)
out += make_row(cl[i].description,fmt_money(convert_rate(cl[i].tax_amount)),0);
}
}
diff --git a/erpnext/startup/event_handlers.py b/erpnext/startup/event_handlers.py
index 53b979e..59f31d3 100644
--- a/erpnext/startup/event_handlers.py
+++ b/erpnext/startup/event_handlers.py
@@ -45,6 +45,12 @@
webnotes.session['data']['login_from'] = webnotes.form.getvalue('login_from')
webnotes.session_obj.update()
+ sid_list = webnotes.conn.sql("SELECT sid FROM `tabSessions` WHERE user=%s AND sid!=%s", (webnotes.session['user'], webnotes.session['sid']))
+ from webnotes.auth import LoginManager
+ login_manager = LoginManager()
+ for sid in sid_list:
+ login_manager.logout(sid=sid)
+
update_account_details()
#
@@ -53,7 +59,7 @@
def on_logout(login_manager):
if cint(webnotes.conn.get_value('Control Panel', None, 'sync_with_gateway')):
from server_tools.gateway_utils import logout_sso
- logout_sso()
+ logout_sso(login_manager.sid)
#
# create a profile (if logs in for the first time)
@@ -81,4 +87,4 @@
p.enabled = 1
p.owner = user
p.save(1)
-
\ No newline at end of file
+