Merge branch 'master' of github.com:webnotes/erpnext
This commit is contained in:
commit
08cf32482a
@ -9,9 +9,13 @@ wn.pages['voucher-import-tool'].onload = function(wrapper) {
|
|||||||
<p class="help">Import multiple accounting entries via CSV (spreadsheet) file:</p>\
|
<p class="help">Import multiple accounting entries via CSV (spreadsheet) file:</p>\
|
||||||
<h3>1. Download Template</h3><br>\
|
<h3>1. Download Template</h3><br>\
|
||||||
<div style="padding-left: 30px;">\
|
<div style="padding-left: 30px;">\
|
||||||
<button class="btn btn-small btn-download-multiple">Download</button>\
|
<button class="btn btn-small btn-download-two-accounts">Download</button>\
|
||||||
<p class="help">Import multiple vouchers with one debit and one credit entry</p>\
|
<p class="help">Import multiple vouchers with one debit and one credit entry</p>\
|
||||||
</div>\
|
</div>\
|
||||||
|
<div style="padding-left: 30px;">\
|
||||||
|
<button class="btn btn-small btn-download-multiple-accounts">Download</button>\
|
||||||
|
<p class="help">Import multiple vouchers with multiple accounts</p>\
|
||||||
|
</div>\
|
||||||
<hr>\
|
<hr>\
|
||||||
<h3>2. Upload</h3><br>\
|
<h3>2. Upload</h3><br>\
|
||||||
<div style="padding-left: 30px;">\
|
<div style="padding-left: 30px;">\
|
||||||
@ -36,14 +40,16 @@ wn.pages['voucher-import-tool'].onload = function(wrapper) {
|
|||||||
wrapper.waiting = wn.messages.waiting($(wrapper).find('.working'),
|
wrapper.waiting = wn.messages.waiting($(wrapper).find('.working'),
|
||||||
"Importing Vouchers...").toggle(false);
|
"Importing Vouchers...").toggle(false);
|
||||||
|
|
||||||
$(wrapper).find(".btn-download-single").click(function() {
|
$(wrapper).find(".btn-download-two-accounts").click(function() {
|
||||||
window.location.href = wn.request.url
|
window.location.href = wn.request.url +
|
||||||
+ '?cmd=accounts.page.voucher_import_tool.voucher_import_tool.get_template_single';
|
'?cmd=accounts.page.voucher_import_tool.voucher_import_tool.get_template' +
|
||||||
|
'&type=Two Accounts';
|
||||||
});
|
});
|
||||||
|
|
||||||
$(wrapper).find(".btn-download-multiple").click(function() {
|
$(wrapper).find(".btn-download-multiple-accounts").click(function() {
|
||||||
window.location.href = wn.request.url
|
window.location.href = wn.request.url +
|
||||||
+ '?cmd=accounts.page.voucher_import_tool.voucher_import_tool.get_template_multiple';
|
'?cmd=accounts.page.voucher_import_tool.voucher_import_tool.get_template' +
|
||||||
|
'&type=Multiple Accounts';
|
||||||
});
|
});
|
||||||
|
|
||||||
// rename button
|
// rename button
|
||||||
|
@ -1,33 +1,47 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import webnotes
|
import webnotes
|
||||||
from webnotes.utils import formatdate
|
from webnotes.utils import formatdate, flt
|
||||||
|
|
||||||
@webnotes.whitelist()
|
@webnotes.whitelist()
|
||||||
def get_template_multiple():
|
def get_template():
|
||||||
"""download single template"""
|
"""download template"""
|
||||||
|
template_type = webnotes.form_dict.get('type')
|
||||||
from webnotes.model.doctype import get_field_property
|
from webnotes.model.doctype import get_field_property
|
||||||
naming_options = get_field_property("Journal Voucher", "naming_series", "options")
|
naming_options = get_field_property("Journal Voucher", "naming_series", "options")
|
||||||
voucher_type = get_field_property("Journal Voucher", "voucher_type", "options")
|
voucher_type = get_field_property("Journal Voucher", "voucher_type", "options")
|
||||||
|
if template_type=="Two Accounts":
|
||||||
|
extra_note = ""
|
||||||
|
columns = '''"Naming Series","Voucher Type","Posting Date","Amount","Debit Account","Credit Account","Cost Center","Against Sales Invoice","Against Purchase Invoice","Against Journal Voucher","Remarks","Due Date","Ref Number","Ref Date"'''
|
||||||
|
else:
|
||||||
|
extra_note = '''
|
||||||
|
"5. Put the account head as Data label each in a new column"
|
||||||
|
"6. Put the Debit amount as +ve and Credit amount as -ve"'''
|
||||||
|
columns = '''"Naming Series","Voucher Type","Posting Date","Cost Center","Against Sales Invoice","Against Purchase Invoice","Against Journal Voucher","Remarks","Due Date","Ref Number","Ref Date"'''
|
||||||
|
|
||||||
webnotes.response['result'] = '''"Voucher Import :Multiple"
|
|
||||||
|
webnotes.response['result'] = '''"Voucher Import: %(template_type)s"
|
||||||
"Each entry below will be a separate Journal Voucher."
|
"Each entry below will be a separate Journal Voucher."
|
||||||
"Note:"
|
"Note:"
|
||||||
"1. Dates in format: %(user_fmt)s"
|
"1. Dates in format: %(user_fmt)s"
|
||||||
"2. Cost Center is required for Income or Expense accounts"
|
"2. Cost Center is required for Income or Expense accounts"
|
||||||
"3. Naming Series Options: %(naming_options)s"
|
"3. Naming Series Options: %(naming_options)s"
|
||||||
"4. Voucher Type Options: %(voucher_type)s"
|
"4. Voucher Type Options: %(voucher_type)s"%(extra_note)s
|
||||||
"-------Common Values-----------"
|
"-------Common Values-----------"
|
||||||
"Company:","%(default_company)s"
|
"Company:","%(default_company)s"
|
||||||
"--------Data----------"
|
"--------Data----------"
|
||||||
"Naming Series","Voucher Type","Posting Date","Amount","Debit Account","Credit Account","Cost Center","Against Sales Invoice","Against Purchase Invoice","Against Journal Voucher","Remarks","Due Date","Ref Number","Ref Date"
|
%(columns)s
|
||||||
''' % {
|
''' % {
|
||||||
|
"template_type": template_type,
|
||||||
"user_fmt": webnotes.conn.get_value('Control Panel', None, 'date_format'),
|
"user_fmt": webnotes.conn.get_value('Control Panel', None, 'date_format'),
|
||||||
"default_company": webnotes.conn.get_default("company"),
|
"default_company": webnotes.conn.get_default("company"),
|
||||||
"naming_options": naming_options.replace("\n", ", "),
|
"naming_options": naming_options.replace("\n", ", "),
|
||||||
"voucher_type": voucher_type.replace("\n", ", ")
|
"voucher_type": voucher_type.replace("\n", ", "),
|
||||||
|
"extra_note": extra_note,
|
||||||
|
"columns": columns
|
||||||
}
|
}
|
||||||
webnotes.response['type'] = 'csv'
|
webnotes.response['type'] = 'csv'
|
||||||
webnotes.response['doctype'] = "Voucher-Import-Single"
|
webnotes.response['doctype'] = "Voucher-Import-%s" % template_type
|
||||||
|
|
||||||
|
|
||||||
@webnotes.whitelist()
|
@webnotes.whitelist()
|
||||||
def upload():
|
def upload():
|
||||||
@ -35,12 +49,10 @@ def upload():
|
|||||||
rows = read_csv_content_from_uploaded_file()
|
rows = read_csv_content_from_uploaded_file()
|
||||||
|
|
||||||
common_values = get_common_values(rows)
|
common_values = get_common_values(rows)
|
||||||
data, start_idx = get_data(rows)
|
company_abbr = webnotes.conn.get_value("Company", common_values.company, "abbr")
|
||||||
|
data, start_idx = get_data(rows, company_abbr)
|
||||||
|
|
||||||
if rows[0][0]=="Voucher Import :Single":
|
return import_vouchers(common_values, data, start_idx, rows[0][0])
|
||||||
return import_single(common_values, data, start_idx)
|
|
||||||
else:
|
|
||||||
return import_multiple(common_values, data, start_idx)
|
|
||||||
|
|
||||||
def map_fields(field_list, source, target):
|
def map_fields(field_list, source, target):
|
||||||
for f in field_list:
|
for f in field_list:
|
||||||
@ -49,7 +61,7 @@ def map_fields(field_list, source, target):
|
|||||||
else:
|
else:
|
||||||
target[f] = source.get(f)
|
target[f] = source.get(f)
|
||||||
|
|
||||||
def import_multiple(common_values, data, start_idx):
|
def import_vouchers(common_values, data, start_idx, import_type):
|
||||||
from webnotes.model.doc import Document
|
from webnotes.model.doc import Document
|
||||||
from webnotes.model.doclist import DocList
|
from webnotes.model.doclist import DocList
|
||||||
from webnotes.model.code import get_obj
|
from webnotes.model.code import get_obj
|
||||||
@ -78,7 +90,7 @@ def import_multiple(common_values, data, start_idx):
|
|||||||
|
|
||||||
webnotes.conn.commit()
|
webnotes.conn.commit()
|
||||||
for i in xrange(len(data)):
|
for i in xrange(len(data)):
|
||||||
d = data[i]
|
d = data[i][0]
|
||||||
jv = webnotes.DictObj()
|
jv = webnotes.DictObj()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -100,21 +112,36 @@ def import_multiple(common_values, data, start_idx):
|
|||||||
|
|
||||||
jv.fiscal_year = get_fiscal_year(jv.posting_date)[0]
|
jv.fiscal_year = get_fiscal_year(jv.posting_date)[0]
|
||||||
|
|
||||||
detail1 = Document("Journal Voucher Detail")
|
details = []
|
||||||
detail1.parent = True
|
if import_type == "Voucher Import: Two Accounts":
|
||||||
detail1.parentfield = "entries"
|
detail1 = Document("Journal Voucher Detail")
|
||||||
map_fields(["debit_account:account","amount:debit"], d, detail1.fields)
|
detail1.parent = True
|
||||||
apply_cost_center_and_against_invoice(detail1, d)
|
detail1.parentfield = "entries"
|
||||||
|
map_fields(["debit_account:account","amount:debit"], d, detail1.fields)
|
||||||
|
apply_cost_center_and_against_invoice(detail1, d)
|
||||||
|
|
||||||
|
|
||||||
detail2 = Document("Journal Voucher Detail")
|
detail2 = Document("Journal Voucher Detail")
|
||||||
detail2.parent = True
|
detail2.parent = True
|
||||||
detail2.parentfield = "entries"
|
detail2.parentfield = "entries"
|
||||||
map_fields(["credit_account:account","amount:credit"], d, detail2.fields)
|
map_fields(["credit_account:account","amount:credit"], d, detail2.fields)
|
||||||
apply_cost_center_and_against_invoice(detail2, d)
|
apply_cost_center_and_against_invoice(detail2, d)
|
||||||
|
|
||||||
|
details = [detail1, detail2]
|
||||||
|
elif import_type == "Voucher Import: Multiple Accounts":
|
||||||
|
accounts = data[i][1]
|
||||||
|
for acc in accounts:
|
||||||
|
detail = Document("Journal Voucher Detail")
|
||||||
|
detail.parent = True
|
||||||
|
detail.parentfield = "entries"
|
||||||
|
detail.account = acc
|
||||||
|
detail.debit = flt(accounts[acc]) > 0 and flt(accounts[acc]) or 0
|
||||||
|
detail.credit = flt(accounts[acc]) < 0 and -1*flt(accounts[acc]) or 0
|
||||||
|
apply_cost_center_and_against_invoice(detail, d)
|
||||||
|
details.append(detail)
|
||||||
|
|
||||||
webnotes.conn.begin()
|
webnotes.conn.begin()
|
||||||
doclist = DocList([jv, detail1, detail2])
|
doclist = DocList([jv]+details)
|
||||||
doclist.submit()
|
doclist.submit()
|
||||||
webnotes.conn.commit()
|
webnotes.conn.commit()
|
||||||
|
|
||||||
@ -147,49 +174,34 @@ def get_common_values(rows):
|
|||||||
|
|
||||||
return common_values
|
return common_values
|
||||||
|
|
||||||
def get_data(rows):
|
def get_data(rows, company_abbr):
|
||||||
start_row = 0
|
start_row = 0
|
||||||
data = []
|
data = []
|
||||||
start_row_idx = 0
|
start_row_idx = 0
|
||||||
|
|
||||||
for i in xrange(len(rows)):
|
for i in xrange(len(rows)):
|
||||||
r = rows[i]
|
r = rows[i]
|
||||||
if r[0]:
|
if r[0]:
|
||||||
if start_row and i >= start_row:
|
if start_row and i >= start_row:
|
||||||
if not start_row_idx: start_row_idx = i
|
if not start_row_idx: start_row_idx = i
|
||||||
d = webnotes.DictObj()
|
d, acc_dict = webnotes.DictObj(), webnotes.DictObj()
|
||||||
for cidx in xrange(len(columns)):
|
for cidx in xrange(len(columns)):
|
||||||
d[columns[cidx]] = r[cidx]
|
d[columns[cidx]] = r[cidx]
|
||||||
data.append(d)
|
|
||||||
|
if accounts:
|
||||||
|
total = 0
|
||||||
|
for acc_idx in xrange(len(accounts)):
|
||||||
|
col_idx = len(columns) + acc_idx
|
||||||
|
acc_dict[accounts[acc_idx]] = r[col_idx]
|
||||||
|
if flt(r[col_idx]) > 0: total += flt(r[col_idx])
|
||||||
|
d['amount'] = total
|
||||||
|
|
||||||
|
data.append([d, acc_dict])
|
||||||
|
|
||||||
|
|
||||||
if r[0]=="--------Data----------":
|
if r[0]=="--------Data----------":
|
||||||
start_row = i+2
|
start_row = i+2
|
||||||
columns = [c.replace(" ", "_").lower() for c in rows[i+1]]
|
columns = [c.replace(" ", "_").lower() for c in rows[i+1]
|
||||||
|
if not c.endswith(company_abbr)]
|
||||||
|
accounts = [c for c in rows[i+1] if c.endswith(company_abbr)]
|
||||||
|
|
||||||
return data, start_row_idx
|
return data, start_row_idx
|
||||||
|
|
||||||
@webnotes.whitelist()
|
|
||||||
def get_template_single():
|
|
||||||
"""download single template"""
|
|
||||||
|
|
||||||
webnotes.response['result'] = '''"Voucher Import :Single"
|
|
||||||
"All entries below will be uploaded in one Journal Voucher."
|
|
||||||
"Enter details below:"
|
|
||||||
"-------Common Values-----------"
|
|
||||||
"Voucher Series:",
|
|
||||||
"Voucher Type:",
|
|
||||||
"Posting Date:","%(posting_date)s"
|
|
||||||
"Remarks:",
|
|
||||||
"Is Opening:","No"
|
|
||||||
"Company:","%(default_company)s"
|
|
||||||
"------------------"
|
|
||||||
"Enter rows below headings:"
|
|
||||||
"Cost Center is required for Income or Expense accounts"
|
|
||||||
"--------Data----------"
|
|
||||||
"Account","Cost Center","Debit Amount","Credit Amount","Against Sales Invoice","Against Purchase Invoice","Against Journal Voucher"
|
|
||||||
''' % {
|
|
||||||
"posting_date": formatdate(),
|
|
||||||
"default_company": webnotes.conn.get_default("company")
|
|
||||||
}
|
|
||||||
webnotes.response['type'] = 'csv'
|
|
||||||
webnotes.response['doctype'] = "Voucher-Import-Single"
|
|
||||||
|
Loading…
Reference in New Issue
Block a user