added voucher import tool
This commit is contained in:
parent
47ee285ff9
commit
55fd5f3ed6
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,94 +0,0 @@
|
||||
// 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/>.
|
||||
|
||||
$.extend(cur_frm.cscript, {
|
||||
Generate: function(doc, dt, dn) {
|
||||
if(doc.installment_amount==''){
|
||||
msgprint('Set Installment Amount before generating schedule');
|
||||
return;
|
||||
}
|
||||
if(doc.no_of_installments==''){
|
||||
msgprint('Set Number of Installments before generating schedule');
|
||||
return;
|
||||
}
|
||||
if(doc.start_date==''){
|
||||
msgprint('Set Start Date before generating schedule');
|
||||
return;
|
||||
}
|
||||
cur_frm.cscript.clear_installments(doc);
|
||||
tot=0;i=0;
|
||||
while(tot<flt(doc.invoice_amount)-flt(doc.down_payment)){
|
||||
d = LocalDB.add_child(doc, 'Lease Installment', 'installments');
|
||||
d.amount = flt(doc.installment_amount) < flt(doc.invoice_amount)-flt(doc.down_payment)-tot ? flt(doc.installment_amount) : flt(doc.invoice_amount)-flt(doc.down_payment)-tot
|
||||
d.due_date = dateutil.add_months(doc.start_date, i+1);
|
||||
tot += flt(doc.installment_amount)
|
||||
i++;
|
||||
}
|
||||
cur_frm.refresh();
|
||||
},
|
||||
refresh: function(doc) {
|
||||
cur_frm.cscript.hide_show_buttons(doc);
|
||||
},
|
||||
hide_show_buttons: function(doc) {
|
||||
if(doc.docstatus==0) {
|
||||
hide_field('installment_reciept'); show_field('generate');
|
||||
} else if (doc.docstatus==1) {
|
||||
show_field('installment_reciept');hide_field('generate');
|
||||
}
|
||||
},
|
||||
clear_installments: function(doc) {
|
||||
$.each(getchildren('Lease Installment', doc.name, 'installments', 'Lease Agreement'),
|
||||
function(i, d) {
|
||||
LocalDB.delete_doc('Lease Installment', d.name);
|
||||
}
|
||||
)
|
||||
},
|
||||
no_of_installments: function(doc)
|
||||
{
|
||||
if(flt(doc.no_of_installments)!=0) {
|
||||
doc.installment_amount = (flt(doc.invoice_amount)- flt(doc.down_payment))/flt(doc.no_of_installments);
|
||||
refresh_field('installment_amount');
|
||||
}
|
||||
},
|
||||
'Installment Reciept': function(doc, dt, dn) {
|
||||
var d = new wn.widgets.Dialog({
|
||||
width: 500,
|
||||
title: 'Add a new payment installment',
|
||||
fields: [
|
||||
{fieldtype:'Data', label:'Cheque Number', fieldname:'cheque_number', reqd:1},
|
||||
{fieldtype:'Date', label:'Cheque Date', fieldname:'cheque_date', reqd:1},
|
||||
{fieldtype:'Link', label:'Bank Account', fieldname:'bank_account', reqd:1, options:'Account'},
|
||||
{fieldtype:'Button', label:'Update',fieldname:'update'}
|
||||
]
|
||||
})
|
||||
d.show();
|
||||
d.fields_dict.update.input.onclick = function() {
|
||||
var data = d.get_values();
|
||||
|
||||
if(data) {
|
||||
$c_obj(make_doclist(dt,dn),'lease_installment_post',data,function(){cur_frm.refresh(); d.hide();});
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
cur_frm.add_fetch('invoice','grand_total','invoice_amount');
|
||||
|
||||
cur_frm.fields_dict.invoice.get_query=function(doc){
|
||||
|
||||
return "SELECT tv.name FROM `tabSales Invoice` tv WHERE debit_to='"+doc.account+"' and tv.%(key)s like '%s' ORDER BY tv.name LIMIT 50"
|
||||
}
|
@ -1,54 +0,0 @@
|
||||
# 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/>.
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import webnotes
|
||||
from webnotes.model.doc import make_autoname, Document, addchild
|
||||
from webnotes import msgprint
|
||||
from webnotes.utils import get_defaults
|
||||
import json
|
||||
from accounts.utils import post_jv
|
||||
sql = webnotes.conn.sql
|
||||
|
||||
class DocType:
|
||||
def __init__(self, doc, doclist):
|
||||
self.doc, self.doclist = doc, doclist
|
||||
|
||||
def autoname(self):
|
||||
"""
|
||||
Create Lease Id using naming_series pattern
|
||||
"""
|
||||
self.doc.name = make_autoname(self.doc.naming_series+ '.#####')
|
||||
|
||||
def lease_installment_post(self, args):
|
||||
"""
|
||||
Posts the Installment receipt into Journal Voucher
|
||||
"""
|
||||
next_inst = sql("select amount,name from `tabLease Installment` where parent=%s and ifnull(cheque_number,'')='' order by due_date limit 1",self.doc.name)
|
||||
|
||||
data = json.loads(args)
|
||||
data['voucher_type']='Lease Receipt'
|
||||
data['naming_series']='JV'
|
||||
data['amount']=next_inst[0][0]
|
||||
data['debit_account']=data.get('bank_account')
|
||||
data['credit_account']=self.doc.account
|
||||
data['fiscal_year']=get_defaults()['fiscal_year']
|
||||
data['company']=get_defaults()['company']
|
||||
jv_name=post_jv(data)
|
||||
|
||||
sql("update `tabLease Installment` set cheque_number=%s, cheque_date=%s, jv_number=%s where name=%s",(data.get('cheque_number'),data.get('cheque_date'),jv_name,next_inst[0][1]))
|
||||
|
||||
self.doclist = [Document(d.doctype, d.name) for d in self.doclist]
|
@ -1,276 +0,0 @@
|
||||
# DocType, Lease Agreement
|
||||
[
|
||||
|
||||
# These values are common in all dictionaries
|
||||
{
|
||||
'creation': '2012-03-27 14:35:44',
|
||||
'docstatus': 0,
|
||||
'modified': '2012-03-27 14:35:44',
|
||||
'modified_by': u'Administrator',
|
||||
'owner': u'Administrator'
|
||||
},
|
||||
|
||||
# These values are common for all DocType
|
||||
{
|
||||
'_last_update': u'1311555967',
|
||||
'colour': u'White:FFF',
|
||||
'default_print_format': u'Standard',
|
||||
'doctype': 'DocType',
|
||||
'module': u'Accounts',
|
||||
'name': '__common__',
|
||||
'section_style': u'Simple',
|
||||
'show_in_menu': 0,
|
||||
'version': 24
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'name': '__common__',
|
||||
'parent': u'Lease Agreement',
|
||||
'parentfield': u'fields',
|
||||
'parenttype': u'DocType'
|
||||
},
|
||||
|
||||
# These values are common for all DocPerm
|
||||
{
|
||||
'create': 1,
|
||||
'doctype': u'DocPerm',
|
||||
'name': '__common__',
|
||||
'parent': u'Lease Agreement',
|
||||
'parentfield': u'permissions',
|
||||
'parenttype': u'DocType',
|
||||
'read': 1,
|
||||
'role': u'Accounts Manager'
|
||||
},
|
||||
|
||||
# DocType, Lease Agreement
|
||||
{
|
||||
'doctype': 'DocType',
|
||||
'name': u'Lease Agreement'
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 1,
|
||||
'cancel': 1,
|
||||
'doctype': u'DocPerm',
|
||||
'submit': 1,
|
||||
'write': 1
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'doctype': u'DocPerm',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'naming_series',
|
||||
'fieldtype': u'Select',
|
||||
'label': u'Naming Series',
|
||||
'no_copy': 1,
|
||||
'options': u'\nLA',
|
||||
'permlevel': 0,
|
||||
'reqd': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'lessee_info',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Lessee Info.',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'account',
|
||||
'fieldtype': u'Link',
|
||||
'label': u'Account',
|
||||
'options': u'Account',
|
||||
'permlevel': 0,
|
||||
'reqd': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'lessee_father',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Lessee Father',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'lessee_nic',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Lessee NIC',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'lessee_contact',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Lessee Contact',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'lessee_address',
|
||||
'fieldtype': u'Text',
|
||||
'label': u'Lessee Address',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'vehicle_info',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Vehicle Info.',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'model_no',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Model No',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'engine_no',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Engine No',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'chassis_no',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Chassis No',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'invoice_and_payment_info',
|
||||
'fieldtype': u'Section Break',
|
||||
'label': u'Invoice and Payment Info.',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'invoice',
|
||||
'fieldtype': u'Link',
|
||||
'label': u'Invoice',
|
||||
'options': u'Sales Invoice',
|
||||
'permlevel': 0,
|
||||
'reqd': 1,
|
||||
'trigger': u'Client'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'invoice_amount',
|
||||
'fieldtype': u'Currency',
|
||||
'label': u'Invoice Amount',
|
||||
'permlevel': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'down_payment',
|
||||
'fieldtype': u'Currency',
|
||||
'label': u'Down Payment',
|
||||
'permlevel': 0,
|
||||
'reqd': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'start_date',
|
||||
'fieldtype': u'Date',
|
||||
'label': u'Start Date',
|
||||
'permlevel': 0,
|
||||
'reqd': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'no_of_installments',
|
||||
'fieldtype': u'Int',
|
||||
'label': u'No of Installments',
|
||||
'permlevel': 0,
|
||||
'reqd': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'installment_amount',
|
||||
'fieldtype': u'Currency',
|
||||
'label': u'Installment Amount',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'generate',
|
||||
'fieldtype': u'Button',
|
||||
'label': u'Generate',
|
||||
'permlevel': 0,
|
||||
'trigger': u'Client'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'installments',
|
||||
'fieldtype': u'Table',
|
||||
'label': u'Installments',
|
||||
'options': u'Lease Installment',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'allow_on_submit': 1,
|
||||
'colour': u'White:FFF',
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'installment_reciept',
|
||||
'fieldtype': u'Button',
|
||||
'label': u'Installment Reciept',
|
||||
'permlevel': 0
|
||||
}
|
||||
]
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,86 +0,0 @@
|
||||
# DocType, Lease Installment
|
||||
[
|
||||
|
||||
# These values are common in all dictionaries
|
||||
{
|
||||
'creation': '2012-03-27 14:35:44',
|
||||
'docstatus': 0,
|
||||
'modified': '2012-03-27 14:35:44',
|
||||
'modified_by': u'Administrator',
|
||||
'owner': u'Administrator'
|
||||
},
|
||||
|
||||
# These values are common for all DocType
|
||||
{
|
||||
'colour': u'White:FFF',
|
||||
'doctype': 'DocType',
|
||||
'istable': 1,
|
||||
'module': u'Accounts',
|
||||
'name': '__common__',
|
||||
'section_style': u'Simple',
|
||||
'show_in_menu': 0,
|
||||
'version': 5
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'name': '__common__',
|
||||
'parent': u'Lease Installment',
|
||||
'parentfield': u'fields',
|
||||
'parenttype': u'DocType'
|
||||
},
|
||||
|
||||
# DocType, Lease Installment
|
||||
{
|
||||
'doctype': 'DocType',
|
||||
'name': u'Lease Installment'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'amount',
|
||||
'fieldtype': u'Currency',
|
||||
'label': u'Amount',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'due_date',
|
||||
'fieldtype': u'Date',
|
||||
'label': u'Due Date',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'cheque_number',
|
||||
'fieldtype': u'Data',
|
||||
'label': u'Cheque Number',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'cheque_date',
|
||||
'fieldtype': u'Date',
|
||||
'label': u'Cheque Date',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': u'DocField',
|
||||
'fieldname': u'jv_number',
|
||||
'fieldtype': u'Link',
|
||||
'hidden': 0,
|
||||
'label': u'JV Number',
|
||||
'options': u'Journal Voucher',
|
||||
'permlevel': 1
|
||||
}
|
||||
]
|
0
accounts/page/voucher_import_tool/__init__.py
Normal file
0
accounts/page/voucher_import_tool/__init__.py
Normal file
55
accounts/page/voucher_import_tool/voucher_import_tool.js
Normal file
55
accounts/page/voucher_import_tool/voucher_import_tool.js
Normal file
@ -0,0 +1,55 @@
|
||||
wn.pages['voucher-import-tool'].onload = function(wrapper) {
|
||||
wn.ui.make_app_page({
|
||||
parent: wrapper,
|
||||
title: 'Voucher Import Tool',
|
||||
single_column: true
|
||||
});
|
||||
|
||||
$(wrapper).find('.layout-main').html('\
|
||||
<p class="help">Import multiple accounting entries via CSV (spreadsheet) file:</p>\
|
||||
<h3>1. Download Template</h3><br>\
|
||||
<div style="padding-left: 30px;">\
|
||||
<button class="btn btn-small btn-download-multiple">Download</button>\
|
||||
<p class="help">Import multiple vouchers with one debit and one credit entry</p>\
|
||||
</div>\
|
||||
<hr>\
|
||||
<h3>2. Upload</h3><br>\
|
||||
<div style="padding-left: 30px;">\
|
||||
<p class="help">Upload file in CSV format with UTF-8 encoding</p>\
|
||||
<div id="voucher-upload"></div>\
|
||||
</div><br>\
|
||||
<div class="working"></div>\
|
||||
<div class="well messages" style="display: none;"></div>');
|
||||
|
||||
wn.upload.make({
|
||||
parent: $(wrapper).find("#voucher-upload"),
|
||||
args: {
|
||||
method: "accounts.page.voucher_import_tool.voucher_import_tool.upload"
|
||||
},
|
||||
callback: function(r) {
|
||||
wrapper.waiting.toggle(false);
|
||||
$(wrapper).find(".messages").toggle(true).html(
|
||||
r.join("<div style='margin:4px; border-top:1px solid #aaa;'></div>"))
|
||||
}
|
||||
});
|
||||
|
||||
wrapper.waiting = wn.messages.waiting($(wrapper).find('.working'),
|
||||
"Importing Vouchers...").toggle(false);
|
||||
|
||||
$(wrapper).find(".btn-download-single").click(function() {
|
||||
window.location.href = wn.request.url
|
||||
+ '?cmd=accounts.page.voucher_import_tool.voucher_import_tool.get_template_single';
|
||||
});
|
||||
|
||||
$(wrapper).find(".btn-download-multiple").click(function() {
|
||||
window.location.href = wn.request.url
|
||||
+ '?cmd=accounts.page.voucher_import_tool.voucher_import_tool.get_template_multiple';
|
||||
});
|
||||
|
||||
// rename button
|
||||
$(wrapper).find('#voucher-upload form input[type="submit"]')
|
||||
.click(function() {
|
||||
$(wrapper).find(".messages").toggle(false);
|
||||
wrapper.waiting.toggle(true);
|
||||
});
|
||||
}
|
185
accounts/page/voucher_import_tool/voucher_import_tool.py
Normal file
185
accounts/page/voucher_import_tool/voucher_import_tool.py
Normal file
@ -0,0 +1,185 @@
|
||||
import webnotes
|
||||
from webnotes.utils import formatdate
|
||||
|
||||
@webnotes.whitelist()
|
||||
def get_template_multiple():
|
||||
"""download single template"""
|
||||
from webnotes.model.doctype import get_field_property
|
||||
naming_options = get_field_property("Journal Voucher", "naming_series", "options")
|
||||
voucher_type = get_field_property("Journal Voucher", "voucher_type", "options")
|
||||
|
||||
webnotes.response['result'] = '''"Voucher Import :Multiple"
|
||||
"Each entry below will be a separate Journal Voucher."
|
||||
"Note:"
|
||||
"1. Dates in format: %(user_fmt)s"
|
||||
"2. Cost Center is required for Income or Expense accounts"
|
||||
"3. Naming Series Options: %(naming_options)s"
|
||||
"4. Voucher Type Options: %(voucher_type)s"
|
||||
"-------Common Values-----------"
|
||||
"Company:","%(default_company)s"
|
||||
"--------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"
|
||||
''' % {
|
||||
"user_fmt": webnotes.conn.get_value('Control Panel', None, 'date_format'),
|
||||
"default_company": webnotes.conn.get_default("company"),
|
||||
"naming_options": naming_options.replace("\n", ", "),
|
||||
"voucher_type": voucher_type.replace("\n", ", ")
|
||||
}
|
||||
webnotes.response['type'] = 'csv'
|
||||
webnotes.response['doctype'] = "Voucher-Import-Single"
|
||||
|
||||
@webnotes.whitelist()
|
||||
def upload():
|
||||
from webnotes.utils.datautils import read_csv_content_from_uploaded_file
|
||||
rows = read_csv_content_from_uploaded_file()
|
||||
|
||||
common_values = get_common_values(rows)
|
||||
data = get_data(rows)
|
||||
|
||||
if rows[0][0]=="Voucher Import :Single":
|
||||
return import_single(common_values, data)
|
||||
else:
|
||||
return import_multiple(common_values, data)
|
||||
|
||||
def map_fields(field_list, source, target):
|
||||
for f in field_list:
|
||||
if ":" in f:
|
||||
target[f.split(":")[1]] = source.get(f.split(":")[0])
|
||||
else:
|
||||
target[f] = source.get(f)
|
||||
|
||||
def import_multiple(common_values, data):
|
||||
from webnotes.model.doc import Document
|
||||
from webnotes.model.doclist import DocList
|
||||
from webnotes.model.code import get_obj
|
||||
from accounts.utils import get_fiscal_year_from_date
|
||||
from webnotes.utils.dateutils import user_to_str
|
||||
|
||||
messages = []
|
||||
|
||||
def get_account_details(account):
|
||||
acc_details = webnotes.conn.sql("""select is_pl_account,
|
||||
master_name from tabAccount where name=%s""", account, as_dict=1)
|
||||
if not acc_details:
|
||||
webnotes.msgprint("%s is not an Account" % account, raise_exception=1)
|
||||
return acc_details[0]
|
||||
|
||||
def apply_cost_center_and_against_invoice(detail, d):
|
||||
account = get_account_details(detail.account)
|
||||
|
||||
if account.is_pl_account=="Yes":
|
||||
detail.cost_center = d.cost_center
|
||||
|
||||
if account.master_name:
|
||||
map_fields(["against_sales_invoice:against_invoice",
|
||||
"against_purhase_invoice:against_voucher",
|
||||
"against_journal_voucher:against_jv"], d, detail.fields)
|
||||
|
||||
webnotes.conn.commit()
|
||||
|
||||
for i in xrange(len(data)):
|
||||
d = data[i]
|
||||
jv = webnotes.DictObj()
|
||||
webnotes.message_log = []
|
||||
try:
|
||||
d.posting_date = user_to_str(d.posting_date)
|
||||
d.due_date = user_to_str(d.due_date)
|
||||
d.ref_date = user_to_str(d.ref_date)
|
||||
d.company = common_values.company
|
||||
|
||||
jv = Document("Journal Voucher")
|
||||
map_fields(["voucher_type", "posting_date", "naming_series", "remarks:remark",
|
||||
"ref_no:cheque_no", "ref_date:cheque_date", "is_opening",
|
||||
"amount:total_debit", "amount:total_credit", "due_date", "company"], d, jv.fields)
|
||||
|
||||
jv.fiscal_year = get_fiscal_year_from_date(jv.posting_date)
|
||||
|
||||
detail1 = Document("Journal Voucher Detail")
|
||||
detail1.parent = True
|
||||
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.parent = True
|
||||
detail2.parentfield = "entries"
|
||||
map_fields(["credit_account:account","amount:credit"], d, detail2.fields)
|
||||
apply_cost_center_and_against_invoice(detail2, d)
|
||||
|
||||
webnotes.conn.begin()
|
||||
doclist = DocList([jv, detail1, detail2])
|
||||
doclist.submit()
|
||||
webnotes.conn.commit()
|
||||
|
||||
messages.append("<p style='color: green'>[row #%s] %s imported</p>" \
|
||||
% (i, jv.name))
|
||||
|
||||
except Exception, e:
|
||||
webnotes.conn.rollback()
|
||||
messages.append("<p style='color: red'>[row #%s] %s failed: %s</p>" \
|
||||
% (i, jv.name, webnotes.message_log and webnotes.message_log[0] or "No message"))
|
||||
webnotes.errprint(webnotes.getTraceback())
|
||||
|
||||
webnotes.message_log = []
|
||||
|
||||
return messages
|
||||
|
||||
def get_common_values(rows):
|
||||
start = False
|
||||
common_values = webnotes.DictObj()
|
||||
|
||||
for r in rows:
|
||||
if start:
|
||||
if r[0].startswith("---"):
|
||||
break
|
||||
common_values[r[0][:-1].replace(" ", "_").lower()] = r[1]
|
||||
if r[0]=="-------Common Values-----------":
|
||||
start = True
|
||||
|
||||
return common_values
|
||||
|
||||
def get_data(rows):
|
||||
start_row = 0
|
||||
data = []
|
||||
|
||||
for i in xrange(len(rows)):
|
||||
r = rows[i]
|
||||
if r[0]:
|
||||
if start_row and i >= start_row:
|
||||
d = webnotes.DictObj()
|
||||
for cidx in xrange(len(columns)):
|
||||
d[columns[cidx]] = r[cidx]
|
||||
data.append(d)
|
||||
|
||||
if r[0]=="--------Data----------":
|
||||
start_row = i+2
|
||||
columns = [c.replace(" ", "_").lower() for c in rows[i+1]]
|
||||
|
||||
return data
|
||||
|
||||
@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"
|
28
accounts/page/voucher_import_tool/voucher_import_tool.txt
Normal file
28
accounts/page/voucher_import_tool/voucher_import_tool.txt
Normal file
@ -0,0 +1,28 @@
|
||||
# Page, voucher-import-tool
|
||||
[
|
||||
|
||||
# These values are common in all dictionaries
|
||||
{
|
||||
u'creation': '2012-09-26 15:21:57',
|
||||
u'docstatus': 0,
|
||||
u'modified': '2012-09-26 15:21:57',
|
||||
u'modified_by': u'Administrator',
|
||||
u'owner': u'Administrator'
|
||||
},
|
||||
|
||||
# These values are common for all Page
|
||||
{
|
||||
u'doctype': u'Page',
|
||||
'module': u'Accounts',
|
||||
u'name': u'__common__',
|
||||
'page_name': u'voucher-import-tool',
|
||||
'standard': u'Yes',
|
||||
'title': u'Voucher Import Tool'
|
||||
},
|
||||
|
||||
# Page, voucher-import-tool
|
||||
{
|
||||
u'doctype': u'Page',
|
||||
u'name': u'voucher-import-tool'
|
||||
}
|
||||
]
|
@ -15,30 +15,16 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from webnotes.model.doc import make_autoname, Document, addchild
|
||||
# Posts JV
|
||||
|
||||
def post_jv(data):
|
||||
jv = Document('Journal Voucher')
|
||||
jv.voucher_type = data.get('voucher_type')
|
||||
jv.naming_series = data.get('naming_series')
|
||||
jv.voucher_date = data.get('cheque_date')
|
||||
jv.posting_date = data.get('cheque_date')
|
||||
jv.cheque_no = data.get('cheque_number')
|
||||
jv.cheque_date = data.get('cheque_date')
|
||||
jv.fiscal_year = data.get('fiscal_year') # To be modified to take care
|
||||
jv.company = data.get('company')
|
||||
import webnotes
|
||||
|
||||
jv.save(1)
|
||||
|
||||
jc = addchild(jv,'entries','Journal Voucher Detail',0)
|
||||
jc.account = data.get('debit_account')
|
||||
jc.debit = data.get('amount')
|
||||
jc.save()
|
||||
|
||||
jc = addchild(jv,'entries','Journal Voucher Detail',0)
|
||||
jc.account = data.get('credit_account')
|
||||
jc.credit = data.get('amount')
|
||||
jc.save()
|
||||
|
||||
return jv.name
|
||||
def get_fiscal_year_from_date(date):
|
||||
from webnotes.utils import formatdate
|
||||
fy = webnotes.conn.sql("""select name from `tabFiscal Year`
|
||||
where %s between year_start_date and adddate(year_start_date,
|
||||
interval 1 year)""", date)
|
||||
|
||||
if not fy:
|
||||
webnotes.msgprint("""%s not in any Fiscal Year""" % formatdate(date), raise_exception=1)
|
||||
|
||||
return fy[0][0]
|
@ -95,7 +95,7 @@ $.extend(wn.pages.users, {
|
||||
if(data.file_list) {
|
||||
data.imgsrc = 'files/' + data.file_list.split('\n')[0].split(',')[1];
|
||||
} else {
|
||||
data.imgsrc = 'images/lib/ui/no_img_' + (data.gender=='Female' ? 'f' : 'm') + '.gif';
|
||||
data.imgsrc = 'lib/images/ui/no_img_' + (data.gender=='Female' ? 'f' : 'm') + '.gif';
|
||||
}
|
||||
data.fullname = wn.user_info(data.name).fullname;
|
||||
data.delete_html = '';
|
||||
|
@ -45,7 +45,7 @@
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<img src="images/lib/ui/spinner.gif" id="spinner"/>
|
||||
<img src="lib/images/ui/spinner.gif" id="spinner"/>
|
||||
<ul class="nav pull-right">
|
||||
<li id="login-topbar-item"><a href="login.html">Login</a></li>
|
||||
</ul>
|
||||
|
Loading…
x
Reference in New Issue
Block a user