Merge branch 'master' of github.com:webnotes/erpnext

This commit is contained in:
Rushabh Mehta 2012-10-03 11:57:13 +05:30
commit c919d2579e
11 changed files with 233 additions and 266 deletions

View File

@ -3,24 +3,24 @@
# These values are common in all dictionaries
{
'creation': '2012-04-23 11:43:56',
'docstatus': 0,
'modified': '2012-04-23 11:43:56',
'modified_by': u'Administrator',
'owner': u'Administrator'
u'creation': '2012-04-30 19:55:05',
u'docstatus': 0,
u'modified': '2012-10-03 11:08:09',
u'modified_by': u'Administrator',
u'owner': u'Administrator'
},
# These values are common for all GL Mapper
{
'doc_type': u'Purchase Invoice with write off',
'doctype': 'GL Mapper',
'name': '__common__'
u'doctype': u'GL Mapper',
u'name': u'__common__'
},
# These values are common for all GL Mapper Detail
{
'doctype': u'GL Mapper Detail',
'name': '__common__',
u'doctype': u'GL Mapper Detail',
u'name': u'__common__',
'parent': u'Purchase Invoice with write off',
'parentfield': u'fields',
'parenttype': u'GL Mapper'
@ -28,8 +28,8 @@
# GL Mapper, Purchase Invoice with write off
{
'doctype': 'GL Mapper',
'name': u'Purchase Invoice with write off'
u'doctype': u'GL Mapper',
u'name': u'Purchase Invoice with write off'
},
# GL Mapper Detail
@ -41,7 +41,7 @@
'cost_center': u'cost_center',
'credit': u'value:0',
'debit': u'amount',
'doctype': u'GL Mapper Detail',
u'doctype': u'GL Mapper Detail',
'fiscal_year': u'parent:fiscal_year',
'is_opening': u'parent:is_opening',
'posting_date': u'parent:posting_date',
@ -59,9 +59,9 @@
'aging_date': u'parent:aging_date',
'company': u'parent:company',
'cost_center': u'cost_center',
'credit': u"value:d.fields.get('category') != 'For Valuation' and d.fields.get('add_deduct_tax') == 'Deduct' and d.fields.get('tax_amount') or 0",
'debit': u"value:d.fields.get('category') != 'For Valuation' and d.fields.get('add_deduct_tax') == 'Add' and d.fields.get('tax_amount') or 0",
'doctype': u'GL Mapper Detail',
'credit': u"value:d.fields.get('category') != 'Valuation' and d.fields.get('add_deduct_tax') == 'Deduct' and d.fields.get('tax_amount') or 0",
'debit': u"value:d.fields.get('category') != 'Valuation' and d.fields.get('add_deduct_tax') == 'Add' and d.fields.get('tax_amount') or 0",
u'doctype': u'GL Mapper Detail',
'fiscal_year': u'parent:fiscal_year',
'is_opening': u'parent:is_opening',
'posting_date': u'parent:posting_date',
@ -80,7 +80,7 @@
'company': u'company',
'credit': u'ded_amount',
'debit': u'value:0',
'doctype': u'GL Mapper Detail',
u'doctype': u'GL Mapper Detail',
'fiscal_year': u'fiscal_year',
'is_opening': u'is_opening',
'posting_date': u'posting_date',
@ -100,7 +100,7 @@
'company': u'company',
'credit': u'total_amount_to_pay',
'debit': u'value:0',
'doctype': u'GL Mapper Detail',
u'doctype': u'GL Mapper Detail',
'fiscal_year': u'fiscal_year',
'is_opening': u'is_opening',
'posting_date': u'posting_date',
@ -119,7 +119,7 @@
'cost_center': u'write_off_cost_center',
'credit': u'write_off_amount',
'debit': u'value:0',
'doctype': u'GL Mapper Detail',
u'doctype': u'GL Mapper Detail',
'fiscal_year': u'fiscal_year',
'is_opening': u'is_opening',
'posting_date': u'posting_date',

View File

@ -1 +1,112 @@
[{'doc_type': 'Purchase Invoice', 'modified_by': 'nabin@webnotestech.com', 'name': 'Purchase Invoice', 'parent': None, 'creation': '2009-03-12 12:09:24', 'modified': '2010-05-26 16:48:58', 'module': 'Accounts', 'doctype': 'GL Mapper', 'idx': None, 'parenttype': None, 'owner': 'Administrator', 'docstatus': 0, 'parentfield': None}, {'creation': '2009-03-12 12:09:24', 'voucher_type': 'parent:doctype', 'doctype': 'GL Mapper Detail', 'owner': 'Administrator', 'cost_center': 'cost_center', 'voucher_no': 'parent:name', 'modified_by': 'nabin@webnotestech.com', 'against_voucher': None, 'table_field': 'entries', 'transaction_date': 'parent:voucher_date', 'debit': 'amount', 'docstatus': 0, 'parent': 'Purchase Invoice', 'company': 'parent:company', 'aging_date': 'parent:aging_date', 'fiscal_year': 'parent:fiscal_year', 'is_advance': None, 'remarks': 'parent:remarks', 'account': 'expense_head', 'name': 'GLMDetail00002', 'idx': 1, 'against_voucher_type': None, 'modified': '2010-05-26 16:48:58', 'against': 'parent:credit_to', 'credit': 'value:0', 'parenttype': 'GL Mapper', 'is_opening': 'parent:is_opening', 'posting_date': 'parent:posting_date', 'parentfield': 'fields'}, {'creation': '2009-03-12 12:09:24', 'voucher_type': 'parent:doctype', 'doctype': 'GL Mapper Detail', 'owner': 'Administrator', 'cost_center': 'cost_center', 'voucher_no': 'parent:name', 'modified_by': 'nabin@webnotestech.com', 'against_voucher': None, 'table_field': 'purchase_tax_details', 'transaction_date': 'parent:voucher_date', 'debit': "value:d.fields.get('category') != 'For Valuation' and d.fields.get('add_deduct_tax') == 'Add' and d.fields.get('tax_amount') or 0", 'docstatus': 0, 'parent': 'Purchase Invoice', 'company': 'parent:company', 'aging_date': 'parent:aging_date', 'fiscal_year': 'parent:fiscal_year', 'is_advance': None, 'remarks': 'parent:remarks', 'account': 'account_head', 'name': 'GLMDetail00003', 'idx': 2, 'against_voucher_type': None, 'modified': '2010-05-26 16:48:58', 'against': 'parent:credit_to', 'credit': "value:d.fields.get('category') != 'For Valuation' and d.fields.get('add_deduct_tax') == 'Deduct' and d.fields.get('tax_amount') or 0", 'parenttype': 'GL Mapper', 'is_opening': 'parent:is_opening', 'posting_date': 'parent:posting_date', 'parentfield': 'fields'}, {'creation': '2009-03-12 12:09:24', 'voucher_type': 'doctype', 'doctype': 'GL Mapper Detail', 'owner': 'Administrator', 'cost_center': '', 'voucher_no': 'name', 'modified_by': 'nabin@webnotestech.com', 'against_voucher': None, 'table_field': '', 'transaction_date': 'voucher_date', 'debit': 'value:0', 'docstatus': 0, 'parent': 'Purchase Invoice', 'company': 'company', 'aging_date': 'aging_date', 'fiscal_year': 'fiscal_year', 'is_advance': None, 'remarks': 'remarks', 'account': 'tax_code', 'name': 'GLMDetail00004', 'idx': 3, 'against_voucher_type': None, 'modified': '2010-05-26 16:48:58', 'against': 'credit_to', 'credit': 'ded_amount', 'parenttype': 'GL Mapper', 'is_opening': 'is_opening', 'posting_date': 'posting_date', 'parentfield': 'fields'}, {'creation': '2009-03-12 12:09:24', 'voucher_type': 'doctype', 'doctype': 'GL Mapper Detail', 'owner': 'Administrator', 'cost_center': '', 'voucher_no': 'name', 'modified_by': 'nabin@webnotestech.com', 'against_voucher': 'name', 'table_field': '', 'transaction_date': 'voucher_date', 'debit': 'value:0', 'docstatus': 0, 'parent': 'Purchase Invoice', 'company': 'company', 'aging_date': 'aging_date', 'fiscal_year': 'fiscal_year', 'is_advance': None, 'remarks': 'remarks', 'account': 'credit_to', 'name': 'GLMDetail00005', 'idx': 4, 'against_voucher_type': "value:'Purchase Invoice'", 'modified': '2010-05-26 16:48:58', 'against': 'against_expense_account', 'credit': 'total_amount_to_pay', 'parenttype': 'GL Mapper', 'is_opening': 'is_opening', 'posting_date': 'posting_date', 'parentfield': 'fields'}]
# GL Mapper, Purchase Invoice
[
# These values are common in all dictionaries
{
u'creation': '2012-04-30 19:55:04',
u'docstatus': 0,
u'modified': '2012-10-03 11:07:26',
u'modified_by': u'Administrator',
u'owner': u'Administrator'
},
# These values are common for all GL Mapper
{
'doc_type': u'Purchase Invoice',
u'doctype': u'GL Mapper',
u'name': u'__common__'
},
# These values are common for all GL Mapper Detail
{
u'doctype': u'GL Mapper Detail',
u'name': u'__common__',
'parent': u'Purchase Invoice',
'parentfield': u'fields',
'parenttype': u'GL Mapper'
},
# GL Mapper, Purchase Invoice
{
u'doctype': u'GL Mapper',
u'name': u'Purchase Invoice'
},
# GL Mapper Detail
{
'account': u'expense_head',
'against': u'parent:credit_to',
'aging_date': u'parent:aging_date',
'company': u'parent:company',
'cost_center': u'cost_center',
'credit': u'value:0',
'debit': u'amount',
u'doctype': u'GL Mapper Detail',
'fiscal_year': u'parent:fiscal_year',
'is_opening': u'parent:is_opening',
'posting_date': u'parent:posting_date',
'remarks': u'parent:remarks',
'table_field': u'entries',
'transaction_date': u'parent:voucher_date',
'voucher_no': u'parent:name',
'voucher_type': u'parent:doctype'
},
# GL Mapper Detail
{
'account': u'account_head',
'against': u'parent:credit_to',
'aging_date': u'parent:aging_date',
'company': u'parent:company',
'cost_center': u'cost_center',
'credit': u"value:d.fields.get('category') != 'Valuation' and d.fields.get('add_deduct_tax') == 'Deduct' and d.fields.get('tax_amount') or 0",
'debit': u"value:d.fields.get('category') != 'Valuation' and d.fields.get('add_deduct_tax') == 'Add' and d.fields.get('tax_amount') or 0",
u'doctype': u'GL Mapper Detail',
'fiscal_year': u'parent:fiscal_year',
'is_opening': u'parent:is_opening',
'posting_date': u'parent:posting_date',
'remarks': u'parent:remarks',
'table_field': u'purchase_tax_details',
'transaction_date': u'parent:voucher_date',
'voucher_no': u'parent:name',
'voucher_type': u'parent:doctype'
},
# GL Mapper Detail
{
'account': u'tax_code',
'against': u'credit_to',
'aging_date': u'aging_date',
'company': u'company',
'credit': u'ded_amount',
'debit': u'value:0',
u'doctype': u'GL Mapper Detail',
'fiscal_year': u'fiscal_year',
'is_opening': u'is_opening',
'posting_date': u'posting_date',
'remarks': u'remarks',
'transaction_date': u'voucher_date',
'voucher_no': u'name',
'voucher_type': u'doctype'
},
# GL Mapper Detail
{
'account': u'credit_to',
'against': u'against_expense_account',
'against_voucher': u'name',
'against_voucher_type': u"value:'Purchase Invoice'",
'aging_date': u'aging_date',
'company': u'company',
'credit': u'total_amount_to_pay',
'debit': u'value:0',
u'doctype': u'GL Mapper Detail',
'fiscal_year': u'fiscal_year',
'is_opening': u'is_opening',
'posting_date': u'posting_date',
'remarks': u'remarks',
'transaction_date': u'voucher_date',
'voucher_no': u'name',
'voucher_type': u'doctype'
}
]

View File

@ -182,7 +182,7 @@ class DocType:
if le_map['table_field']:
for d in getlist(doclist,le_map['table_field']):
# purchase_tax_details is the table of other charges in purchase cycle
if le_map['table_field'] != 'purchase_tax_details' or (le_map['table_field'] == 'purchase_tax_details' and d.fields.get('category') != 'For Valuation'):
if le_map['table_field'] != 'purchase_tax_details' or (le_map['table_field'] == 'purchase_tax_details' and d.fields.get('category') != 'Valuation'):
self.make_single_entry(doc,d,le_map,cancel, merge_entries)
else:
self.make_single_entry(None,doc,le_map,cancel, merge_entries)

View File

@ -37,7 +37,7 @@ tax_acc = [c[0] for c in sql("""select distinct account_head
from `tabPurchase Taxes and Charges`
where parenttype = 'Purchase Invoice'
and add_deduct_tax = 'Add'
and category in ('For Total', 'For Both')
and category in ('Total', 'Valuation and Total')
and docstatus=1
order by account_head asc""")]
@ -82,7 +82,7 @@ for r in res:
where parent = '%s'
and parenttype = 'Purchase Invoice'
and add_deduct_tax = 'Add'
and category in ('For Total', 'For Both')
and category in ('Total', 'Valuation and Total')
group by account_head
""" %(r[col_idx['ID']],))

View File

@ -469,16 +469,18 @@ cur_frm.cscript.calc_other_charges = function(doc , tname , fname , other_fname)
//--------------------------
$td(otc,i+1,0).innerHTML = cl[i].item_code;
var tax = getchildren('Purchase Taxes and Charges', doc.name, other_fname,doc.doctype);
var total = net_total;
for(var t=0;t<tax.length;t++){
var account = tax[t].account_head;
$td(otc,0,t+1).innerHTML = account?account:'';
//Check For Rate
if(cl[i].item_tax_rate && check_tax[account]!=null) {rate = flt(check_tax[account]);}
else // if particular item doesn't have particular rate it will take other charges rate
if(cl[i].item_tax_rate && check_tax[account]!=null) {
rate = flt(check_tax[account]);
} else {
// if particular item doesn't have particular rate it will take other charges rate
rate = flt(tax[t].rate);
}
//Check For Rate and get tax amount
var tax_amount = cur_frm.cscript.check_charge_type_and_get_tax_amount(doc,tax,t, cl[i], rate);
@ -491,18 +493,18 @@ cur_frm.cscript.calc_other_charges = function(doc , tname , fname , other_fname)
if(tax[t].add_deduct_tax == 'Add'){
// this is calculation part for all types
if(tax[t].charge_type != "Actual") tax[t].item_wise_tax_detail += item_wise_tax_detail;
tax[t].total_amount = flt(tax_amount.toFixed(2)); //stores actual tax amount in virtual field
tax[t].total_tax_amount = flt(prev_total.toFixed(2)); //stores total amount in virtual field
tax[t].tax_amount += flt(tax_amount.toFixed(2));
tax[t].total_amount = flt(tax_amount); //stores actual tax amount in virtual field
tax[t].total_tax_amount = flt(prev_total); //stores total amount in virtual field
tax[t].tax_amount += flt(tax_amount);
var total_amount = flt(tax[t].tax_amount);
total_tax_amount = flt(tax[t].total_tax_amount) + flt(total_amount);
if(tax[t].category != "For Valuation"){
set_multiple('Purchase Taxes and Charges', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':total_amount, 'total':flt(total)+flt(tax[t].tax_amount)/*_tax_amount)*/}, other_fname);
if(tax[t].category != "Valuation"){
set_multiple('Purchase Taxes and Charges', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':roundNumber(total_amount, 2), 'total':roundNumber(flt(total)+flt(tax[t].tax_amount), 2)}, other_fname);
prev_total += flt(tax[t].total_amount);
total += flt(tax[t].tax_amount); // for adding total to previous amount
}
else{
set_multiple('Purchase Taxes and Charges', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':total_amount, 'total':flt(total)/*_tax_amount)*/}, other_fname);
set_multiple('Purchase Taxes and Charges', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':roundNumber(total_amount, 2), 'total':roundNumber(flt(total), 2)}, other_fname);
prev_total = prev_total;
}
//prev_total += flt(tax[t].total_amount); // for previous row total
@ -512,25 +514,25 @@ cur_frm.cscript.calc_other_charges = function(doc , tname , fname , other_fname)
else
$td(otc,i+1,t+1).innerHTML = '('+fmt_money(rate) + '%) ' +fmt_money(tax[t].total_amount);
if (tax[t].category != "For Total"){
if (tax[t].category != "Total"){
item_tax += tax[t].total_amount;
}
}
else if(tax[t].add_deduct_tax == 'Deduct'){
// this is calculation part for all types
if(tax[t].charge_type != "Actual") tax[t].item_wise_tax_detail += item_wise_tax_detail;
tax[t].total_amount = flt(tax_amount.toFixed(2)); //stores actual tax amount in virtual field
tax[t].total_tax_amount = flt(prev_total.toFixed(2)); //stores total amount in virtual field
tax[t].tax_amount += flt(tax_amount.toFixed(2));
tax[t].total_amount = flt(tax_amount); //stores actual tax amount in virtual field
tax[t].total_tax_amount = flt(prev_total); //stores total amount in virtual field
tax[t].tax_amount += flt(tax_amount);
var total_amount = flt(tax[t].tax_amount);
total_tax_amount = flt(tax[t].total_tax_amount) - flt(total_amount);
if(tax[t].category != "For Valuation"){
set_multiple('Purchase Taxes and Charges', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'tax_amount':total_amount, 'total':flt(total)-flt(tax[t].tax_amount)/*_tax_amount)*/}, other_fname);
if(tax[t].category != "Valuation"){
set_multiple('Purchase Taxes and Charges', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'tax_amount':roundNumber(total_amount, 2), 'total':roundNumber(flt(total)-flt(tax[t].tax_amount), 2)}, other_fname);
prev_total -= flt(tax[t].total_amount);
total -= flt(tax[t].tax_amount); // for adding total to previous amount
}
else{
set_multiple('Purchase Taxes and Charges', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'tax_amount':total_amount, 'total':flt(total)/*_tax_amount)*/}, other_fname);
set_multiple('Purchase Taxes and Charges', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'tax_amount':roundNumber(total_amount, 2), 'total':roundNumber(flt(total), 2)}, other_fname);
prev_total = prev_total;
}
//prev_total += flt(tax[t].total_amount); // for previous row total
@ -540,7 +542,7 @@ cur_frm.cscript.calc_other_charges = function(doc , tname , fname , other_fname)
else
$td(otc,i+1,t+1).innerHTML = '('+fmt_money(rate) + '%) ' +fmt_money(tax[t].total_amount);
if (tax[t].category != "For Total"){
if (tax[t].category != "Total"){
item_tax -= tax[t].total_amount;
}
}
@ -549,66 +551,9 @@ cur_frm.cscript.calc_other_charges = function(doc , tname , fname , other_fname)
}
set_multiple(tname, cl[i].name, {'item_tax_amount': item_tax }, fname);
}
}
// ******* Calculation of total amounts of document (item amount + other charges)****************
cur_frm.cscript.calc_doc_values = function(doc, tname, fname, other_fname) {
doc = locals[doc.doctype][doc.name];
var net_total = 0; var total_tax = 0; var other_charges_added = 0;
var other_charges_deducted = 0;
var cl = getchildren(tname, doc.name, fname);
for(var i = 0; i<cl.length; i++){
net_total += flt(cl[i].amount);
for(var t=0;t<tax.length;t++){
tax[t].tax_amount = roundNumber(tax[t].tax_amount, 2);
}
var d = getchildren('Purchase Taxes and Charges', doc.name, other_fname,doc.doctype);
for(var j = 0; j<d.length; j++){
if(d[j].category != 'For Valuation'){
if(d[j].add_deduct_tax == 'Add'){
other_charges_added += flt(d[j].tax_amount);
total_tax += flt(d[j].tax_amount);
}
if(d[j].add_deduct_tax == 'Deduct'){
other_charges_deducted += flt(d[j].tax_amount);
total_tax -= flt(d[j].tax_amount);
}
}
}
doc.net_total = flt(net_total);
doc.total_tax = flt(total_tax);
doc.other_charges_added = flt(other_charges_added);
doc.other_charges_deducted = flt(other_charges_deducted);
doc.grand_total = flt(flt(net_total) + flt(other_charges_added) - flt(other_charges_deducted));
doc.rounded_total = Math.round(doc.grand_total);
doc.net_total_import = flt(flt(net_total) / flt(doc.conversion_rate));
doc.other_charges_added_import = flt(flt(other_charges_added) / flt(doc.conversion_rate));
doc.other_charges_deducted_import = flt(flt(other_charges_deducted) / flt(doc.conversion_rate));
doc.grand_total_import = flt(flt(doc.grand_total) / flt(doc.conversion_rate));
doc.rounded_total_import = Math.round(doc.grand_total_import);
refresh_many(['net_total','total_taxes','grand_total']);
if(doc.doctype == 'Purchase Invoice'){
calculate_outstanding(doc);
}
}
var calculate_outstanding = function(doc) {
var t_tds_tax = 0.0;
doc.total_tds_on_voucher = flt(doc.ded_amount);
// total amount to pay
doc.total_amount_to_pay = flt(flt(doc.net_total) + flt(doc.other_charges_added) - flt(doc.other_charges_deducted) - flt(doc.total_tds_on_voucher));
// outstanding amount
if(doc.docstatus==0) doc.outstanding_amount = flt(doc.net_total) + flt(doc.other_charges_added) - flt(doc.other_charges_deducted) - flt(doc.total_tds_on_voucher) - flt(doc.total_advance);
refresh_many(['total_tds_on_voucher','total_amount_to_pay', 'outstanding_amount']);
}
@ -652,6 +597,64 @@ cur_frm.cscript.check_charge_type_and_get_tax_amount = function(doc, tax, t, cl,
}
}
// ******* Calculation of total amounts of document (item amount + other charges)****************
cur_frm.cscript.calc_doc_values = function(doc, tname, fname, other_fname) {
doc = locals[doc.doctype][doc.name];
var net_total = 0; var total_tax = 0; var other_charges_added = 0;
var other_charges_deducted = 0;
var cl = getchildren(tname, doc.name, fname);
for(var i = 0; i<cl.length; i++){
net_total += flt(cl[i].amount);
}
var d = getchildren('Purchase Taxes and Charges', doc.name, other_fname,doc.doctype);
for(var j = 0; j<d.length; j++){
if(d[j].category != 'Valuation'){
if(d[j].add_deduct_tax == 'Add'){
other_charges_added += flt(d[j].tax_amount);
total_tax += flt(d[j].tax_amount);
}
if(d[j].add_deduct_tax == 'Deduct'){
other_charges_deducted += flt(d[j].tax_amount);
total_tax -= flt(d[j].tax_amount);
}
}
}
doc.net_total = flt(net_total);
doc.total_tax = flt(total_tax);
doc.other_charges_added = roundNumber(flt(other_charges_added), 2);
doc.other_charges_deducted = roundNumber(flt(other_charges_deducted), 2);
doc.grand_total = roundNumber(flt(flt(net_total) + flt(other_charges_added) - flt(other_charges_deducted)), 2);
doc.rounded_total = Math.round(doc.grand_total);
doc.net_total_import = roundNumber(flt(flt(net_total) / flt(doc.conversion_rate)), 2);
doc.other_charges_added_import = roundNumber(flt(flt(other_charges_added) / flt(doc.conversion_rate)), 2);
doc.other_charges_deducted_import = roundNumber(flt(flt(other_charges_deducted) / flt(doc.conversion_rate)), 2);
doc.grand_total_import = roundNumber(flt(flt(doc.grand_total) / flt(doc.conversion_rate)), 2);
doc.rounded_total_import = Math.round(doc.grand_total_import);
refresh_many(['net_total','total_taxes','grand_total']);
if(doc.doctype == 'Purchase Invoice'){
calculate_outstanding(doc);
}
}
var calculate_outstanding = function(doc) {
var t_tds_tax = 0.0;
doc.total_tds_on_voucher = flt(doc.ded_amount);
// total amount to pay
doc.total_amount_to_pay = flt(flt(doc.net_total) + flt(doc.other_charges_added) - flt(doc.other_charges_deducted) - flt(doc.total_tds_on_voucher));
// outstanding amount
if(doc.docstatus==0) doc.outstanding_amount = flt(doc.net_total) + flt(doc.other_charges_added) - flt(doc.other_charges_deducted) - flt(doc.total_tds_on_voucher) - flt(doc.total_advance);
refresh_many(['total_tds_on_voucher','total_amount_to_pay', 'outstanding_amount']);
}
cur_frm.cscript.toggle_contact_section = function(doc) {
cur_frm.toggle_display("contact_section", doc.supplier);
}

View File

@ -1,163 +0,0 @@
#!/usr/bin/python
from __future__ import unicode_literals
import os, commands
# ask for root mysql password
import getpass
root_pwd = None
while not root_pwd:
root_pwd = getpass.getpass("MySQL Root user's Password: ")
# test root connection
op = commands.getoutput("mysql -u root -p%s -e 'exit'" % \
root_pwd.replace('$', '\$').replace(' ', '\ '))
if "access denied" in op.lower():
raise Exception("Incorrect MySQL Root user's password")
# ask for new dbname
new_dbname = None
while not new_dbname:
new_dbname = raw_input("New ERPNext Database Name: ")
# ask for new dbpassword
new_dbpassword = None
while not new_dbpassword:
new_dbpassword = raw_input("New ERPNext Database's Password: ")
# get erpnext path
erpnext_path = os.path.dirname(os.path.abspath(__file__))
os.chdir(erpnext_path)
# setup backups
if not os.path.exists(os.path.join(erpnext_path, 'backups')):
os.makedirs('backups')
os.symlink(os.path.join(erpnext_path, 'backups'),
os.path.join(erpnext_path, 'public', 'backups'))
# setup files
if not os.path.exists(os.path.join(erpnext_path, 'files')):
os.makedirs('files')
os.symlink(os.path.join(erpnext_path, 'files'),
os.path.join(erpnext_path, 'public', 'files'))
# setup logs
if not os.path.exists(os.path.join(erpnext_path, 'logs')):
os.makedirs('logs')
os.system('touch logs/error_log.txt')
# setup lib -- framework repo with read only access
# change this if you have your own fork
if not os.path.exists(os.path.join(erpnext_path, 'lib')):
os.system('git clone https://github.com/webnotes/wnframework.git lib')
# setup symlinks in public
if not os.path.exists(os.path.join(erpnext_path, 'public', 'js', 'lib')):
os.symlink(os.path.join(erpnext_path, 'lib', 'js', 'lib'),
os.path.join(erpnext_path, 'public', 'js', 'lib'))
if not os.path.exists(os.path.join(erpnext_path, 'public', 'images', 'lib')):
os.symlink(os.path.join(erpnext_path, 'lib', 'images'),
os.path.join(erpnext_path, 'public', 'images', 'lib'))
# extract master
if os.path.exists(os.path.join(erpnext_path, 'data', 'master.sql.gz')):
os.system('gunzip data/master.sql.gz')
# setup conf
if not os.path.exists(os.path.join(erpnext_path, 'conf.py')):
# read template conf file
with open(os.path.join(erpnext_path, 'lib', 'conf', 'conf.py'), 'r') as template:
content = template.read()
# manipulate content
import re
# set new_dbname, new_dbpassword, files_path, backup_path, log_file_name
content = re.sub("db_name.*", "db_name = '%s'" % new_dbname, content)
content = re.sub("db_password.*", "db_password = '%s'" % new_dbpassword, content)
content = re.sub("files_path.*", "files_path = '%s'" % \
os.path.join(erpnext_path, 'files'), content)
content = re.sub("backup_path.*", "backup_path = '%s'" % \
os.path.join(erpnext_path, 'backups'), content)
content = re.sub("log_file_name.*", "log_file_name = '%s'" % \
os.path.join(erpnext_path, 'logs', 'error_log.txt'), content)
# write conf file
with open(os.path.join(erpnext_path, 'conf.py'), 'w') as new_conf:
new_conf.write(content)
# install db
import sys
sys.path.append('.')
sys.path.append('lib')
sys.path.append('app')
from webnotes.install_lib.install import Installer
inst = Installer('root', root_pwd)
inst.import_from_db(new_dbname, source_path=os.path.join(erpnext_path, 'data', 'master.sql'), verbose = 1)
# apply patches
os.chdir(erpnext_path)
os.system("lib/wnf.py --update origin master")
# set filemode false
os.system("git config core.filemode false")
os.chdir(os.path.join(erpnext_path, 'lib'))
os.system("git config core.filemode false")
steps_remaining = """
Notes:
------
sample apache conf file
#-----------------------------------------------------------
SetEnv PYTHON_EGG_CACHE /var/www
# you can change 99 to any other port
Listen 99
NameVirtualHost *:99
<VirtualHost *:99>
ServerName localhost
DocumentRoot {path to erpnext's folder}/public
AddHandler cgi-script .cgi .xml .py
<Directory {path to erpnext's folder}/public/>
# directory specific options
Options -Indexes +FollowSymLinks +ExecCGI
# directory's index file
DirectoryIndex web.py
# rewrite rule
RewriteEngine on
# condition 1:
# ignore login-page.html, app.html, blank.html, unsupported.html
RewriteCond %{REQUEST_URI} ^((?!app\.html|blank\.html|unsupported\.html).)*$
# condition 2: if there are no slashes
# and file is .html or does not containt a .
RewriteCond %{REQUEST_URI} ^(?!.+/)((.+\.html)|([^.]+))$
# rewrite if both of the above conditions are true
RewriteRule ^(.+)$ web.py?page=$1 [NC,L]
AllowOverride all
Order Allow,Deny
Allow from all
</Directory>
</VirtualHost>
#-----------------------------------------------------------
To Do:
* Configure apache/http conf file to point to public folder
* chown recursively all files in your folder to apache user
* login using: user="Administrator" and password="admin"
"""
print steps_remaining

View File

@ -0,0 +1,5 @@
def execute():
import webnotes
from webnotes.modules import reload_doc
reload_doc("accounts", "GL Mapper", "Purchase Invoice")
reload_doc("accounts", "GL Mapper", "Purchase Invoice with write off")

View File

@ -611,4 +611,8 @@ patch_list = [
'patch_module': 'patches.october_2012',
'patch_file': 'update_permission',
},
{
'patch_module': 'patches.october_2012',
'patch_file': 'reload_gl_mapper',
},
]

View File

@ -143,7 +143,8 @@ erpnext.startup.set_periodic_updates = function() {
}
erpnext.set_user_background = function(src) {
set_style(repl('#body_div { background: url("files/%(src)s") repeat;}', {src:src}))
set_style(repl('#body_div { background: url("files/%(src)s") repeat fixed;}',
{src:src}))
}
// subject, sender, description

View File

@ -338,8 +338,14 @@ class DocType:
def send():
from webnotes.model.code import get_obj
from webnotes.utils import getdate
now_date = now_datetime().date()
import conf
if hasattr(conf, "expires_on") and now_date > getdate(conf.expires_on):
# do not send email digests to expired accounts
return
for ed in webnotes.conn.sql("""select name from `tabEmail Digest`
where enabled=1 and docstatus<2""", as_list=1):
ed_obj = get_obj('Email Digest', ed[0])

View File

@ -99,10 +99,10 @@ class DocType:
self.prwise_cost[pr] = self.prwise_cost.get(pr, 0) + amt
cumulative_grand_total += amt
pr_oc_row = sql("select name from `tabPurchase Taxes and Charges` where parent = %s and category = 'For Valuation' and add_deduct_tax = 'Add' and charge_type = 'Actual' and account_head = %s",(pr, lc.account_head))
pr_oc_row = sql("select name from `tabPurchase Taxes and Charges` where parent = %s and category = 'Valuation' and add_deduct_tax = 'Add' and charge_type = 'Actual' and account_head = %s",(pr, lc.account_head))
if not pr_oc_row: # add if not exists
ch = addchild(pr_obj.doc, 'purchase_tax_details', 'Purchase Taxes and Charges', 1)
ch.category = 'For Valuation'
ch.category = 'Valuation'
ch.add_deduct_tax = 'Add'
ch.charge_type = 'Actual'
ch.description = lc.description
@ -201,7 +201,7 @@ class DocType:
total_amount = flt(ocd[oc].tax_amount)
total_tax_amount = flt(ocd[oc].total_tax_amount) + (add_ded * flt(total_amount))
if ocd[oc].category != "For Valuation":
if ocd[oc].category != "Valuation":
prev_total += add_ded * flt(ocd[oc].total_amount)
total += add_ded * flt(ocd[oc].tax_amount)
ocd[oc].total = total
@ -210,7 +210,7 @@ class DocType:
ocd[oc].total = flt(total)
ocd[oc].save()
if ocd[oc].category != "For Total":
if ocd[oc].category != "Total":
item_tax += add_ded * ocd[oc].total_amount
return total, prev_total, item_tax