Merge branch 'master' into edge
diff --git a/accounts/doctype/fiscal_year/test_fiscal_year.py b/accounts/doctype/fiscal_year/test_fiscal_year.py
index b209b39..456b15a 100644
--- a/accounts/doctype/fiscal_year/test_fiscal_year.py
+++ b/accounts/doctype/fiscal_year/test_fiscal_year.py
@@ -3,6 +3,11 @@
test_records = [
[{
"doctype": "Fiscal Year",
+ "year": "_Test Fiscal Year 2012",
+ "year_start_date": "2012-01-01"
+ }],
+ [{
+ "doctype": "Fiscal Year",
"year": "_Test Fiscal Year 2013",
"year_start_date": "2013-01-01"
}],
diff --git a/accounts/doctype/journal_voucher/journal_voucher.js b/accounts/doctype/journal_voucher/journal_voucher.js
index 82322c8..78956bf 100644
--- a/accounts/doctype/journal_voucher/journal_voucher.js
+++ b/accounts/doctype/journal_voucher/journal_voucher.js
@@ -84,13 +84,13 @@
var td=0.0; var tc =0.0;
var el = getchildren('Journal Voucher Detail', doc.name, 'entries');
for(var i in el) {
- td += flt(el[i].debit);
- tc += flt(el[i].credit);
+ td += flt(el[i].debit, 2);
+ tc += flt(el[i].credit, 2);
}
var doc = locals[doc.doctype][doc.name];
doc.total_debit = td;
doc.total_credit = tc;
- doc.difference = flt(td - tc);
+ doc.difference = flt((td - tc), 2);
refresh_many(['total_debit','total_credit','difference']);
}
diff --git a/accounts/doctype/journal_voucher/journal_voucher.py b/accounts/doctype/journal_voucher/journal_voucher.py
index 812ab7d..9b1ca7a 100644
--- a/accounts/doctype/journal_voucher/journal_voucher.py
+++ b/accounts/doctype/journal_voucher/journal_voucher.py
@@ -114,8 +114,8 @@
debit, credit = 0.0, 0.0
debit_list, credit_list = [], []
for d in getlist(self.doclist, 'entries'):
- debit += flt(d.debit)
- credit += flt(d.credit)
+ debit += flt(d.debit, 2)
+ credit += flt(d.credit, 2)
if flt(d.debit)>0 and (d.account not in debit_list): debit_list.append(d.account)
if flt(d.credit)>0 and (d.account not in credit_list): credit_list.append(d.account)
@@ -289,32 +289,32 @@
if not getlist(self.doclist,'entries'):
msgprint("Please enter atleast 1 entry in 'GL Entries' table")
else:
- flag, self.doc.total_debit, self.doc.total_credit = 0,0,0
- diff = flt(self.doc.difference)
+ flag, self.doc.total_debit, self.doc.total_credit = 0, 0, 0
+ diff = flt(self.doc.difference, 2)
# If any row without amount, set the diff on that row
for d in getlist(self.doclist,'entries'):
- if not d.credit and not d.debit and flt(diff) != 0:
+ if not d.credit and not d.debit and diff != 0:
if diff>0:
- d.credit = flt(diff)
+ d.credit = diff
elif diff<0:
- d.debit = flt(diff)
+ d.debit = diff
flag = 1
# Set the diff in a new row
- if flag == 0 and (flt(diff) != 0):
+ if flag == 0 and diff != 0:
jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', self.doclist)
if diff>0:
- jd.credit = flt(abs(diff))
+ jd.credit = abs(diff)
elif diff<0:
- jd.debit = flt(abs(diff))
+ jd.debit = abs(diff)
# Set the total debit, total credit and difference
for d in getlist(self.doclist,'entries'):
- self.doc.total_debit += flt(d.debit)
- self.doc.total_credit += flt(d.credit)
+ self.doc.total_debit += flt(d.debit, 2)
+ self.doc.total_credit += flt(d.credit, 2)
- self.doc.difference = flt(self.doc.total_debit) - flt(self.doc.total_credit)
+ self.doc.difference = flt(self.doc.total_debit, 2) - flt(self.doc.total_credit, 2)
def get_outstanding_invoices(self):
self.doclist = self.doc.clear_table(self.doclist, 'entries')
@@ -375,9 +375,9 @@
(filters["account"], "%%%s%%" % txt, start, page_len))
def get_against_jv(doctype, txt, searchfield, start, page_len, filters):
- return webnotes.conn.sql("""select name, posting_date, user_remark
+ return webnotes.conn.sql("""select jv.name, jv.posting_date, jv.user_remark
from `tabJournal Voucher` jv, `tabJournal Voucher Detail` jv_detail
- where jv_detail.parent = jv.name and jv_detail.account = %s and docstatus = 1
+ where jv_detail.parent = jv.name and jv_detail.account = %s and jv.docstatus = 1
and jv.%s like %s order by jv.name desc limit %s, %s""" %
("%s", searchfield, "%s", "%s", "%s"),
(filters["account"], "%%%s%%" % txt, start, page_len))
\ No newline at end of file
diff --git a/accounts/doctype/pos_setting/pos_setting.py b/accounts/doctype/pos_setting/pos_setting.py
index 0e68e2a..a024f6e 100755
--- a/accounts/doctype/pos_setting/pos_setting.py
+++ b/accounts/doctype/pos_setting/pos_setting.py
@@ -16,30 +16,37 @@
from __future__ import unicode_literals
import webnotes
-
-from webnotes.model import db_exists
-from webnotes.model.bean import copy_doclist
-from webnotes import msgprint
-
-sql = webnotes.conn.sql
-
-
+from webnotes import msgprint, _
+from webnotes.utils import cint
class DocType:
def __init__(self,doc,doclist=[]):
self.doc, self.doclist = doc,doclist
- #--------------------get naming series from sales invoice-----------------
def get_series(self):
import webnotes.model.doctype
docfield = webnotes.model.doctype.get('Sales Invoice')
- series = [d.options for d in docfield if d.doctype == 'DocField' and d.fieldname == 'naming_series']
+ series = [d.options for d in docfield
+ if d.doctype == 'DocField' and d.fieldname == 'naming_series']
return series and series[0] or ''
def validate(self):
- res = sql("select name, user from `tabPOS Setting` where ifnull(user, '') = '%s' and name != '%s' and company = '%s'" % (self.doc.user, self.doc.name, self.doc.company))
+ self.check_for_duplicate()
+ self.validate_expense_account()
+
+ def check_for_duplicate(self):
+ res = webnotes.conn.sql("""select name, user from `tabPOS Setting`
+ where ifnull(user, '') = %s and name != %s and company = %s""",
+ (self.doc.user, self.doc.name, self.doc.company))
if res:
if res[0][1]:
- msgprint("POS Setting '%s' already created for user: '%s' and company: '%s'"%(res[0][0], res[0][1], self.doc.company), raise_exception=1)
+ msgprint("POS Setting '%s' already created for user: '%s' and company: '%s'" %
+ (res[0][0], res[0][1], self.doc.company), raise_exception=1)
else:
- msgprint("Global POS Setting already created - %s for this company: '%s'" % (res[0][0], self.doc.company), raise_exception=1)
+ msgprint("Global POS Setting already created - %s for this company: '%s'" %
+ (res[0][0], self.doc.company), raise_exception=1)
+
+ def validate_expense_account(self):
+ if cint(webnotes.defaults.get_global_default("auto_inventory_accounting")) \
+ and not self.doc.expense_account:
+ msgprint(_("Expense Account is mandatory"), raise_exception=1)
\ No newline at end of file
diff --git a/accounts/doctype/pos_setting/pos_setting.txt b/accounts/doctype/pos_setting/pos_setting.txt
index a625ad8..4e30b57 100755
--- a/accounts/doctype/pos_setting/pos_setting.txt
+++ b/accounts/doctype/pos_setting/pos_setting.txt
@@ -1,8 +1,8 @@
[
{
- "creation": "2013-01-24 11:03:29",
+ "creation": "2013-03-26 11:03:07",
"docstatus": 0,
- "modified": "2013-03-25 15:27:52",
+ "modified": "2013-03-26 12:48:18",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -18,7 +18,8 @@
"parent": "POS Setting",
"parentfield": "fields",
"parenttype": "DocType",
- "permlevel": 0
+ "permlevel": 0,
+ "read_only": 0
},
{
"doctype": "DocPerm",
@@ -141,12 +142,15 @@
"reqd": 1
},
{
+ "depends_on": "eval:sys_defaults.auto_inventory_accounting",
"doctype": "DocField",
"fieldname": "expense_account",
"fieldtype": "Link",
+ "hidden": 0,
"label": "Expense Account",
"options": "Account",
- "reqd": 1
+ "print_hide": 1,
+ "reqd": 0
},
{
"doctype": "DocField",
diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.py b/accounts/doctype/purchase_invoice/purchase_invoice.py
index fb9977c..85fdb47 100644
--- a/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -306,7 +306,9 @@
def set_against_expense_account(self):
auto_inventory_accounting = \
cint(webnotes.defaults.get_global_default("auto_inventory_accounting"))
- stock_not_billed_account = self.get_company_default("stock_received_but_not_billed")
+
+ if auto_inventory_accounting:
+ stock_not_billed_account = self.get_company_default("stock_received_but_not_billed")
against_accounts = []
for item in self.doclist.get({"parentfield": "entries"}):
diff --git a/accounts/doctype/sales_invoice/sales_invoice.js b/accounts/doctype/sales_invoice/sales_invoice.js
index 5cc09a0..9532a54 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/accounts/doctype/sales_invoice/sales_invoice.js
@@ -307,35 +307,27 @@
);
}
-
-
-// Make Bank Voucher Button
-// -------------------------
-cur_frm.cscript.make_bank_voucher = function(doc, dt, dn) {
- $c('accounts.get_default_bank_account', { company: cur_frm.doc.company }, function(r, rt) {
- if(!r.exc) {
- cur_frm.cscript.make_jv(cur_frm.doc, null, null, r.message);
+cur_frm.cscript.make_bank_voucher = function() {
+ wn.call({
+ method: "accounts.doctype.journal_voucher.journal_voucher.get_default_bank_cash_account",
+ args: {
+ "company": cur_frm.doc.company,
+ "voucher_type": "Bank Voucher"
+ },
+ callback: function(r) {
+ cur_frm.cscript.make_jv(cur_frm.doc, null, null, r.message);
}
});
}
-
-/* ***************************** Get Query Functions ************************** */
-
-// Debit To
-// ---------
cur_frm.fields_dict.debit_to.get_query = function(doc) {
return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Debit" AND tabAccount.is_pl_account = "No" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus!=2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"'
}
-// Cash/bank account
-//------------------
cur_frm.fields_dict.cash_bank_account.get_query = function(doc) {
return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Debit" AND tabAccount.is_pl_account = "No" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus!=2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"'
}
-// Write off account
-//------------------
cur_frm.fields_dict.write_off_account.get_query = function(doc) {
return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Debit" AND tabAccount.is_pl_account = "Yes" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus!=2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"'
}
@@ -429,17 +421,24 @@
cur_frm.cscript.income_account = function(doc, cdt, cdn){
+ cur_frm.cscript.copy_account_in_all_row(doc, cdt, cdn, "income_account");
+}
+
+cur_frm.cscript.expense_account = function(doc, cdt, cdn){
+ cur_frm.cscript.copy_account_in_all_row(doc, cdt, cdn, "expense_account");
+}
+
+cur_frm.cscript.copy_account_in_all_row = function(doc, cdt, cdn, fieldname) {
var d = locals[cdt][cdn];
- if(d.income_account){
+ if(d[fieldname]){
var cl = getchildren('Sales Invoice Item', doc.name, cur_frm.cscript.fname, doc.doctype);
for(var i = 0; i < cl.length; i++){
- if(!cl[i].income_account) cl[i].income_account = d.income_account;
+ if(!cl[i][fieldname]) cl[i][fieldname] = d[fieldname];
}
}
refresh_field(cur_frm.cscript.fname);
}
-
cur_frm.cscript.cost_center = function(doc, cdt, cdn){
var d = locals[cdt][cdn];
if(d.cost_center){
@@ -451,10 +450,6 @@
refresh_field(cur_frm.cscript.fname);
}
-/* **************************************** Utility Functions *************************************** */
-
-// Details Calculation
-// --------------------
cur_frm.cscript.calc_adjustment_amount = function(doc,cdt,cdn) {
var doc = locals[doc.doctype][doc.name];
var el = getchildren('Sales Invoice Advance',doc.name,'advance_adjustment_details');
@@ -488,8 +483,9 @@
// credit to bank
var d1 = wn.model.add_child(jv, 'Journal Voucher Detail', 'entries');
- d1.account = bank_account;
+ d1.account = bank_account.account;
d1.debit = doc.outstanding_amount;
+ d1.balance = bank_account.balance;
loaddoc('Journal Voucher', jv.name);
}
diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py
index a46e299..246dada 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/accounts/doctype/sales_invoice/sales_invoice.py
@@ -318,9 +318,8 @@
@property
def pos_details(self):
if not hasattr(self, "_pos_details"):
- dtl = webnotes.conn.sql("""select income_account, warehouse, cost_center,
- expense_account from `tabPOS Setting` where user = %s and company = %s""",
- (webnotes.session['user'], self.doc.company), as_dict=1)
+ dtl = webnotes.conn.sql("""select * from `tabPOS Setting` where user = %s
+ and company = %s""", (webnotes.session['user'], self.doc.company), as_dict=1)
if not dtl:
dtl = webnotes.conn.sql("""select income_account, warehouse, cost_center,
expense_account from `tabPOS Setting` where ifnull(user,'') = ''
@@ -641,7 +640,6 @@
self.values.append({
'item_code' : d['item_code'],
'warehouse' : wh,
- 'transaction_date' : getdate(self.doc.modified).strftime('%Y-%m-%d'),
'posting_date' : self.doc.posting_date,
'posting_time' : self.doc.posting_time,
'voucher_type' : 'Sales Invoice',
diff --git a/home/page/latest_updates/latest_updates.js b/home/page/latest_updates/latest_updates.js
index 183352c..a7a148a 100644
--- a/home/page/latest_updates/latest_updates.js
+++ b/home/page/latest_updates/latest_updates.js
@@ -1,4 +1,5 @@
erpnext.updates = [
+ ["27th March", ["Rename multiple items together. Go to Setup > Rename Tool"]],
["19th March", ["Sales and Purchase Return Tool deprecated. Use Stock Entry instead."]],
["12th March", ["Updates to website module. Added more options in Style Settings and Website Settings."]],
["5th March", ["Refactored Upload Attendance Tool"]],
diff --git a/hr/doctype/upload_attendance/upload_attendance.js b/hr/doctype/upload_attendance/upload_attendance.js
index 0c1d7b2..35a00ed 100644
--- a/hr/doctype/upload_attendance/upload_attendance.js
+++ b/hr/doctype/upload_attendance/upload_attendance.js
@@ -44,20 +44,17 @@
show_upload: function() {
var me = this;
var $wrapper = $(cur_frm.fields_dict.upload_html.wrapper).empty();
- var upload_area = $('<div id="dit-upload-area"></div>').appendTo($wrapper);
// upload
wn.upload.make({
- parent: $('#dit-upload-area'),
+ parent: $wrapper,
args: {
method: 'hr.doctype.upload_attendance.upload_attendance.upload'
},
sample_url: "e.g. http://example.com/somefile.csv",
callback: function(r) {
var $log_wrapper = $(cur_frm.fields_dict.import_log.wrapper).empty();
- var log_area = $('<div id="dit-output"></div>').appendTo($log_wrapper);
- $wrapper.find(".dit-progress-area").toggle(false);
if(!r.messages) r.messages = [];
// replace links if error has occured
if(r.exc || r.error) {
@@ -81,7 +78,7 @@
console.log(r.messages);
$.each(r.messages, function(i, v) {
- var $p = $('<p>').html(v).appendTo('#dit-output');
+ var $p = $('<p>').html(v).appendTo($log_wrapper);
if(v.substr(0,5)=='Error') {
$p.css('color', 'red');
} else if(v.substr(0,8)=='Inserted') {
@@ -96,11 +93,8 @@
});
// rename button
- $('#dit-upload-area form input[type="submit"]')
+ $wrapper.find('form input[type="submit"]')
.attr('value', 'Upload and Import')
- .click(function() {
- $wrapper.find(".dit-progress-area").toggle(true);
- });
}
})
diff --git a/patches/march_2013/p03_update_buying_amount.py b/patches/march_2013/p03_update_buying_amount.py
index e45a3db..ae0c5ea 100644
--- a/patches/march_2013/p03_update_buying_amount.py
+++ b/patches/march_2013/p03_update_buying_amount.py
@@ -3,8 +3,8 @@
def execute():
dn_list = webnotes.conn.sql("""select name from `tabDelivery Note` where docstatus < 2""")
for dn in dn_list:
- webnotes.bean("Delivery Note", dn[0]).set_buying_amount()
+ webnotes.bean("Delivery Note", dn[0]).run_method("set_buying_amount")
si_list = webnotes.conn.sql("""select name from `tabSales Invoice` where docstatus < 2""")
for si in si_list:
- webnotes.bean("Sales Invoice", si[0]).set_buying_amount()
\ No newline at end of file
+ webnotes.bean("Sales Invoice", si[0]).run_method("set_buying_amount")
\ No newline at end of file
diff --git a/patches/march_2013/p07_update_valuation_rate.py b/patches/march_2013/p07_update_valuation_rate.py
index 0bce8a4..51e556b 100644
--- a/patches/march_2013/p07_update_valuation_rate.py
+++ b/patches/march_2013/p07_update_valuation_rate.py
@@ -1,7 +1,7 @@
import webnotes
def execute():
- for purchase_invoice in webnotes.conn.sql("""select distinct parent
+ for purchase_invoice in webnotes.conn.sql_list("""select distinct parent
from `tabPurchase Invoice Item` where docstatus = 1 and ifnull(valuation_rate, 0)=0"""):
pi = webnotes.get_obj("Purchase Invoice", purchase_invoice)
pi.calculate_taxes_and_totals()
diff --git a/patches/march_2013/p08_create_aii_accounts.py b/patches/march_2013/p08_create_aii_accounts.py
index c39c206..ff53d8b 100644
--- a/patches/march_2013/p08_create_aii_accounts.py
+++ b/patches/march_2013/p08_create_aii_accounts.py
@@ -1,24 +1,59 @@
import webnotes
def execute():
+ add_group_accounts()
+ add_ledger_accounts()
+
+def _check(parent_account, company):
+ def _get_root(is_pl_account, debit_or_credit):
+ res = webnotes.conn.sql("""select name from `tabAccount`
+ where company=%s and is_pl_account = %s and debit_or_credit = %s
+ and ifnull(parent_account, "") ="" """, (company, is_pl_account, debit_or_credit))
+ return res and res[0][0] or None
+
+ if not webnotes.conn.exists("Account", parent_account):
+ if parent_account.startswith("Current Assets"):
+ parent_account = _get_root("No", "Debit")
+ elif parent_account.startswith("Direct Expenses"):
+ parent_account = _get_root("Yes", "Debit")
+ elif parent_account.startswith("Current Liabilities"):
+ parent_account = _get_root("No", "Credit")
+
+ return parent_account
+
+
+def add_group_accounts():
accounts_to_add = [
["Stock Assets", "Current Assets", "Group", ""],
+ ["Stock Expenses", "Direct Expenses", "Group", "Expense Account"],
+ ["Stock Liabilities", "Current Liabilities", "Group", ""],
+ ]
+
+ add_accounts(accounts_to_add, _check)
+
+
+def add_ledger_accounts():
+ accounts_to_add = [
["Stock In Hand", "Stock Assets", "Ledger", ""],
["Stock Debit But Not Billed", "Stock Assets", "Ledger", ""],
- ["Stock Expenses", "Direct Expenses", "Group", "Expense Account"],
["Cost of Goods Sold", "Stock Expenses", "Ledger", "Expense Account"],
["Stock Adjustment", "Stock Expenses", "Ledger", "Expense Account"],
["Expenses Included In Valuation", "Stock Expenses", "Ledger", "Expense Account"],
- ["Stock Liabilities", "Current Liabilities", "Group", ""],
["Stock Received But Not Billed", "Stock Liabilities", "Ledger", ""],
]
+ add_accounts(accounts_to_add)
- for company, abbr in webnotes.conn.sql_list("""select name, abbr from `tabCompany`"""):
+
+def add_accounts(accounts_to_add, check_fn=None):
+ for company, abbr in webnotes.conn.sql("""select name, abbr from `tabCompany`"""):
for account_name, parent_account_name, group_or_ledger, account_type in accounts_to_add:
if not webnotes.conn.exists("Account", "%s - %s" % (account_name, abbr)):
+ parent_account = "%s - %s" % (parent_account_name, abbr)
+ if check_fn:
+ parent_account = check_fn(parent_account, company)
account = webnotes.bean({
"doctype": "Account",
"account_name": account_name,
- "parent_account": "%s - %s" % (parent_account_name, abbr),
+ "parent_account": parent_account,
"group_or_ledger": group_or_ledger,
"account_type": account_type,
"company": company
diff --git a/patches/march_2013/p09_unset_user_type_partner.py b/patches/march_2013/p09_unset_user_type_partner.py
new file mode 100644
index 0000000..cc5cdce
--- /dev/null
+++ b/patches/march_2013/p09_unset_user_type_partner.py
@@ -0,0 +1,6 @@
+import webnotes
+
+def execute():
+ webnotes.conn.sql("""update `tabProfile` set user_type='System User'
+ where user_type='Partner' and exists (select name from `tabUserRole`
+ where parent=`tabProfile`.name)""")
\ No newline at end of file
diff --git a/patches/patch_list.py b/patches/patch_list.py
index 00dd5da..0c5427b 100644
--- a/patches/patch_list.py
+++ b/patches/patch_list.py
@@ -217,5 +217,6 @@
"execute:webnotes.bean('Global Defaults').save()",
"patches.march_2013.p07_update_project_in_stock_ledger",
"execute:webnotes.bean('Style Settings').save() #2013-03-25",
- "execute:webnotes.conn.set_value('Email Settings', None, 'send_print_in_body_and_attachment', 1)"
+ "execute:webnotes.conn.set_value('Email Settings', None, 'send_print_in_body_and_attachment', 1)",
+ "patches.march_2013.p09_unset_user_type_partner",
]
\ No newline at end of file
diff --git a/projects/doctype/project/project.js b/projects/doctype/project/project.js
index 7f847b9..d4a034f 100644
--- a/projects/doctype/project/project.js
+++ b/projects/doctype/project/project.js
@@ -26,6 +26,9 @@
.appendTo(cur_frm.fields_dict.project_tasks.wrapper);
cur_frm.gantt_area.empty();
erpnext.show_task_gantt(cur_frm.gantt_area, cur_frm.docname);
+ } else {
+ if(cur_frm.gantt_area)
+ cur_frm.gantt_area.empty();
}
}
diff --git a/selling/doctype/lead/lead.txt b/selling/doctype/lead/lead.txt
index 40d2f1b..e162551 100644
--- a/selling/doctype/lead/lead.txt
+++ b/selling/doctype/lead/lead.txt
@@ -1,8 +1,8 @@
[
{
- "creation": "2013-01-28 10:06:01",
+ "creation": "2013-01-28 17:07:01",
"docstatus": 0,
- "modified": "2013-01-28 15:28:49",
+ "modified": "2013-03-26 14:05:01",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -23,18 +23,13 @@
"permlevel": 0
},
{
- "amend": 0,
- "create": 1,
"doctype": "DocPerm",
"name": "__common__",
"parent": "Lead",
"parentfield": "permissions",
"parenttype": "DocType",
- "permlevel": 0,
"read": 1,
- "report": 1,
- "submit": 0,
- "write": 1
+ "submit": 0
},
{
"doctype": "DocType",
@@ -65,6 +60,19 @@
"search_index": 1
},
{
+ "description": "Name of organization from where lead has come",
+ "doctype": "DocField",
+ "fieldname": "company_name",
+ "fieldtype": "Data",
+ "in_filter": 1,
+ "in_list_view": 1,
+ "label": "Company Name",
+ "oldfieldname": "company_name",
+ "oldfieldtype": "Data",
+ "reqd": 0,
+ "search_index": 0
+ },
+ {
"doctype": "DocField",
"fieldname": "email_id",
"fieldtype": "Data",
@@ -105,45 +113,12 @@
"no_copy": 1,
"oldfieldname": "source",
"oldfieldtype": "Select",
- "options": "\nAdvertisement\nBlog\nCampaign\nCall\nCustomer\nExhibition\nSupplier\nWebsite\nEmail",
+ "options": "\nAdvertisement\nBlog Post\nCampaign\nCall\nCustomer\nExhibition\nSupplier\nWebsite\nEmail",
"reqd": 0,
"search_index": 0
},
{
- "doctype": "DocField",
- "fieldname": "communication_history",
- "fieldtype": "Section Break"
- },
- {
- "allow_on_submit": 0,
- "doctype": "DocField",
- "fieldname": "communication_html",
- "fieldtype": "HTML",
- "label": "Communication HTML",
- "oldfieldname": "follow_up",
- "oldfieldtype": "Table"
- },
- {
- "doctype": "DocField",
- "fieldname": "sb8",
- "fieldtype": "Section Break",
- "label": "Lead Details"
- },
- {
- "description": "Name of organization from where lead has come",
- "doctype": "DocField",
- "fieldname": "company_name",
- "fieldtype": "Data",
- "in_filter": 1,
- "in_list_view": 1,
- "label": "Company Name",
- "oldfieldname": "company_name",
- "oldfieldtype": "Data",
- "reqd": 0,
- "search_index": 0
- },
- {
- "depends_on": "eval:doc.source == 'Existing Customer'",
+ "depends_on": "eval:doc.source == 'Customer'",
"description": "Source of th",
"doctype": "DocField",
"fieldname": "customer",
@@ -168,19 +143,24 @@
},
{
"doctype": "DocField",
- "fieldname": "column_break1",
- "fieldtype": "Column Break",
- "width": "50%"
+ "fieldname": "communication_history",
+ "fieldtype": "Section Break"
+ },
+ {
+ "allow_on_submit": 0,
+ "doctype": "DocField",
+ "fieldname": "communication_html",
+ "fieldtype": "HTML",
+ "label": "Communication HTML",
+ "oldfieldname": "follow_up",
+ "oldfieldtype": "Table"
},
{
"doctype": "DocField",
- "fieldname": "type",
- "fieldtype": "Select",
- "in_filter": 1,
- "label": "Lead Type",
- "oldfieldname": "type",
- "oldfieldtype": "Select",
- "options": "\nClient\nChannel Partner\nConsultant"
+ "fieldname": "contact_info",
+ "fieldtype": "Section Break",
+ "label": "Contact Info",
+ "oldfieldtype": "Column Break"
},
{
"doctype": "DocField",
@@ -192,13 +172,6 @@
},
{
"doctype": "DocField",
- "fieldname": "contact_info",
- "fieldtype": "Section Break",
- "label": "Contact Info",
- "oldfieldtype": "Column Break"
- },
- {
- "doctype": "DocField",
"fieldname": "phone",
"fieldtype": "Data",
"label": "Phone",
@@ -313,6 +286,16 @@
"oldfieldtype": "Section Break"
},
{
+ "doctype": "DocField",
+ "fieldname": "type",
+ "fieldtype": "Select",
+ "in_filter": 1,
+ "label": "Lead Type",
+ "oldfieldname": "type",
+ "oldfieldtype": "Select",
+ "options": "\nClient\nChannel Partner\nConsultant"
+ },
+ {
"default": "__user",
"doctype": "DocField",
"fieldname": "lead_owner",
@@ -462,18 +445,69 @@
"label": "Blog Subscriber"
},
{
- "cancel": 0,
+ "create": 1,
"doctype": "DocPerm",
- "role": "Sales User"
+ "permlevel": 0,
+ "report": 1,
+ "role": "Guest",
+ "write": 1
},
{
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "doctype": "DocPerm",
+ "permlevel": 1,
+ "report": 0,
+ "role": "Sales User",
+ "write": 0
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "doctype": "DocPerm",
+ "permlevel": 1,
+ "report": 0,
+ "role": "Sales Manager",
+ "write": 0
+ },
+ {
+ "amend": 0,
"cancel": 1,
+ "create": 1,
"doctype": "DocPerm",
- "role": "Sales Manager"
+ "permlevel": 0,
+ "report": 1,
+ "role": "Sales Manager",
+ "write": 1
},
{
+ "amend": 0,
"cancel": 0,
+ "create": 1,
"doctype": "DocPerm",
- "role": "System Manager"
+ "permlevel": 0,
+ "report": 1,
+ "role": "Sales User",
+ "write": 1
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "doctype": "DocPerm",
+ "permlevel": 1,
+ "role": "All"
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "doctype": "DocPerm",
+ "permlevel": 0,
+ "report": 1,
+ "role": "System Manager",
+ "write": 1
}
]
\ No newline at end of file
diff --git a/selling/doctype/sales_common/sales_common.js b/selling/doctype/sales_common/sales_common.js
index e15565a..8a8d8d0 100644
--- a/selling/doctype/sales_common/sales_common.js
+++ b/selling/doctype/sales_common/sales_common.js
@@ -860,9 +860,9 @@
alert("Commision rate cannot be greater than 100.");
doc.total_commission = 0;
doc.commission_rate = 0;
- }
- else
+ } else {
doc.total_commission = doc.net_total * doc.commission_rate / 100;
+ }
refresh_many(['total_commission','commission_rate']);
}
@@ -874,9 +874,9 @@
alert("Total commission cannot be greater than net total.");
doc.total_commission = 0;
doc.commission_rate = 0;
- }
- else
+ } else {
doc.commission_rate = doc.total_commission * 100 / doc.net_total;
+ }
refresh_many(['total_commission','commission_rate']);
}
}
diff --git a/setup/doctype/email_settings/email_settings.txt b/setup/doctype/email_settings/email_settings.txt
index 1de2c93..5547c2e 100644
--- a/setup/doctype/email_settings/email_settings.txt
+++ b/setup/doctype/email_settings/email_settings.txt
@@ -1,10 +1,10 @@
[
{
- "creation": "2012-07-12 23:29:44",
+ "creation": "2013-03-25 17:53:21",
"docstatus": 0,
- "modified": "2013-03-25 17:32:05",
+ "modified": "2013-03-25 18:41:27",
"modified_by": "Administrator",
- "owner": "harshada@webnotestech.com"
+ "owner": "Administrator"
},
{
"allow_copy": 1,
@@ -34,9 +34,7 @@
"parenttype": "DocType",
"permlevel": 0,
"read": 1,
- "report": 0,
"role": "System Manager",
- "submit": 0,
"write": 1
},
{
diff --git a/setup/page/setup/setup.js b/setup/page/setup/setup.js
index a9df459..e59a18a 100644
--- a/setup/page/setup/setup.js
+++ b/setup/page/setup/setup.js
@@ -76,6 +76,12 @@
label: wn._("Manage numbering series"),
"description":wn._("Set multiple numbering series for transactions")
},
+ {
+ "route":"Form/Rename Tool",
+ doctype: "Rename Tool",
+ label: wn._("Rename Tool"),
+ "description":wn._("Rename multiple items in one go")
+ },
]
},
{
diff --git a/stock/DocType Mapper/Purchase Order-Purchase Receipt/Purchase Order-Purchase Receipt.txt b/stock/DocType Mapper/Purchase Order-Purchase Receipt/Purchase Order-Purchase Receipt.txt
index 8d7fab1..0833aaa 100644
--- a/stock/DocType Mapper/Purchase Order-Purchase Receipt/Purchase Order-Purchase Receipt.txt
+++ b/stock/DocType Mapper/Purchase Order-Purchase Receipt/Purchase Order-Purchase Receipt.txt
@@ -1,189 +1,169 @@
[
{
- "owner": "Administrator",
+ "creation": "2013-02-22 01:28:05",
"docstatus": 0,
- "creation": "2010-08-08 17:09:35",
+ "modified": "2013-03-26 07:58:20",
"modified_by": "Administrator",
- "modified": "2012-04-02 14:03:39"
+ "owner": "Administrator"
},
{
+ "doctype": "Table Mapper Detail",
"name": "__common__",
"parent": "Purchase Order-Purchase Receipt",
- "doctype": "Table Mapper Detail",
- "parenttype": "DocType Mapper",
- "parentfield": "table_mapper_details"
+ "parentfield": "table_mapper_details",
+ "parenttype": "DocType Mapper"
},
{
+ "doctype": "Field Mapper Detail",
"map": "Yes",
"name": "__common__",
"parent": "Purchase Order-Purchase Receipt",
- "doctype": "Field Mapper Detail",
- "parenttype": "DocType Mapper",
- "parentfield": "field_mapper_details"
+ "parentfield": "field_mapper_details",
+ "parenttype": "DocType Mapper"
},
{
- "name": "__common__",
- "to_doctype": "Purchase Receipt",
- "module": "Stock",
"doctype": "DocType Mapper",
+ "from_doctype": "Purchase Order",
+ "module": "Stock",
+ "name": "__common__",
"ref_doc_submitted": 1,
- "from_doctype": "Purchase Order"
+ "to_doctype": "Purchase Receipt"
},
{
- "name": "Purchase Order-Purchase Receipt",
- "doctype": "DocType Mapper"
+ "doctype": "DocType Mapper",
+ "name": "Purchase Order-Purchase Receipt"
},
{
- "match_id": 0,
- "to_field": "supplier",
+ "checking_operator": "=",
"doctype": "Field Mapper Detail",
"from_field": "supplier",
- "checking_operator": "="
+ "match_id": 0,
+ "to_field": "supplier"
},
{
- "match_id": 0,
- "to_field": "company",
+ "checking_operator": "=",
"doctype": "Field Mapper Detail",
"from_field": "company",
- "checking_operator": "="
+ "match_id": 0,
+ "to_field": "company"
},
{
- "match_id": 0,
- "to_field": "currency",
+ "checking_operator": "=",
"doctype": "Field Mapper Detail",
"from_field": "currency",
- "checking_operator": "="
+ "match_id": 0,
+ "to_field": "currency"
},
{
- "to_field": "prevdoc_detail_docname",
"doctype": "Field Mapper Detail",
+ "from_field": "name",
"match_id": 1,
- "from_field": "name"
+ "to_field": "prevdoc_detail_docname"
},
{
- "to_field": "prevdoc_docname",
"doctype": "Field Mapper Detail",
+ "from_field": "parent",
"match_id": 1,
- "from_field": "parent"
+ "to_field": "prevdoc_docname"
},
{
- "to_field": "prevdoc_doctype",
"doctype": "Field Mapper Detail",
+ "from_field": "parenttype",
"match_id": 1,
- "from_field": "parenttype"
+ "to_field": "prevdoc_doctype"
},
{
- "match_id": 1,
- "to_field": "item_code",
+ "checking_operator": "=",
"doctype": "Field Mapper Detail",
"from_field": "item_code",
- "checking_operator": "="
- },
- {
- "to_field": "received_qty",
- "doctype": "Field Mapper Detail",
"match_id": 1,
- "from_field": "eval:(flt(obj.qty) - flt(obj.received_qty)) "
+ "to_field": "item_code"
},
{
- "to_field": "qty",
"doctype": "Field Mapper Detail",
+ "from_field": "eval:(flt(obj.qty) - flt(obj.received_qty)) ",
"match_id": 1,
- "from_field": "eval:(flt(obj.qty) - flt(obj.received_qty)) "
+ "to_field": "received_qty"
},
{
- "to_field": "stock_qty",
"doctype": "Field Mapper Detail",
+ "from_field": "eval:(flt(obj.qty) - flt(obj.received_qty)) ",
"match_id": 1,
- "from_field": "eval:(flt(obj.qty) - flt(obj.received_qty)) * flt(obj.conversion_factor)"
+ "to_field": "qty"
},
{
- "to_field": "import_amount",
"doctype": "Field Mapper Detail",
+ "from_field": "eval:(flt(obj.qty) - flt(obj.received_qty)) * flt(obj.conversion_factor)",
"match_id": 1,
- "from_field": "eval:(flt(obj.qty) - flt(obj.received_qty)) * flt(obj.import_rate)"
+ "to_field": "stock_qty"
},
{
- "to_field": "amount",
"doctype": "Field Mapper Detail",
+ "from_field": "eval:(flt(obj.qty) - flt(obj.received_qty)) * flt(obj.import_rate)",
"match_id": 1,
- "from_field": "eval:(flt(obj.qty) - flt(obj.received_qty)) * flt(obj.purchase_rate)"
+ "to_field": "import_amount"
},
{
- "to_field": "schedule_date",
"doctype": "Field Mapper Detail",
+ "from_field": "eval:(flt(obj.qty) - flt(obj.received_qty)) * flt(obj.purchase_rate)",
"match_id": 1,
- "from_field": "schedule_date"
+ "to_field": "amount"
},
{
- "to_field": "net_total",
"doctype": "Field Mapper Detail",
+ "from_field": "schedule_date",
+ "match_id": 1,
+ "to_field": "schedule_date"
+ },
+ {
+ "doctype": "Field Mapper Detail",
+ "from_field": "net_total",
"match_id": 0,
- "from_field": "net_total"
+ "to_field": "net_total"
},
{
- "to_field": "grand_total",
"doctype": "Field Mapper Detail",
+ "from_field": "grand_total",
"match_id": 0,
- "from_field": "grand_total"
+ "to_field": "grand_total"
},
{
- "to_field": "total_tax",
"doctype": "Field Mapper Detail",
+ "from_field": "total_tax",
"match_id": 0,
- "from_field": "total_tax"
+ "to_field": "total_tax"
},
{
- "to_field": "conversion_rate",
"doctype": "Field Mapper Detail",
+ "from_field": "conversion_rate",
"match_id": 0,
- "from_field": "conversion_rate"
+ "to_field": "conversion_rate"
},
{
- "reference_key": "prevdoc_detail_docname",
- "match_id": 1,
- "reference_doctype_key": "prevdoc_doctype",
- "to_field": "purchase_receipt_details",
"doctype": "Table Mapper Detail",
"from_field": "po_details",
"from_table": "Purchase Order Item",
+ "match_id": 1,
+ "reference_doctype_key": "prevdoc_doctype",
+ "reference_key": "prevdoc_detail_docname",
+ "to_field": "purchase_receipt_details",
"to_table": "Purchase Receipt Item",
"validation_logic": "docstatus=1 and qty > ifnull(received_qty,0)"
},
{
- "reference_key": "prevdoc_detail_docname",
- "match_id": 1,
- "reference_doctype_key": "prevdoc_doctype",
- "to_field": "purchase_receipt_details",
- "doctype": "Table Mapper Detail",
- "from_field": "po_details",
- "from_table": "Purchase Order Item",
- "to_table": "Purchase Receipt Item",
- "validation_logic": "docstatus=1 and qty > ifnull(received_qty,0)"
- },
- {
- "reference_key": "prevdoc_docname",
- "match_id": 0,
"doctype": "Table Mapper Detail",
"from_table": "Purchase Order",
+ "match_id": 0,
+ "reference_key": "prevdoc_docname",
"to_table": "Purchase Receipt",
"validation_logic": "docstatus = 1"
},
{
- "match_id": 2,
- "to_field": "purchase_tax_details",
"doctype": "Table Mapper Detail",
"from_field": "purchase_tax_details",
"from_table": "Purchase Taxes and Charges",
- "to_table": "Purchase Taxes and Charges",
- "validation_logic": "docstatus = 1"
- },
- {
"match_id": 2,
"to_field": "purchase_tax_details",
- "doctype": "Table Mapper Detail",
- "from_field": "purchase_tax_details",
- "from_table": "Purchase Taxes and Charges",
"to_table": "Purchase Taxes and Charges",
"validation_logic": "docstatus = 1"
}
diff --git a/stock/doctype/delivery_note/delivery_note.js b/stock/doctype/delivery_note/delivery_note.js
index c7feb1b..61df6b0 100644
--- a/stock/doctype/delivery_note/delivery_note.js
+++ b/stock/doctype/delivery_note/delivery_note.js
@@ -310,6 +310,17 @@
}
}
+cur_frm.cscript.expense_account = function(doc, cdt, cdn){
+ var d = locals[cdt][cdn];
+ if(d.expense_account) {
+ var cl = getchildren('Delivery Note Item', doc.name, cur_frm.cscript.fname, doc.doctype);
+ for(var i = 0; i < cl.length; i++){
+ if(!cl[i].expense_account) cl[i].expense_account = d.expense_account;
+ }
+ }
+ refresh_field(cur_frm.cscript.fname);
+}
+
// expense account
cur_frm.fields_dict['delivery_note_details'].grid.get_field('expense_account').get_query = function(doc) {
return {
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index 16d1795..ded6897 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -377,7 +377,6 @@
self.values.append({
'item_code' : d['item_code'],
'warehouse' : wh,
- 'transaction_date' : getdate(self.doc.modified).strftime('%Y-%m-%d'),
'posting_date' : self.doc.posting_date,
'posting_time' : self.doc.posting_time,
'voucher_type' : 'Delivery Note',
diff --git a/stock/doctype/item/test_item.py b/stock/doctype/item/test_item.py
index f31f245..dbbeecc 100644
--- a/stock/doctype/item/test_item.py
+++ b/stock/doctype/item/test_item.py
@@ -146,4 +146,23 @@
"is_sub_contracted_item": "No",
"stock_uom": "_Test UOM"
}],
+ [{
+ "doctype": "Item",
+ "item_code": "_Test Serialized Item",
+ "item_name": "_Test Serialized Item",
+ "description": "_Test Serialized Item",
+ "item_group": "_Test Item Group Desktops",
+ "is_stock_item": "Yes",
+ "is_asset_item": "No",
+ "has_batch_no": "No",
+ "has_serial_no": "Yes",
+ "is_purchase_item": "Yes",
+ "is_sales_item": "Yes",
+ "is_service_item": "No",
+ "is_sample_item": "No",
+ "inspection_required": "No",
+ "is_pro_applicable": "No",
+ "is_sub_contracted_item": "No",
+ "stock_uom": "_Test UOM"
+ }],
]
\ No newline at end of file
diff --git a/stock/doctype/serial_no/serial_no.py b/stock/doctype/serial_no/serial_no.py
index 00f2de7..5b15977 100644
--- a/stock/doctype/serial_no/serial_no.py
+++ b/stock/doctype/serial_no/serial_no.py
@@ -19,14 +19,11 @@
from webnotes.utils import cint, getdate, nowdate
import datetime
-
-sql = webnotes.conn.sql
-msgprint = webnotes.msgprint
+from webnotes import msgprint, _
+from controllers.stock_controller import StockController
-from utilities.transaction_base import TransactionBase
-
-class DocType(TransactionBase):
+class DocType(StockController):
def __init__(self, doc, doclist=[]):
self.doc = doc
self.doclist = doclist
@@ -54,21 +51,14 @@
"""
Validate whether serial no is required for this item
"""
- item = sql("select name, has_serial_no from tabItem where name = '%s'" % self.doc.item_code)
+ item = webnotes.conn.sql("select name, has_serial_no from tabItem where name = '%s'" % self.doc.item_code)
if not item:
msgprint("Item is not exists in the system", raise_exception=1)
elif item[0][1] == 'No':
msgprint("To proceed please select 'Yes' in 'Has Serial No' in Item master: '%s'" % self.doc.item_code, raise_exception=1)
- # ---------
- # validate
- # ---------
def validate(self):
- # import utilities
- # utilities.validate_status(self.doc.status, ["In Store", "Delivered",
- # "Not in Use", "Purchase Returned"])
-
self.validate_warranty_status()
self.validate_amc_status()
self.validate_warehouse()
@@ -77,10 +67,12 @@
def on_update(self):
if self.doc.warehouse and self.doc.status == 'In Store' \
and cint(self.doc.sle_exists) == 0 and \
- not sql("""select name from `tabStock Ledger Entry` where serial_no = %s and
- ifnull(is_cancelled, 'No') = 'No'""", self.doc.name):
+ not webnotes.conn.sql("""select name from `tabStock Ledger Entry`
+ where serial_no = %s and ifnull(is_cancelled, 'No') = 'No'""", self.doc.name):
self.make_stock_ledger_entry(1)
webnotes.conn.set(self.doc, 'sle_exists', 1)
+
+ self.make_gl_entries()
def make_stock_ledger_entry(self, qty):
from webnotes.model.code import get_obj
@@ -105,15 +97,13 @@
get_obj('Stock Ledger').update_stock(values)
- # ---------
- # on trash
- # ---------
def on_trash(self):
if self.doc.status == 'Delivered':
msgprint("Cannot trash Serial No : %s as it is already Delivered" % (self.doc.name), raise_exception = 1)
elif self.doc.status == 'In Store':
webnotes.conn.set(self.doc, 'status', 'Not in Use')
self.make_stock_ledger_entry(-1)
+ self.make_gl_entries(cancel=True)
def on_cancel(self):
@@ -121,6 +111,7 @@
def on_restore(self):
self.make_stock_ledger_entry(1)
+ self.make_gl_entries()
def on_rename(self, new, old):
"""rename serial_no text fields"""
@@ -135,7 +126,16 @@
where name=%s""" % (dt[0], '%s', '%s'),
('\n'.join(serial_nos), item[0]))
+ def make_gl_entries(self, cancel=False):
+ if not cint(webnotes.defaults.get_global_default("auto_inventory_accounting")):
+ return
-
+ from accounts.general_ledger import make_gl_entries
+ against_stock_account = self.get_company_default("stock_adjustment_account")
+ gl_entries = self.get_gl_entries_for_stock(against_stock_account, self.doc.purchase_rate)
+
+ for entry in gl_entries:
+ entry["posting_date"] = self.doc.purchase_date
-
\ No newline at end of file
+ if gl_entries:
+ make_gl_entries(gl_entries, cancel)
\ No newline at end of file
diff --git a/stock/doctype/serial_no/test_serial_no.py b/stock/doctype/serial_no/test_serial_no.py
index ef20de8..fb27aa9 100644
--- a/stock/doctype/serial_no/test_serial_no.py
+++ b/stock/doctype/serial_no/test_serial_no.py
@@ -1,93 +1,102 @@
# ERPNext - web based ERP (http://erpnext.com)
-# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
+# For license information, please see license.txt
from __future__ import unicode_literals
-import unittest
-import webnotes
-from webnotes.tests import insert_test_data
-
-company = webnotes.conn.get_default("company")
+import webnotes, unittest
class TestSerialNo(unittest.TestCase):
- def setUp(self):
- webnotes.conn.begin()
- self.insert_test_data()
-
- def tearDown(self):
- # print "Message Log:", "\n--\n".join(webnotes.message_log)
- # print "Debug Log:", "\n--\n".join(webnotes.debug_log)
- webnotes.conn.rollback()
+ def test_aii_gl_entries_for_serial_no_in_store(self):
+ webnotes.defaults.set_global_default("auto_inventory_accounting", 1)
- def test_serialized_stock_entry(self):
- data = [["2012-01-01", "01:00", "10001", 400, 400],
- ["2012-01-01", "03:00", "10002", 500, 700],
- ["2012-01-01", "04:00", "10003", 700, 700],
- ["2012-01-01", "05:00", "10004", 1200, 800],
- ["2012-01-01", "05:00", "10005", 800, 800],
- ["2012-01-01", "02:00", "10006", 1200, 800],
- ["2012-01-01", "06:00", "10007", 1500, 900]]
- for d in data:
- webnotes.bean([{
- "doctype": "Serial No",
- "item_code": "Nebula 8",
- "warehouse": "Default Warehouse",
- "status": "In Store",
- "sle_exists": 0,
- "purchase_date": d[0],
- "purchase_time": d[1],
- "serial_no": d[2],
- "purchase_rate": d[3],
- "company": company,
- }]).insert()
+ sr = webnotes.bean(copy=test_records[0])
+ sr.doc.serial_no = "_Test Serial No 1"
+ sr.insert()
+
+ stock_in_hand_account = webnotes.conn.get_value("Company", "_Test Company",
+ "stock_in_hand_account")
+ against_stock_account = webnotes.conn.get_value("Company", "_Test Company",
+ "stock_adjustment_account")
+
+ # check stock ledger entries
+ sle = webnotes.conn.sql("""select * from `tabStock Ledger Entry`
+ where voucher_type = 'Serial No' and voucher_no = %s""", sr.doc.name, as_dict=1)[0]
+ self.assertTrue(sle)
+ self.assertEquals([sle.item_code, sle.warehouse, sle.actual_qty],
+ ["_Test Serialized Item", "_Test Warehouse", 1.0])
- for d in data:
- res = webnotes.conn.sql("""select valuation_rate from `tabStock Ledger Entry`
- where posting_date=%s and posting_time=%s and actual_qty=1 and serial_no=%s""",
- (d[0], d[1], d[2]))
- self.assertEquals(res[0][0], d[4])
+ # check gl entries
+ gl_entries = webnotes.conn.sql("""select account, debit, credit
+ from `tabGL Entry` where voucher_type='Serial No' and voucher_no=%s
+ order by account desc""", sr.doc.name, as_dict=1)
+ self.assertTrue(gl_entries)
- print "deleted"
- webnotes.delete_doc("Serial No", "10002")
+ expected_values = [
+ [stock_in_hand_account, 1000.0, 0.0],
+ [against_stock_account, 0.0, 1000.0]
+ ]
- test_data = [["10001", 400, 400],
- ["10003", 700, 766.666667],
- ["10004", 1200, 875],
- ["10005", 800, 860],
- ["10006", 1200, 800],
- ["10007", 1500, 966.666667]]
+ for i, gle in enumerate(gl_entries):
+ self.assertEquals(expected_values[i][0], gle.account)
+ self.assertEquals(expected_values[i][1], gle.debit)
+ self.assertEquals(expected_values[i][2], gle.credit)
- for d in test_data:
- res = webnotes.conn.sql("""select valuation_rate from `tabStock Ledger Entry`
- where actual_qty=1 and serial_no=%s""", (d[0],))
- self.assertEquals(res[0][0], d[2])
+ sr.load_from_db()
+ self.assertEquals(sr.doc.sle_exists, 1)
+
+ # save again
+ sr.save()
+ gl_entries = webnotes.conn.sql("""select account, debit, credit
+ from `tabGL Entry` where voucher_type='Serial No' and voucher_no=%s
+ order by account desc""", sr.doc.name, as_dict=1)
+
+ for i, gle in enumerate(gl_entries):
+ self.assertEquals(expected_values[i][0], gle.account)
+ self.assertEquals(expected_values[i][1], gle.debit)
+ self.assertEquals(expected_values[i][2], gle.credit)
+
+ # trash/cancel
+ sr.submit()
+ sr.cancel()
+
+ gl_count = webnotes.conn.sql("""select count(name) from `tabGL Entry`
+ where voucher_type='Serial No' and voucher_no=%s and ifnull(is_cancelled, 'No') = 'Yes'
+ order by account asc, name asc""", sr.doc.name)
+
+ self.assertEquals(gl_count[0][0], 4)
+
+ webnotes.defaults.set_global_default("auto_inventory_accounting", 0)
+
+
+ def test_aii_gl_entries_for_serial_no_delivered(self):
+ webnotes.defaults.set_global_default("auto_inventory_accounting", 1)
+
+ sr = webnotes.bean(copy=test_records[0])
+ sr.doc.serial_no = "_Test Serial No 2"
+ sr.doc.status = "Delivered"
+ sr.insert()
+
+ gl_entries = webnotes.conn.sql("""select account, debit, credit
+ from `tabGL Entry` where voucher_type='Serial No' and voucher_no=%s
+ order by account desc""", sr.doc.name, as_dict=1)
+ self.assertFalse(gl_entries)
+
+ webnotes.defaults.set_global_default("auto_inventory_accounting", 0)
- def insert_test_data(self):
- # create default warehouse
- if not webnotes.conn.exists("Warehouse", "Default Warehouse"):
- webnotes.insert({"doctype": "Warehouse",
- "warehouse_name": "Default Warehouse",
- "warehouse_type": "Stores"})
-
- # create UOM: Nos.
- if not webnotes.conn.exists("UOM", "Nos"):
- webnotes.insert({"doctype": "UOM", "uom_name": "Nos"})
-
- # create item groups and items
- insert_test_data("Item Group",
- sort_fn=lambda ig: (ig[0].get('parent_item_group'), ig[0].get('name')))
-
- insert_test_data("Item")
\ No newline at end of file
+
+test_records = [
+ [
+ {
+ "company": "_Test Company",
+ "doctype": "Serial No",
+ "serial_no": "_Test Serial No",
+ "status": "In Store",
+ "item_code": "_Test Serialized Item",
+ "item_group": "_Test Item Group",
+ "warehouse": "_Test Warehouse",
+ "purchase_rate": 1000.0,
+ "purchase_time": "11:37:39",
+ "purchase_date": "2013-02-26",
+ 'fiscal_year': "_Test Fiscal Year 2013"
+ }
+ ]
+]
\ No newline at end of file
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index c3739ce..a176188 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -55,6 +55,7 @@
self.validate_finished_goods()
self.validate_return_reference_doc()
self.validate_with_material_request()
+ self.validate_fiscal_year()
def on_submit(self):
self.update_serial_no(1)
@@ -68,6 +69,11 @@
self.update_production_order(0)
self.make_gl_entries()
+ def validate_fiscal_year(self):
+ import accounts.utils
+ accounts.utils.validate_fiscal_year(self.doc.posting_date, self.doc.fiscal_year,
+ self.meta.get_label("posting_date"))
+
def validate_purpose(self):
valid_purposes = ["Material Issue", "Material Receipt", "Material Transfer",
"Manufacture/Repack", "Subcontract", "Sales Return", "Purchase Return"]
@@ -604,7 +610,8 @@
'is_cancelled': (is_cancelled ==1) and 'Yes' or 'No',
'batch_no': cstr(d.batch_no).strip(),
'serial_no': cstr(d.serial_no).strip(),
- "project": self.doc.project_name
+ "project": self.doc.project_name,
+ "fiscal_year": self.doc.fiscal_year,
})
def get_cust_values(self):
@@ -776,8 +783,6 @@
from accounts.utils import get_balance_on
for r in result:
- if not r.get("account"):
- print result
jv_list.append({
"__islocal": 1,
"doctype": "Journal Voucher Detail",
diff --git a/stock/doctype/stock_entry/stock_entry.txt b/stock/doctype/stock_entry/stock_entry.txt
index df5b613..91f9bb4 100644
--- a/stock/doctype/stock_entry/stock_entry.txt
+++ b/stock/doctype/stock_entry/stock_entry.txt
@@ -1,8 +1,8 @@
[
{
- "creation": "2013-03-11 12:34:40",
+ "creation": "2013-03-26 06:51:17",
"docstatus": 0,
- "modified": "2013-03-19 17:48:29",
+ "modified": "2013-03-26 07:24:53",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -543,6 +543,16 @@
"search_index": 0
},
{
+ "doctype": "DocField",
+ "fieldname": "fiscal_year",
+ "fieldtype": "Select",
+ "in_filter": 0,
+ "label": "Fiscal Year",
+ "options": "link:Fiscal Year",
+ "print_hide": 1,
+ "reqd": 1
+ },
+ {
"allow_on_submit": 0,
"doctype": "DocField",
"fieldname": "company",
@@ -610,13 +620,5 @@
{
"doctype": "DocPerm",
"role": "Manufacturing User"
- },
- {
- "doctype": "DocPerm",
- "role": "Manufacturing Manager"
- },
- {
- "doctype": "DocPerm",
- "role": "Material Manager"
}
]
\ No newline at end of file
diff --git a/stock/doctype/stock_entry/test_stock_entry.py b/stock/doctype/stock_entry/test_stock_entry.py
index 2501893..7c406f8 100644
--- a/stock/doctype/stock_entry/test_stock_entry.py
+++ b/stock/doctype/stock_entry/test_stock_entry.py
@@ -230,6 +230,7 @@
se.doc.purpose = "Sales Return"
se.doc.sales_invoice_no = si.doc.name
se.doc.posting_date = "2013-03-10"
+ se.doc.fiscal_year = "_Test Fiscal Year 2013"
se.doclist[1].item_code = "_Test Item Home Desktop 200"
se.doclist[1].qty = returned_qty
se.doclist[1].transfer_qty = returned_qty
@@ -241,6 +242,7 @@
se = webnotes.bean(copy=test_records[0])
se.doc.purpose = "Sales Return"
se.doc.posting_date = "2013-03-10"
+ se.doc.fiscal_year = "_Test Fiscal Year 2013"
se.doc.sales_invoice_no = si.doc.name
se.doclist[1].qty = returned_qty
se.doclist[1].transfer_qty = returned_qty
@@ -300,6 +302,7 @@
se.doc.purpose = "Sales Return"
se.doc.delivery_note_no = dn.doc.name
se.doc.posting_date = "2013-03-10"
+ se.doc.fiscal_year = "_Test Fiscal Year 2013"
se.doclist[1].qty = se.doclist[1].transfer_qty = returned_qty
se.insert()
@@ -399,6 +402,7 @@
se.doc.purpose = "Sales Return"
se.doc.delivery_note_no = dn.doc.name
se.doc.posting_date = "2013-03-10"
+ se.doc.fiscal_year = "_Test Fiscal Year 2013"
se.doclist[1].qty = se.doclist[1].transfer_qty = returned_qty
se.insert()
@@ -449,6 +453,7 @@
se.doc.purpose = "Purchase Return"
se.doc.purchase_receipt_no = pr.doc.name
se.doc.posting_date = "2013-03-01"
+ se.doc.fiscal_year = "_Test Fiscal Year 2013"
se.doclist[1].qty = se.doclist[1].transfer_qty = 5
se.doclist[1].s_warehouse = "_Test Warehouse"
se.insert()
@@ -471,6 +476,7 @@
se.doc.purpose = "Purchase Return"
se.doc.purchase_receipt_no = pr_docname
se.doc.posting_date = "2013-03-01"
+ se.doc.fiscal_year = "_Test Fiscal Year 2013"
se.doclist[1].qty = se.doclist[1].transfer_qty = 6
se.doclist[1].s_warehouse = "_Test Warehouse"
@@ -490,7 +496,7 @@
def test_make_return_jv_for_purchase_receipt(self):
se, pr_name = self.test_purchase_receipt_return()
self._test_purchase_return_jv(se)
-
+
se, pr_name = self._test_purchase_return_return_against_purchase_order()
self._test_purchase_return_jv(se)
@@ -547,6 +553,7 @@
se.doc.purpose = "Purchase Return"
se.doc.purchase_receipt_no = pr.doc.name
se.doc.posting_date = "2013-03-01"
+ se.doc.fiscal_year = "_Test Fiscal Year 2013"
se.doclist[1].qty = se.doclist[1].transfer_qty = 5
se.doclist[1].s_warehouse = "_Test Warehouse"
se.insert()
diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index 5ca7dd5..4262113 100644
--- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -16,17 +16,13 @@
from __future__ import unicode_literals
import webnotes
-from webnotes import _
-
+from webnotes import _, msgprint
from webnotes.utils import cint, flt, getdate
-
-sql = webnotes.conn.sql
-msgprint = webnotes.msgprint
-from accounts.utils import get_fiscal_year
+from webnotes.model.controller import DocListController
class InvalidWarehouseCompany(Exception): pass
-class DocType:
+class DocType(DocListController):
def __init__(self, doc, doclist=[]):
self.doc = doc
self.doclist = doclist
@@ -39,12 +35,14 @@
self.actual_amt_check()
self.check_stock_frozen_date()
self.scrub_posting_time()
- self.doc.fiscal_year = get_fiscal_year(self.doc.posting_date)[0]
+
+ from accounts.utils import validate_fiscal_year
+ validate_fiscal_year(self.doc.posting_date, self.doc.fiscal_year, self.meta.get_label("posting_date"))
#check for item quantity available in stock
def actual_amt_check(self):
if self.doc.batch_no:
- batch_bal = flt(sql("select sum(actual_qty) from `tabStock Ledger Entry` where warehouse = '%s' and item_code = '%s' and batch_no = '%s'"%(self.doc.warehouse,self.doc.item_code,self.doc.batch_no))[0][0])
+ batch_bal = flt(webnotes.conn.sql("select sum(actual_qty) from `tabStock Ledger Entry` where warehouse = '%s' and item_code = '%s' and batch_no = '%s'"%(self.doc.warehouse,self.doc.item_code,self.doc.batch_no))[0][0])
self.doc.fields.update({'batch_bal': batch_bal})
if (batch_bal + self.doc.actual_qty) < 0:
@@ -77,11 +75,11 @@
if self.doc.fields.get(k)==None:
msgprint("Stock Ledger Entry: '%s' is mandatory" % k, raise_exception = 1)
elif k == 'warehouse':
- if not sql("select name from tabWarehouse where name = '%s'" % self.doc.fields.get(k)):
+ if not webnotes.conn.sql("select name from tabWarehouse where name = '%s'" % self.doc.fields.get(k)):
msgprint("Warehouse: '%s' does not exist in the system. Please check." % self.doc.fields.get(k), raise_exception = 1)
def validate_item(self):
- item_det = sql("""select name, has_batch_no, docstatus,
+ item_det = webnotes.conn.sql("""select name, has_batch_no, docstatus,
ifnull(is_stock_item, 'No') from tabItem where name=%s""",
self.doc.item_code)
@@ -106,7 +104,7 @@
raise Exception
# check if batch belongs to item
- if not sql("select name from `tabBatch` where item='%s' and name ='%s' and docstatus != 2" % (self.doc.item_code, self.doc.batch_no)):
+ if not webnotes.conn.sql("select name from `tabBatch` where item='%s' and name ='%s' and docstatus != 2" % (self.doc.item_code, self.doc.batch_no)):
msgprint("'%s' is not a valid Batch Number for Item '%s'" % (self.doc.batch_no, self.doc.item_code), raise_exception = 1)
# Nobody can do SL Entries where posting date is before freezing date except authorized person
diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.js b/stock/doctype/stock_reconciliation/stock_reconciliation.js
index e66ae3b..b723061 100644
--- a/stock/doctype/stock_reconciliation/stock_reconciliation.js
+++ b/stock/doctype/stock_reconciliation/stock_reconciliation.js
@@ -101,22 +101,25 @@
show_upload: function() {
var me = this;
var $wrapper = $(cur_frm.fields_dict.upload_html.wrapper).empty();
- var upload_area = $('<div id="dit-upload-area"></div>').appendTo($wrapper);
// upload
wn.upload.make({
- parent: $('#dit-upload-area'),
+ parent: $wrapper,
args: {
method: 'stock.doctype.stock_reconciliation.stock_reconciliation.upload'
},
sample_url: "e.g. http://example.com/somefile.csv",
callback: function(r) {
- $wrapper.find(".dit-progress-area").toggle(false);
me.frm.set_value("reconciliation_json", JSON.stringify(r));
me.show_reconciliation_data();
me.frm.save();
}
});
+
+ // rename button
+ $wrapper.find('form input[type="submit"]')
+ .attr('value', 'Upload')
+
},
show_download_reconciliation_data: function() {
diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.py b/stock/doctype/stock_reconciliation/stock_reconciliation.py
index 13c8ee4..5604179 100644
--- a/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -252,7 +252,8 @@
"voucher_no": self.doc.name,
"company": self.doc.company,
"is_cancelled": "No",
- "voucher_detail_no": row.voucher_detail_no
+ "voucher_detail_no": row.voucher_detail_no,
+ "fiscal_year": self.doc.fiscal_year,
})
args.update(opts)
# create stock ledger entry
diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.txt b/stock/doctype/stock_reconciliation/stock_reconciliation.txt
index 9137cae..760620b 100644
--- a/stock/doctype/stock_reconciliation/stock_reconciliation.txt
+++ b/stock/doctype/stock_reconciliation/stock_reconciliation.txt
@@ -1,8 +1,8 @@
[
{
- "creation": "2013-01-22 16:50:41",
+ "creation": "2013-03-26 06:51:17",
"docstatus": 0,
- "modified": "2013-03-18 12:48:42",
+ "modified": "2013-03-26 08:32:03",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -30,7 +30,6 @@
"permlevel": 0
},
{
- "amend": 1,
"cancel": 1,
"create": 1,
"doctype": "DocPerm",
@@ -41,7 +40,6 @@
"permlevel": 0,
"read": 1,
"report": 1,
- "role": "Material Manager",
"submit": 1,
"write": 1
},
@@ -83,6 +81,15 @@
},
{
"doctype": "DocField",
+ "fieldname": "fiscal_year",
+ "fieldtype": "Select",
+ "label": "Fiscal Year",
+ "options": "link:Fiscal Year",
+ "print_hide": 1,
+ "reqd": 1
+ },
+ {
+ "doctype": "DocField",
"fieldname": "company",
"fieldtype": "Link",
"label": "Company",
@@ -145,6 +152,12 @@
"print_hide": 1
},
{
- "doctype": "DocPerm"
+ "amend": 0,
+ "doctype": "DocPerm",
+ "role": "Material Manager"
+ },
+ {
+ "doctype": "DocPerm",
+ "role": "System Manager"
}
]
\ No newline at end of file
diff --git a/stock/doctype/stock_reconciliation/test_stock_reconciliation.py b/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
index cebc6ff..1e7e716 100644
--- a/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
+++ b/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
@@ -228,35 +228,40 @@
"voucher_type": "Stock Entry", "voucher_no": "TEST",
"item_code": "_Test Item", "warehouse": "_Test Warehouse",
"posting_date": "2012-12-12", "posting_time": "01:00",
- "actual_qty": 20, "incoming_rate": 1000, "company": "_Test Company"
+ "actual_qty": 20, "incoming_rate": 1000, "company": "_Test Company",
+ "fiscal_year": "_Test Fiscal Year 2012",
},
{
"doctype": "Stock Ledger Entry", "__islocal": 1,
"voucher_type": "Stock Entry", "voucher_no": "TEST",
"item_code": "_Test Item", "warehouse": "_Test Warehouse",
"posting_date": "2012-12-15", "posting_time": "02:00",
- "actual_qty": 10, "incoming_rate": 700, "company": "_Test Company"
+ "actual_qty": 10, "incoming_rate": 700, "company": "_Test Company",
+ "fiscal_year": "_Test Fiscal Year 2012",
},
{
"doctype": "Stock Ledger Entry", "__islocal": 1,
"voucher_type": "Stock Entry", "voucher_no": "TEST",
"item_code": "_Test Item", "warehouse": "_Test Warehouse",
"posting_date": "2012-12-25", "posting_time": "03:00",
- "actual_qty": -15, "company": "_Test Company"
+ "actual_qty": -15, "company": "_Test Company",
+ "fiscal_year": "_Test Fiscal Year 2012",
},
{
"doctype": "Stock Ledger Entry", "__islocal": 1,
"voucher_type": "Stock Entry", "voucher_no": "TEST",
"item_code": "_Test Item", "warehouse": "_Test Warehouse",
"posting_date": "2012-12-31", "posting_time": "08:00",
- "actual_qty": -20, "company": "_Test Company"
+ "actual_qty": -20, "company": "_Test Company",
+ "fiscal_year": "_Test Fiscal Year 2012",
},
{
"doctype": "Stock Ledger Entry", "__islocal": 1,
"voucher_type": "Stock Entry", "voucher_no": "TEST",
"item_code": "_Test Item", "warehouse": "_Test Warehouse",
"posting_date": "2013-01-05", "posting_time": "07:00",
- "actual_qty": 15, "incoming_rate": 1200, "company": "_Test Company"
+ "actual_qty": 15, "incoming_rate": 1200, "company": "_Test Company",
+ "fiscal_year": "_Test Fiscal Year 2013",
},
]
diff --git a/utilities/doctype/rename_tool/__init__.py b/utilities/doctype/rename_tool/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/utilities/doctype/rename_tool/__init__.py
diff --git a/utilities/doctype/rename_tool/rename_tool.js b/utilities/doctype/rename_tool/rename_tool.js
new file mode 100644
index 0000000..9c93622
--- /dev/null
+++ b/utilities/doctype/rename_tool/rename_tool.js
@@ -0,0 +1,47 @@
+cur_frm.cscript.refresh = function(doc) {
+ wn.call({
+ method:"utilities.doctype.rename_tool.rename_tool.get_doctypes",
+ callback: function(r) {
+ cur_frm.set_df_property("select_doctype", "options", r.message);
+ cur_frm.cscript.setup_upload();
+ }
+ });
+}
+
+cur_frm.cscript.select_doctype = function() {
+ cur_frm.cscript.setup_upload();
+}
+
+cur_frm.cscript.setup_upload = function() {
+ var me = this;
+ var $wrapper = $(cur_frm.fields_dict.upload_html.wrapper).empty()
+ .html("<hr><div class='alert'>" +
+ wn._("Upload a .csv file with two columns: the old name and the new name. Max 500 rows.")
+ + "</div>");
+ var $log = $(cur_frm.fields_dict.rename_log.wrapper).empty();
+
+ // upload
+ wn.upload.make({
+ parent: $wrapper,
+ args: {
+ method: 'utilities.doctype.rename_tool.rename_tool.upload',
+ select_doctype: cur_frm.doc.select_doctype
+ },
+ sample_url: "e.g. http://example.com/somefile.csv",
+ callback: function(r) {
+ $log.empty().html("<hr>");
+ $.each(r, function(i, v) {
+ $("<div>" + v + "</div>").appendTo($log);
+ });
+ }
+ });
+
+ // rename button
+ $wrapper.find('form input[type="submit"]')
+ .click(function() {
+ $log.html("Working...");
+ })
+ .addClass("btn-info")
+ .attr('value', 'Upload and Rename')
+
+}
\ No newline at end of file
diff --git a/utilities/doctype/rename_tool/rename_tool.py b/utilities/doctype/rename_tool/rename_tool.py
new file mode 100644
index 0000000..2e368ce
--- /dev/null
+++ b/utilities/doctype/rename_tool/rename_tool.py
@@ -0,0 +1,49 @@
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import webnotes
+from webnotes import _
+
+class DocType:
+ def __init__(self, d, dl):
+ self.doc, self.doclist = d, dl
+
+@webnotes.whitelist()
+def get_doctypes():
+ return webnotes.conn.sql_list("""select name from tabDocType
+ where ifnull(allow_rename,0)=1 and module!='Core' order by name""")
+
+@webnotes.whitelist(allow_roles=["System Manager"])
+def upload(select_doctype=None, rows=None):
+ from webnotes.utils.datautils import read_csv_content_from_uploaded_file
+ from webnotes.modules import scrub
+ from webnotes.model.rename_doc import rename_doc
+
+ if not select_doctype:
+ select_doctype = webnotes.form_dict.select_doctype
+
+ if not rows:
+ rows = read_csv_content_from_uploaded_file()
+ if not rows:
+ webnotes.msgprint(_("Please select a valid csv file with data."))
+ raise Exception
+
+ if len(rows) > 500:
+ webnotes.msgprint(_("Max 500 rows only."))
+ raise Exception
+
+ rename_log = []
+ for row in rows:
+ if len(row) > 2:
+ try:
+ if rename_doc(select_doctype, row[0], row[1]):
+ rename_log.append(_("Successful: ") + row[0] + " -> " + row[1])
+ webnotes.conn.commit()
+ else:
+ rename_log.append(_("Ignored: ") + row[0] + " -> " + row[1])
+ except Exception, e:
+ rename_log.append("<span style='color: RED'>" + \
+ _("Failed: ") + row[0] + " -> " + row[1] + "</span>")
+ rename_log.append("<span style='margin-left: 20px;'>" + repr(e) + "</span>")
+
+ return rename_log
\ No newline at end of file
diff --git a/utilities/doctype/rename_tool/rename_tool.txt b/utilities/doctype/rename_tool/rename_tool.txt
new file mode 100644
index 0000000..20c2561
--- /dev/null
+++ b/utilities/doctype/rename_tool/rename_tool.txt
@@ -0,0 +1,69 @@
+[
+ {
+ "creation": "2012-12-03 10:25:59",
+ "docstatus": 0,
+ "modified": "2013-03-26 12:46:07",
+ "modified_by": "Administrator",
+ "owner": "Administrator"
+ },
+ {
+ "allow_attach": 0,
+ "allow_email": 1,
+ "allow_print": 1,
+ "doctype": "DocType",
+ "hide_heading": 0,
+ "hide_toolbar": 1,
+ "issingle": 1,
+ "max_attachments": 1,
+ "module": "Utilities",
+ "name": "__common__"
+ },
+ {
+ "doctype": "DocField",
+ "name": "__common__",
+ "parent": "Rename Tool",
+ "parentfield": "fields",
+ "parenttype": "DocType",
+ "permlevel": 0
+ },
+ {
+ "create": 1,
+ "doctype": "DocPerm",
+ "name": "__common__",
+ "parent": "Rename Tool",
+ "parentfield": "permissions",
+ "parenttype": "DocType",
+ "permlevel": 0,
+ "read": 1,
+ "report": 0,
+ "role": "System Manager",
+ "submit": 0,
+ "write": 1
+ },
+ {
+ "doctype": "DocType",
+ "name": "Rename Tool"
+ },
+ {
+ "description": "Type of document to rename.",
+ "doctype": "DocField",
+ "fieldname": "select_doctype",
+ "fieldtype": "Select",
+ "label": "Select DocType"
+ },
+ {
+ "doctype": "DocField",
+ "fieldname": "upload_html",
+ "fieldtype": "HTML",
+ "label": "Upload HTML"
+ },
+ {
+ "doctype": "DocField",
+ "fieldname": "rename_log",
+ "fieldtype": "HTML",
+ "label": "Rename Log"
+ },
+ {
+ "doctype": "DocPerm"
+ }
+]
\ No newline at end of file
diff --git a/utilities/transaction_base.py b/utilities/transaction_base.py
index 2dc8c6a..c43a456 100644
--- a/utilities/transaction_base.py
+++ b/utilities/transaction_base.py
@@ -250,4 +250,5 @@
def validate_posting_time(self):
if not self.doc.posting_time:
- self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
\ No newline at end of file
+ self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
+
\ No newline at end of file