Merge pull request #1365 from akhileshdarjee/4.0-hotfix
Stay Updated button in website fixed
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index 99d4f24..d8d3881 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -5,7 +5,7 @@
import webnotes
from webnotes.utils import flt, fmt_money, cstr, cint
-from webnotes import msgprint, _
+from webnotes import msgprint, throw, _
get_value = webnotes.conn.get_value
@@ -43,7 +43,7 @@
msgprint(_("Please enter Master Name once the account is created."))
elif not webnotes.conn.exists(self.doc.master_type or self.doc.account_type,
self.doc.master_name):
- webnotes.throw(_("Invalid Master Name"))
+ throw(_("Invalid Master Name"))
def validate_parent(self):
"""Fetch Parent Details and validation for account not to be created under ledger"""
@@ -51,14 +51,19 @@
par = webnotes.conn.sql("""select name, group_or_ledger, is_pl_account, debit_or_credit
from tabAccount where name =%s""", self.doc.parent_account)
if not par:
- msgprint("Parent account does not exists", raise_exception=1)
+ throw(_("Parent account does not exists"))
elif par[0][0] == self.doc.name:
- msgprint("You can not assign itself as parent account", raise_exception=1)
+ throw(_("You can not assign itself as parent account"))
elif par[0][1] != 'Group':
- msgprint("Parent account can not be a ledger", raise_exception=1)
+ throw(_("Parent account can not be a ledger"))
elif self.doc.debit_or_credit and par[0][3] != self.doc.debit_or_credit:
- msgprint("You can not move a %s account under %s account" %
- (self.doc.debit_or_credit, par[0][3]), raise_exception=1)
+ throw("{msg} {debit_or_credit} {under} {account} {acc}".format(**{
+ "msg": _("You cannot move a"),
+ "debit_or_credit": self.doc.debit_or_credit,
+ "under": _("account under"),
+ "account": par[0][3],
+ "acc": _("account")
+ }))
if not self.doc.is_pl_account:
self.doc.is_pl_account = par[0][2]
@@ -70,22 +75,25 @@
if webnotes.conn.sql("""select count(*) from tabAccount where
company=%s and ifnull(parent_account,'')='' and docstatus != 2""",
self.doc.company)[0][0] > 4:
- webnotes.msgprint("One company cannot have more than 4 root Accounts",
- raise_exception=1)
+ throw(_("One company cannot have more than 4 root Accounts"))
def validate_duplicate_account(self):
if self.doc.fields.get('__islocal') or not self.doc.name:
company_abbr = webnotes.conn.get_value("Company", self.doc.company, "abbr")
if webnotes.conn.sql("""select name from tabAccount where name=%s""",
(self.doc.account_name + " - " + company_abbr)):
- msgprint("Account Name: %s already exists, please rename"
- % self.doc.account_name, raise_exception=1)
+ throw("{name}: {acc_name} {exist}, {rename}".format(**{
+ "name": _("Account Name"),
+ "acc_name": self.doc.account_name,
+ "exist": _("already exists"),
+ "rename": _("please rename")
+ }))
def validate_root_details(self):
#does not exists parent
if webnotes.conn.exists("Account", self.doc.name):
if not webnotes.conn.get_value("Account", self.doc.name, "parent_account"):
- webnotes.msgprint("Root cannot be edited.", raise_exception=1)
+ throw(_("Root cannot be edited."))
def validate_frozen_accounts_modifier(self):
old_value = webnotes.conn.get_value("Account", self.doc.name, "freeze_account")
@@ -94,15 +102,18 @@
'frozen_accounts_modifier')
if not frozen_accounts_modifier or \
frozen_accounts_modifier not in webnotes.user.get_roles():
- webnotes.throw(_("You are not authorized to set Frozen value"))
+ throw(_("You are not authorized to set Frozen value"))
def convert_group_to_ledger(self):
if self.check_if_child_exists():
- msgprint("Account: %s has existing child. You can not convert this account to ledger" %
- (self.doc.name), raise_exception=1)
+ throw("{acc}: {account_name} {child}. {msg}".format(**{
+ "acc": _("Account"),
+ "account_name": self.doc.name,
+ "child": _("has existing child"),
+ "msg": _("You can not convert this account to ledger")
+ }))
elif self.check_gle_exists():
- msgprint("Account with existing transaction can not be converted to ledger.",
- raise_exception=1)
+ throw(_("Account with existing transaction can not be converted to ledger."))
else:
self.doc.group_or_ledger = 'Ledger'
self.doc.save()
@@ -110,11 +121,9 @@
def convert_ledger_to_group(self):
if self.check_gle_exists():
- msgprint("Account with existing transaction can not be converted to group.",
- raise_exception=1)
+ throw(_("Account with existing transaction can not be converted to group."))
elif self.doc.master_type or self.doc.account_type:
- msgprint("Cannot covert to Group because Master Type or Account Type is selected.",
- raise_exception=1)
+ throw(_("Cannot covert to Group because Master Type or Account Type is selected."))
else:
self.doc.group_or_ledger = 'Group'
self.doc.save()
@@ -130,9 +139,9 @@
def validate_mandatory(self):
if not self.doc.debit_or_credit:
- msgprint("Debit or Credit field is mandatory", raise_exception=1)
+ throw(_("Debit or Credit field is mandatory"))
if not self.doc.is_pl_account:
- msgprint("Is PL Account field is mandatory", raise_exception=1)
+ throw(_("Is PL Account field is mandatory"))
def validate_warehouse_account(self):
if not cint(webnotes.defaults.get_global_default("auto_accounting_for_stock")):
@@ -146,11 +155,11 @@
if self.doc.master_name:
self.validate_warehouse(self.doc.master_name)
else:
- webnotes.throw(_("Master Name is mandatory if account type is Warehouse"))
+ throw(_("Master Name is mandatory if account type is Warehouse"))
def validate_warehouse(self, warehouse):
if webnotes.conn.get_value("Stock Ledger Entry", {"warehouse": warehouse}):
- webnotes.throw(_("Stock transactions exist against warehouse ") + warehouse +
+ throw(_("Stock transactions exist against warehouse ") + warehouse +
_(" .You can not assign / modify / remove Master Name"))
def update_nsm_model(self):
@@ -183,22 +192,21 @@
# If outstanding greater than credit limit and not authorized person raise exception
if credit_limit > 0 and flt(total_outstanding) > credit_limit \
and not self.get_authorized_user():
- msgprint("""Total Outstanding amount (%s) for <b>%s</b> can not be \
+ throw("""Total Outstanding amount (%s) for <b>%s</b> can not be \
greater than credit limit (%s). To change your credit limit settings, \
please update in the <b>%s</b> master""" % (fmt_money(total_outstanding),
- self.doc.name, fmt_money(credit_limit), credit_limit_from), raise_exception=1)
+ self.doc.name, fmt_money(credit_limit), credit_limit_from))
def validate_trash(self):
"""checks gl entries and if child exists"""
if not self.doc.parent_account:
- msgprint("Root account can not be deleted", raise_exception=1)
+ throw(_("Root account can not be deleted"))
if self.check_gle_exists():
- msgprint("""Account with existing transaction (Sales Invoice / Purchase Invoice / \
- Journal Voucher) can not be deleted""", raise_exception=1)
+ throw("""Account with existing transaction (Sales Invoice / Purchase Invoice / \
+ Journal Voucher) can not be deleted""")
if self.check_if_child_exists():
- msgprint("Child account exists for this account. You can not delete this account.",
- raise_exception=1)
+ throw(_("Child account exists for this account. You can not delete this account."))
def on_trash(self):
self.validate_trash()
@@ -212,13 +220,13 @@
# Validate properties before merging
if merge:
if not webnotes.conn.exists("Account", new):
- webnotes.throw(_("Account ") + new +_(" does not exists"))
+ throw(_("Account ") + new +_(" does not exists"))
val = list(webnotes.conn.get_value("Account", new_account,
["group_or_ledger", "debit_or_credit", "is_pl_account"]))
if val != [self.doc.group_or_ledger, self.doc.debit_or_credit, self.doc.is_pl_account]:
- webnotes.throw(_("""Merging is only possible if following \
+ throw(_("""Merging is only possible if following \
properties are same in both records.
Group or Ledger, Debit or Credit, Is PL Account"""))
diff --git a/erpnext/accounts/doctype/cost_center/cost_center.js b/erpnext/accounts/doctype/cost_center/cost_center.js
index fbab418..a18efaa 100644
--- a/erpnext/accounts/doctype/cost_center/cost_center.js
+++ b/erpnext/accounts/doctype/cost_center/cost_center.js
@@ -54,9 +54,9 @@
function() { wn.set_route("Accounts Browser", "Cost Center"); }, 'icon-sitemap')
}
-cur_frm.cscript.parent_cost_center = function(doc,cdt,cdn){
+cur_frm.cscript.parent_cost_center = function(doc, cdt, cdn) {
if(!doc.company){
- alert(wn._('Please enter company name first'));
+ msgprint(wn._('Please enter company name first'));
}
}
diff --git a/erpnext/accounts/doctype/pos_setting/pos_setting.txt b/erpnext/accounts/doctype/pos_setting/pos_setting.txt
index 1c9e0bf..c00e75e 100755
--- a/erpnext/accounts/doctype/pos_setting/pos_setting.txt
+++ b/erpnext/accounts/doctype/pos_setting/pos_setting.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-24 12:15:51",
"docstatus": 0,
- "modified": "2014-01-15 16:23:58",
+ "modified": "2014-01-29 13:08:24",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -22,6 +22,8 @@
"permlevel": 0
},
{
+ "cancel": 0,
+ "delete": 0,
"doctype": "DocPerm",
"email": 1,
"name": "__common__",
@@ -191,9 +193,9 @@
},
{
"doctype": "DocField",
- "fieldname": "charge",
+ "fieldname": "taxes_and_charges",
"fieldtype": "Link",
- "label": "Charge",
+ "label": "Taxes and Charges",
"oldfieldname": "charge",
"oldfieldtype": "Link",
"options": "Sales Taxes and Charges Master",
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
index dda6219..bc99228 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -3,7 +3,7 @@
cur_frm.cscript.tname = "Purchase Invoice Item";
cur_frm.cscript.fname = "entries";
-cur_frm.cscript.other_fname = "purchase_tax_details";
+cur_frm.cscript.other_fname = "other_charges";
wn.provide("erpnext.accounts");
{% include 'buying/doctype/purchase_common/purchase_common.js' %};
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index db42a12..6a6254a 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -32,6 +32,9 @@
}]
def validate(self):
+ if not self.doc.is_opening:
+ self.doc.is_opening = 'No'
+
super(DocType, self).validate()
self.po_required()
@@ -45,15 +48,8 @@
self.check_for_stopped_status()
self.validate_with_previous_doc()
self.validate_uom_is_integer("uom", "qty")
-
- if not self.doc.is_opening:
- self.doc.is_opening = 'No'
-
self.set_aging_date()
-
- #set against account for credit to
self.set_against_expense_account()
-
self.validate_write_off_account()
self.update_raw_material_cost()
self.update_valuation_rate("entries")
@@ -215,7 +211,8 @@
against_accounts = []
stock_items = self.get_stock_items()
for item in self.doclist.get({"parentfield": "entries"}):
- if auto_accounting_for_stock and item.item_code in stock_items:
+ if auto_accounting_for_stock and item.item_code in stock_items \
+ and self.doc.is_opening == 'No':
# in case of auto inventory accounting, against expense account is always
# Stock Received But Not Billed for a stock item
item.expense_head = stock_not_billed_account
@@ -325,7 +322,7 @@
# tax table gl entries
valuation_tax = {}
- for tax in self.doclist.get({"parentfield": "purchase_tax_details"}):
+ for tax in self.doclist.get({"parentfield": "other_charges"}):
if tax.category in ("Total", "Valuation and Total") and flt(tax.tax_amount):
gl_entries.append(
self.get_gl_dict({
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.txt b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.txt
index 5dbe9f6..d0eb1b3 100755
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.txt
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-21 16:16:39",
"docstatus": 0,
- "modified": "2014-01-20 17:49:04",
+ "modified": "2014-01-29 15:26:54",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -324,16 +324,16 @@
"doctype": "DocField",
"fieldname": "taxes",
"fieldtype": "Section Break",
- "label": "Taxes",
+ "label": "Taxes and Charges",
"oldfieldtype": "Section Break",
"options": "icon-money",
"read_only": 0
},
{
"doctype": "DocField",
- "fieldname": "purchase_other_charges",
+ "fieldname": "taxes_and_charges",
"fieldtype": "Link",
- "label": "Tax Master",
+ "label": "Taxes and Charges",
"oldfieldname": "purchase_other_charges",
"oldfieldtype": "Link",
"options": "Purchase Taxes and Charges Master",
@@ -342,7 +342,7 @@
},
{
"doctype": "DocField",
- "fieldname": "purchase_tax_details",
+ "fieldname": "other_charges",
"fieldtype": "Table",
"label": "Purchase Taxes and Charges",
"oldfieldname": "purchase_tax_details",
@@ -352,9 +352,9 @@
},
{
"doctype": "DocField",
- "fieldname": "tax_calculation",
+ "fieldname": "other_charges_calculation",
"fieldtype": "HTML",
- "label": "Tax Calculation",
+ "label": "Taxes and Charges Calculation",
"oldfieldtype": "HTML",
"print_hide": 1,
"read_only": 0
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index 8a8b4a7..e276219 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -130,7 +130,7 @@
["_Test Account Discount - _TC", 168.03, 1512.30],
]
- for i, tax in enumerate(wrapper.doclist.get({"parentfield": "purchase_tax_details"})):
+ for i, tax in enumerate(wrapper.doclist.get({"parentfield": "other_charges"})):
self.assertEqual(tax.account_head, expected_values[i][0])
self.assertEqual(tax.tax_amount, expected_values[i][1])
self.assertEqual(tax.total, expected_values[i][2])
@@ -165,7 +165,7 @@
["_Test Account Discount - _TC", 168.03, 1512.30],
]
- for i, tax in enumerate(wrapper.doclist.get({"parentfield": "purchase_tax_details"})):
+ for i, tax in enumerate(wrapper.doclist.get({"parentfield": "other_charges"})):
self.assertEqual(tax.account_head, expected_values[i][0])
self.assertEqual(tax.tax_amount, expected_values[i][1])
self.assertEqual(tax.total, expected_values[i][2])
@@ -258,7 +258,7 @@
# taxes
{
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"charge_type": "Actual",
"account_head": "_Test Account Shipping Charges - _TC",
"cost_center": "_Test Cost Center - _TC",
@@ -269,7 +269,7 @@
},
{
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"charge_type": "On Net Total",
"account_head": "_Test Account Customs Duty - _TC",
"cost_center": "_Test Cost Center - _TC",
@@ -280,7 +280,7 @@
},
{
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"charge_type": "On Net Total",
"account_head": "_Test Account Excise Duty - _TC",
"cost_center": "_Test Cost Center - _TC",
@@ -291,7 +291,7 @@
},
{
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"charge_type": "On Previous Row Amount",
"account_head": "_Test Account Education Cess - _TC",
"cost_center": "_Test Cost Center - _TC",
@@ -303,7 +303,7 @@
},
{
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"charge_type": "On Previous Row Amount",
"account_head": "_Test Account S&H Education Cess - _TC",
"cost_center": "_Test Cost Center - _TC",
@@ -315,7 +315,7 @@
},
{
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"charge_type": "On Previous Row Total",
"account_head": "_Test Account CST - _TC",
"cost_center": "_Test Cost Center - _TC",
@@ -327,7 +327,7 @@
},
{
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"charge_type": "On Net Total",
"account_head": "_Test Account VAT - _TC",
"cost_center": "_Test Cost Center - _TC",
@@ -338,7 +338,7 @@
},
{
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"charge_type": "On Previous Row Total",
"account_head": "_Test Account Discount - _TC",
"cost_center": "_Test Cost Center - _TC",
@@ -380,7 +380,7 @@
# taxes
{
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"charge_type": "Actual",
"account_head": "_Test Account Shipping Charges - _TC",
"cost_center": "_Test Cost Center - _TC",
@@ -391,7 +391,7 @@
},
{
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"charge_type": "Actual",
"account_head": "_Test Account VAT - _TC",
"cost_center": "_Test Cost Center - _TC",
@@ -402,7 +402,7 @@
},
{
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"charge_type": "Actual",
"account_head": "_Test Account Customs Duty - _TC",
"cost_center": "_Test Cost Center - _TC",
diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js b/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js
index b589651..933382e 100644
--- a/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js
+++ b/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js
@@ -1,17 +1,10 @@
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
-//
-
-//--------- ONLOAD -------------
{% include "public/js/controllers/accounts.js" %}
-cur_frm.cscript.onload = function(doc, cdt, cdn) {
-
-}
-
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
- cur_frm.set_footnote(wn.markdown(cur_frm.meta.description));
+ cur_frm.set_footnote(wn.markdown(cur_frm.meta.description));
}
// For customizing print
@@ -27,120 +20,123 @@
return '';
}
-cur_frm.pformat.purchase_tax_details= function(doc){
-
- //function to make row of table
- var make_row = function(title,val,bold){
- var bstart = '<b>'; var bend = '</b>';
- return '<tr><td style="width:50%;">'+(bold?bstart:'')+title+(bold?bend:'')+'</td>'
- +'<td style="width:25%;text-align:right;"></td>'
- +'<td style="width:25%;text-align:right;">'+format_currency(val, doc.currency)+'</td>'
- +'</tr>'
- }
+cur_frm.pformat.other_charges= function(doc) {
- function convert_rate(val){
- var new_val = flt(val)/flt(doc.conversion_rate);
- return new_val;
- }
-
- function print_hide(fieldname) {
- var doc_field = wn.meta.get_docfield(doc.doctype, fieldname, doc.name);
- return doc_field.print_hide;
- }
-
- var cl = getchildren('Purchase Taxes and Charges',doc.name,'purchase_tax_details');
-
- // outer table
- var out='<div><table class="noborder" style="width:100%">\
- <tr><td style="width: 60%"></td><td>';
-
- // main table
- out +='<table class="noborder" style="width:100%">';
- if(!print_hide('net_total_import')) {
- out += make_row('Net Total', doc.net_total_import, 1);
- }
-
- // add rows
- if(cl.length){
- for(var i=0;i<cl.length;i++){
- out += make_row(cl[i].description,convert_rate(cl[i].tax_amount),0);
- }
- }
- // grand total
- if(!print_hide('grand_total_import')) {
- out += make_row('Grand Total', doc.grand_total_import, 1);
+ //function to make row of table
+ var make_row = function(title, val, bold) {
+ var bstart = '<b>'; var bend = '</b>';
+ return '<tr><td style="width:50%;">' + (bold?bstart:'') + title + (bold?bend:'') + '</td>'
+ + '<td style="width:25%;text-align:right;"></td>'
+ + '<td style="width:25%;text-align:right;">' + format_currency(val, doc.currency) + '</td>'
+ + '</tr>';
}
- if(doc.in_words_import && !print_hide('in_words_import')){
- out +='</table></td></tr>';
- out += '<tr><td colspan = "2">';
- out += '<table><tr><td style="width:25%;"><b>In Words</b></td>';
- out+= '<td style="width:50%;">'+doc.in_words_import+'</td></tr>';
- }
- out +='</table></td></tr></table></div>';
- return out;
+
+ function convert_rate(val) {
+ var new_val = flt(val)/flt(doc.conversion_rate);
+ return new_val;
+ }
+
+ function print_hide(fieldname) {
+ var doc_field = wn.meta.get_docfield(doc.doctype, fieldname, doc.name);
+ return doc_field.print_hide;
+ }
+
+ var cl = getchildren('Purchase Taxes and Charges', doc.name, 'other_charges');
+
+ // outer table
+ var out='<div><table class="noborder" style="width:100%">\
+ <tr><td style="width: 60%"></td><td>';
+
+ // main table
+ out +='<table class="noborder" style="width:100%">';
+ if(!print_hide('net_total_import'))
+ out += make_row('Net Total', doc.net_total_import, 1);
+
+ // add rows
+ if(cl.length){
+ for(var i=0; i<cl.length; i++) {
+ out += make_row(cl[i].description, convert_rate(cl[i].tax_amount), 0);
+ }
+ }
+
+ // grand total
+ if(!print_hide('grand_total_import'))
+ out += make_row('Grand Total', doc.grand_total_import, 1);
+
+ if(doc.in_words_import && !print_hide('in_words_import')) {
+ out += '</table></td></tr>';
+ out += '<tr><td colspan = "2">';
+ out += '<table><tr><td style="width:25%;"><b>In Words</b></td>';
+ out += '<td style="width:50%;">' + doc.in_words_import + '</td></tr>';
+ }
+
+ out +='</table></td></tr></table></div>';
+ return out;
}
cur_frm.cscript.add_deduct_tax = function(doc, cdt, cdn) {
- var d = locals[cdt][cdn];
- if(!d.category && d.add_deduct_tax){
- alert(wn._("Please select Category first"));
- d.add_deduct_tax = '';
- }
- else if(d.category != 'Total' && d.add_deduct_tax == 'Deduct') {
- console.log([d.category, d.add_deduct_tax]);
- msgprint(wn._("You cannot deduct when category is for 'Valuation' or 'Valuation and Total'"));
- d.add_deduct_tax = '';
- }
+ var d = locals[cdt][cdn];
+ if(!d.category && d.add_deduct_tax) {
+ msgprint(wn._("Please select Category first"));
+ d.add_deduct_tax = '';
+ }
+ else if(d.category != 'Total' && d.add_deduct_tax == 'Deduct') {
+ msgprint(wn._("You cannot deduct when category is for 'Valuation' or 'Valuation and Total'"));
+ d.add_deduct_tax = '';
+ }
}
cur_frm.cscript.charge_type = function(doc, cdt, cdn) {
- var d = locals[cdt][cdn];
- if(!d.category && d.charge_type){
- alert(wn._("Please select Category first"));
- d.charge_type = '';
- }
- else if(d.idx == 1 && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')){
- alert(wn._("You cannot select Charge Type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"));
- d.charge_type = '';
- }
- else if((d.category == 'Valuation' || d.category == 'Valuation and Total') && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')){
- alert(wn._("You cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for valuation. You can select only 'Total' option for previous row amount or previous row total"))
- d.charge_type = '';
- }
- validated = false;
- refresh_field('charge_type',d.name,'purchase_tax_details');
+ var d = locals[cdt][cdn];
- cur_frm.cscript.row_id(doc, cdt, cdn);
- cur_frm.cscript.rate(doc, cdt, cdn);
- cur_frm.cscript.tax_amount(doc, cdt, cdn);
+ if(!d.category && d.charge_type) {
+ msgprint(wn._("Please select Category first"));
+ d.charge_type = '';
+ }
+ else if(d.idx == 1 && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')) {
+ msgprint(wn._("You cannot select Charge Type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"));
+ d.charge_type = '';
+ }
+ else if((d.category == 'Valuation' || d.category == 'Valuation and Total') && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')) {
+ msgprint(wn._("You cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for valuation. You can select only 'Total' option for previous row amount or previous row total"));
+ d.charge_type = '';
+ }
+
+ validated = false;
+ refresh_field('charge_type', d.name, 'other_charges');
+
+ cur_frm.cscript.row_id(doc, cdt, cdn);
+ cur_frm.cscript.rate(doc, cdt, cdn);
+ cur_frm.cscript.tax_amount(doc, cdt, cdn);
}
cur_frm.cscript.row_id = function(doc, cdt, cdn) {
- var d = locals[cdt][cdn];
- if(!d.charge_type && d.row_id){
- alert(wn._("Please select Charge Type first"));
- d.row_id = '';
- }
- else if((d.charge_type == 'Actual' || d.charge_type == 'On Net Total') && d.row_id) {
- alert(wn._("You can Enter Row only if your Charge Type is 'On Previous Row Amount' or ' Previous Row Total'"));
- d.row_id = '';
- }
- else if((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id){
- if(d.row_id >= d.idx){
- alert(wn._("You cannot Enter Row no. greater than or equal to current row no. for this Charge type"));
- d.row_id = '';
- }
- }
- validated = false;
- refresh_field('row_id',d.name,'purchase_tax_details');
+ var d = locals[cdt][cdn];
+
+ if(!d.charge_type && d.row_id) {
+ msgprint(wn._("Please select Charge Type first"));
+ d.row_id = '';
+ }
+ else if((d.charge_type == 'Actual' || d.charge_type == 'On Net Total') && d.row_id) {
+ msgprint(wn._("You can Enter Row only if your Charge Type is 'On Previous Row Amount' or ' Previous Row Total'"));
+ d.row_id = '';
+ }
+ else if((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id) {
+ if(d.row_id >= d.idx){
+ msgprint(wn._("You cannot Enter Row no. greater than or equal to current row no. for this Charge type"));
+ d.row_id = '';
+ }
+ }
+ validated = false;
+ refresh_field('row_id', d.name, 'other_charges');
}
-cur_frm.set_query("account_head", "purchase_tax_details", function(doc) {
+cur_frm.set_query("account_head", "other_charges", function(doc) {
return {
query: "erpnext.controllers.queries.tax_account_query",
- filters: {
+ filters: {
"account_type": ["Tax", "Chargeable", "Expense Account"],
"debit_or_credit": "Debit",
"company": doc.company
@@ -148,35 +144,38 @@
}
});
-cur_frm.fields_dict['purchase_tax_details'].grid.get_field("cost_center").get_query = function(doc) {
- return {
- filters: {
- 'company': doc.company,
- 'group_or_ledger': "Ledger"
- }
- }
+cur_frm.fields_dict['other_charges'].grid.get_field("cost_center").get_query = function(doc) {
+ return {
+ filters: {
+ 'company': doc.company,
+ 'group_or_ledger': "Ledger"
+ }
+ }
}
cur_frm.cscript.rate = function(doc, cdt, cdn) {
- var d = locals[cdt][cdn];
- if(!d.charge_type && d.rate) {
- alert(wn._("Please select Charge Type first"));
- d.rate = '';
- }
- validated = false;
- refresh_field('rate',d.name,'purchase_tax_details');
+ var d = locals[cdt][cdn];
+
+ if(!d.charge_type && d.rate) {
+ msgprint(wn._("Please select Charge Type first"));
+ d.rate = '';
+ }
+ validated = false;
+ refresh_field('rate', d.name, 'other_charges');
}
cur_frm.cscript.tax_amount = function(doc, cdt, cdn) {
- var d = locals[cdt][cdn];
- if(!d.charge_type && d.tax_amount){
- alert(wn._("Please select Charge Type first"));
- d.tax_amount = '';
- }
- else if(d.charge_type && d.tax_amount) {
- alert(wn._("You cannot directly enter Amount and if your Charge Type is Actual enter your amount in Rate"));
- d.tax_amount = '';
- }
- validated = false;
- refresh_field('tax_amount',d.name,'purchase_tax_details');
-}
+ var d = locals[cdt][cdn];
+
+ if(!d.charge_type && d.tax_amount) {
+ msgprint(wn._("Please select Charge Type first"));
+ d.tax_amount = '';
+ }
+ else if(d.charge_type && d.tax_amount) {
+ msgprint(wn._("You cannot directly enter Amount and if your Charge Type is Actual enter your amount in Rate"));
+ d.tax_amount = '';
+ }
+
+ validated = false;
+ refresh_field('tax_amount', d.name, 'other_charges');
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.txt b/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.txt
index bdaf00c..346dd0e 100644
--- a/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.txt
+++ b/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.txt
@@ -2,12 +2,13 @@
{
"creation": "2013-01-10 16:34:08",
"docstatus": 0,
- "modified": "2014-01-20 17:49:14",
+ "modified": "2014-01-29 12:26:38",
"modified_by": "Administrator",
"owner": "wasim@webnotestech.com"
},
{
"allow_import": 1,
+ "allow_rename": 1,
"autoname": "field:title",
"description": "Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like \"Shipping\", \"Insurance\", \"Handling\" etc.\n\n#### Note\n\nThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.\n\n#### Description of Columns\n\n1. Calculation Type: \n - This can be on **Net Total** (that is the sum of basic amount).\n - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.\n - **Actual** (as mentioned).\n2. Account Head: The Account ledger under which this tax will be booked\n3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.\n4. Description: Description of the tax (that will be printed in invoices / quotes).\n5. Rate: Tax rate.\n6. Amount: Tax amount.\n7. Total: Cumulative total to this point.\n8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).\n9. Consider Tax or Charge for: In this section you can specify if the tax / charge is only for valuation (not a part of total) or only for total (does not add value to the item) or for both.\n10. Add or Deduct: Whether you want to add or deduct the tax.",
"doctype": "DocType",
@@ -70,7 +71,7 @@
},
{
"doctype": "DocField",
- "fieldname": "purchase_tax_details",
+ "fieldname": "other_charges",
"fieldtype": "Table",
"label": "Purchase Taxes and Charges",
"oldfieldname": "purchase_tax_details",
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 1292507..cfa1aa7 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -194,7 +194,7 @@
self.doc.customer = pos.customer
self.set_customer_defaults()
- for fieldname in ('territory', 'naming_series', 'currency', 'charge', 'letter_head', 'tc_name',
+ for fieldname in ('territory', 'naming_series', 'currency', 'taxes_and_charges', 'letter_head', 'tc_name',
'selling_price_list', 'company', 'select_print_heading', 'cash_bank_account'):
if (not for_validate) or (for_validate and not self.doc.fields.get(fieldname)):
self.doc.fields[fieldname] = pos.get(fieldname)
@@ -214,8 +214,8 @@
self.doc.terms = webnotes.conn.get_value("Terms and Conditions", self.doc.tc_name, "terms")
# fetch charges
- if self.doc.charge and not len(self.doclist.get({"parentfield": "other_charges"})):
- self.set_taxes("other_charges", "charge")
+ if self.doc.taxes_and_charges and not len(self.doclist.get({"parentfield": "other_charges"})):
+ self.set_taxes("other_charges", "taxes_and_charges")
def get_customer_account(self):
"""Get Account Head to which amount needs to be Debited based on Customer"""
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt b/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
index a3be27d..49cc213 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-24 19:29:05",
"docstatus": 0,
- "modified": "2014-01-20 17:49:20",
+ "modified": "2014-01-28 18:43:10",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -376,9 +376,9 @@
},
{
"doctype": "DocField",
- "fieldname": "charge",
+ "fieldname": "taxes_and_charges",
"fieldtype": "Link",
- "label": "Tax Master",
+ "label": "Taxes and Charges",
"oldfieldname": "charge",
"oldfieldtype": "Link",
"options": "Sales Taxes and Charges Master",
@@ -1231,6 +1231,7 @@
"write": 1
},
{
+ "cancel": 0,
"delete": 0,
"doctype": "DocPerm",
"role": "Customer"
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
index 3092477..939b397 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -756,7 +756,8 @@
def _test_recurring_invoice(self, base_si, first_and_last_day):
from webnotes.utils import add_months, get_last_day
- from erpnext.accounts.doctype.sales_invoice.sales_invoice import manage_recurring_invoices
+ from accounts.doctype.sales_invoice.sales_invoice \
+ import manage_recurring_invoices, get_next_date
no_of_months = ({"Monthly": 1, "Quarterly": 3, "Yearly": 12})[base_si.doc.recurring_type]
@@ -764,7 +765,8 @@
self.assertEquals(i+1, webnotes.conn.sql("""select count(*) from `tabSales Invoice`
where recurring_id=%s and docstatus=1""", base_si.doc.recurring_id)[0][0])
- next_date = add_months(base_si.doc.posting_date, no_of_months)
+ next_date = get_next_date(base_si.doc.posting_date, no_of_months,
+ base_si.doc.repeat_on_day_of_month)
manage_recurring_invoices(next_date=next_date, commit=False)
diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js b/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js
index 0e9b3db..6234563 100644
--- a/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js
+++ b/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js
@@ -1,8 +1,6 @@
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
-//--------- ONLOAD -------------
-
{% include "public/js/controllers/accounts.js" %}
cur_frm.cscript.onload = function(doc, cdt, cdn) {
@@ -11,7 +9,7 @@
}
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
- cur_frm.set_footnote(wn.markdown(cur_frm.meta.description));
+ cur_frm.set_footnote(wn.markdown(cur_frm.meta.description));
}
// For customizing print
@@ -40,11 +38,11 @@
var make_row = function(title, val, bold){
var bstart = '<b>'; var bend = '</b>';
return '<tr><td style="width:50%;">' + (bold?bstart:'') + title + (bold?bend:'') + '</td>'
- +'<td style="width:50%;text-align:right;">' + format_currency(val, doc.currency) + '</td>'
- +'</tr>'
+ + '<td style="width:50%;text-align:right;">' + format_currency(val, doc.currency) + '</td>'
+ + '</tr>';
}
- function convert_rate(val){
+ function convert_rate(val) {
var new_val = flt(val)/flt(doc.conversion_rate);
return new_val;
}
@@ -71,31 +69,28 @@
// add rows
if(cl.length){
- for(var i=0;i<cl.length;i++){
+ for(var i=0;i<cl.length;i++) {
if(convert_rate(cl[i].tax_amount)!=0 && !cl[i].included_in_print_rate)
out += make_row(cl[i].description, convert_rate(cl[i].tax_amount), 0);
}
}
// Discount Amount
- if(!print_hide('discount_amount') && doc.discount_amount) {
+ if(!print_hide('discount_amount') && doc.discount_amount)
out += make_row('Discount Amount', convert_rate(doc.discount_amount), 0);
- }
// grand total
- if(!print_hide('grand_total_export')) {
+ if(!print_hide('grand_total_export'))
out += make_row('Grand Total', doc.grand_total_export, 1);
- }
- if(!print_hide('rounded_total_export')) {
+ if(!print_hide('rounded_total_export'))
out += make_row('Rounded Total', doc.rounded_total_export, 1);
- }
- if(doc.in_words_export && !print_hide('in_words_export')){
+ if(doc.in_words_export && !print_hide('in_words_export')) {
out +='</table></td></tr>';
out += '<tr><td colspan = "2">';
- out += '<table><tr><td style="width:25%;"><b>In Words</b></td>'
- out += '<td style="width:50%;">' + doc.in_words_export + '</td></tr>'
+ out += '<table><tr><td style="width:25%;"><b>In Words</b></td>';
+ out += '<td style="width:50%;">' + doc.in_words_export + '</td></tr>';
}
out += '</table></td></tr></table></div>';
}
@@ -104,8 +99,8 @@
cur_frm.cscript.charge_type = function(doc, cdt, cdn) {
var d = locals[cdt][cdn];
- if(d.idx == 1 && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')){
- alert(wn._("You cannot select Charge Type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"));
+ if(d.idx == 1 && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')) {
+ msgprint(wn._("You cannot select Charge Type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"));
d.charge_type = '';
}
validated = false;
@@ -117,17 +112,17 @@
cur_frm.cscript.row_id = function(doc, cdt, cdn) {
var d = locals[cdt][cdn];
- if(!d.charge_type && d.row_id){
- alert(wn._("Please select Charge Type first"));
+ if(!d.charge_type && d.row_id) {
+ msgprint(wn._("Please select Charge Type first"));
d.row_id = '';
}
else if((d.charge_type == 'Actual' || d.charge_type == 'On Net Total') && d.row_id) {
- alert(wn._("You can Enter Row only if your Charge Type is 'On Previous Row Amount' or ' Previous Row Total'"));
+ msgprint(wn._("You can Enter Row only if your Charge Type is 'On Previous Row Amount' or ' Previous Row Total'"));
d.row_id = '';
}
- else if((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id){
+ else if((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id) {
if(d.row_id >= d.idx){
- alert(wn._("You cannot Enter Row no. greater than or equal to current row no. for this Charge type"));
+ msgprint(wn._("You cannot Enter Row no. greater than or equal to current row no. for this Charge type"));
d.row_id = '';
}
}
@@ -158,7 +153,7 @@
cur_frm.cscript.rate = function(doc, cdt, cdn) {
var d = locals[cdt][cdn];
if(!d.charge_type && d.rate) {
- alert(wn._("Please select Charge Type first"));
+ msgprint(wn._("Please select Charge Type first"));
d.rate = '';
}
validated = false;
@@ -167,12 +162,12 @@
cur_frm.cscript.tax_amount = function(doc, cdt, cdn) {
var d = locals[cdt][cdn];
- if(!d.charge_type && d.tax_amount){
- alert(wn._("Please select Charge Type first"));
+ if(!d.charge_type && d.tax_amount) {
+ msgprint(wn._("Please select Charge Type first"));
d.tax_amount = '';
}
else if(d.charge_type && d.tax_amount) {
- alert(wn._("You cannot directly enter Amount and if your Charge Type is Actual enter your amount in Rate"));
+ msgprint(wn._("You cannot directly enter Amount and if your Charge Type is Actual enter your amount in Rate"));
d.tax_amount = '';
}
validated = false;
diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.txt b/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.txt
index 11e3b31..db83cce 100644
--- a/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.txt
+++ b/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.txt
@@ -2,12 +2,13 @@
{
"creation": "2013-01-10 16:34:09",
"docstatus": 0,
- "modified": "2014-01-20 17:49:25",
+ "modified": "2014-01-28 12:28:27",
"modified_by": "Administrator",
"owner": "Administrator"
},
{
"allow_import": 1,
+ "allow_rename": 1,
"autoname": "field:title",
"description": "Standard tax template that can be applied to all Sales Transactions. This template can contain list of tax heads and also other expense / income heads like \"Shipping\", \"Insurance\", \"Handling\" etc.\n\n#### Note\n\nThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.\n\n#### Description of Columns\n\n1. Calculation Type: \n - This can be on **Net Total** (that is the sum of basic amount).\n - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.\n - **Actual** (as mentioned).\n2. Account Head: The Account ledger under which this tax will be booked\n3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.\n4. Description: Description of the tax (that will be printed in invoices / quotes).\n5. Rate: Tax rate.\n6. Amount: Tax amount.\n7. Total: Cumulative total to this point.\n8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).\n9. Is this Tax included in Basic Rate?: If you check this, it means that this tax will not be shown below the item table, but will be included in the Basic Rate in your main item table. This is useful where you want give a flat price (inclusive of all taxes) price to customers.",
"doctype": "DocType",
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index 085595e..19fda8e 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -132,7 +132,7 @@
if not hasattr(self, "gl_entries"):
conditions, values = self.prepare_conditions()
self.gl_entries = webnotes.conn.sql("""select * from `tabGL Entry`
- where docstatus < 2 {} order by posting_date, account""".format(conditions),
+ where docstatus < 2 {0} order by posting_date, account""".format(conditions),
values, as_dict=True)
return self.gl_entries
@@ -153,8 +153,8 @@
if not account_map:
webnotes.throw(_("No Customer Accounts found."))
else:
- accounts_list = ['"{}"'.format(ac) for ac in account_map]
- conditions.append("account in ({})".format(", ".join(accounts_list)))
+ accounts_list = ['"{0}"'.format(ac) for ac in account_map]
+ conditions.append("account in ({0})".format(", ".join(accounts_list)))
return " and ".join(conditions), values
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index d9cb516..941c2ae 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -6,7 +6,7 @@
import webnotes
from webnotes.utils import nowdate, cstr, flt, now, getdate, add_months
from webnotes.model.doc import addchild
-from webnotes import msgprint, _
+from webnotes import msgprint, throw, _
from webnotes.utils import formatdate
from erpnext.utilities import build_filter_conditions
@@ -41,12 +41,12 @@
def validate_fiscal_year(date, fiscal_year, label="Date"):
years = [f[0] for f in get_fiscal_years(date, label=label)]
if fiscal_year not in years:
- webnotes.msgprint(("%(label)s '%(posting_date)s': " + _("not within Fiscal Year") + \
+ throw(("%(label)s '%(posting_date)s': " + _("not within Fiscal Year") + \
": '%(fiscal_year)s'") % {
"label": label,
"posting_date": formatdate(date),
"fiscal_year": fiscal_year
- }, raise_exception=1)
+ })
@webnotes.whitelist()
def get_balance_on(account=None, date=None):
@@ -169,8 +169,7 @@
and t1.docstatus=1 and t2.%(dr_or_cr)s = %(unadjusted_amt)s""" % args)
if not ret:
- msgprint(_("""Payment Entry has been modified after you pulled it.
- Please pull it again."""), raise_exception=1)
+ throw(_("""Payment Entry has been modified after you pulled it. Please pull it again."""))
def update_against_doc(d, jv_obj):
"""
@@ -247,9 +246,9 @@
value = webnotes.conn.get_value("Company", company, fieldname)
if not value:
- msgprint(_("Please mention default value for '") +
+ throw(_("Please mention default value for '") +
_(webnotes.get_doctype("company").get_label(fieldname) +
- _("' in Company: ") + company), raise_exception=True)
+ _("' in Company: ") + company))
return value
@@ -318,11 +317,11 @@
if action_for:
actual_expense = get_actual_expense(args)
if actual_expense > budget_amount:
- webnotes.msgprint(action_for + _(" budget ") + cstr(budget_amount) +
+ throw(action_for + _(" budget ") + cstr(budget_amount) +
_(" for account ") + args.account + _(" against cost center ") +
args.cost_center + _(" will exceed by ") +
cstr(actual_expense - budget_amount) + _(" after this transaction.")
- , raise_exception=BudgetError if action=="Stop" else False)
+ , exc=BudgetError if action=="Stop" else False)
def get_allocated_budget(distribution_id, posting_date, fiscal_year, yearly_budget):
if distribution_id:
diff --git a/erpnext/buying/Print Format/Purchase Order Classic/Purchase Order Classic.txt b/erpnext/buying/Print Format/Purchase Order Classic/Purchase Order Classic.txt
index ff8448f..f1514c9 100644
--- a/erpnext/buying/Print Format/Purchase Order Classic/Purchase Order Classic.txt
+++ b/erpnext/buying/Print Format/Purchase Order Classic/Purchase Order Classic.txt
@@ -9,7 +9,7 @@
{
"doc_type": "Purchase Order",
"doctype": "Print Format",
- "html": "<!--\n\tSample Print Format for ERPNext\n\tPlease use at your own discretion\n\tFor suggestions and contributions:\n\t\thttps://github.com/webnotes/erpnext-print-templates\n\n\tFreely usable under MIT license\n-->\n\n<!-- Style Settings -->\n<style>\n\t/*\n\t\tcommon style for whole page\n\t\tThis should include:\n\t\t+ page size related settings\n\t\t+ font family settings\n\t\t+ line spacing settings\n\t*/\n\t@media screen {\n\t\tbody {\n\t\t\twidth: 8.3in;\n\t\t}\n\t}\n\n\thtml, body, div, span, td {\n\t\tfont-family: \"Georgia\", serif;\n\t\tfont-size: 12px;\n\t}\n\n\tbody {\n\t\tpadding: 10px;\n\t\tmargin: auto;\n\t\tfont-size: 12px;\n\t}\n\n\t.common {\n\t\tfont-family: \"Georgia\", serif !important;\n\t\tfont-size: 12px;\n\t\tpadding: 10px 0px;\n\t}\n\n\ttable {\n\t\tborder-collapse: collapse;\n\t\twidth: 100%;\n\t\tvertical-align: top;\n\t}\n\n\ttable td {\n\t\tpadding: 2px 0px;\n\t}\n\t\n\ttable h1, h2, h3, h4, h5, h6 {\n\t\tpadding: 0px;\n\t\tmargin: 0px;\n\t}\n\n\ttable.header-table td {\n\t\tvertical-align: top;\n\t}\n\n\ttable.header-table thead {\n\t\tborder-bottom: 1px solid black;\n\t}\n\n\ttable.header-table h3 {\n\t\tcolor: gray;\n\t}\n\n\ttable.header-table thead td {\n\t\tpadding: 5px 0px;\n\t}\n\n\tdiv.page-body table td:nth-child(6),\n\tdiv.page-body table td:nth-child(7) {\n\t\ttext-align: right;\n\t}\n\n\ttable.footer-table td {\n\t\tvertical-align: top;\n\t}\n\n\ttable.footer-table td table td:nth-child(2),\n\ttable.footer-table td table td:nth-child(3) {\n\t\ttext-align: right;\n\t}\n</style>\n\n\n<!-- Javascript -->\n<script>\n\tsi_std = {\n\t\tprint_item_table: function() {\n\t\t\tvar table = print_table(\n\t\t\t\t'Purchase Order',\n\t\t\t\tdoc.name,\n\t\t\t\t'po_details',\n\t\t\t\t'Purchase Order Item',\n\t\t\t\t[// Here specify the table columns to be displayed\n\t\t\t\t\t'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',\n\t\t\t\t\t'import_rate', 'import_amount'\n\t\t\t\t],\n\t\t\t\t[// Here specify the labels of column headings\n\t\t\t\t\t'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',\n\t\t\t\t\t'UoM', 'Basic Rate', 'Amount'\n\t\t\t\t],\n\t\t\t\t[// Here specify the column widths\n\t\t\t\t\t'3%', '10%', '15%', '32%', '5%',\n\t\t\t\t\t'5%', '15%', '15%'\n\t\t\t\t]\n\t\t\t);\n\n\t\t\t// This code takes care of page breaks\n\t\t\tif(table.appendChild) {\n\t\t\t\tout = table.innerHTML;\n\t\t\t} else {\n\t\t\t\tout = '';\n\t\t\t\tfor(var i=0; i < (table.length-1); i++) {\n\t\t\t\t\tout += table[i].innerHTML + \n\t\t\t\t\t\t'<div style = \"page-break-after: always;\" \\\n\t\t\t\t\t\tclass = \"page_break\"></div>\\\n\t\t\t\t\t\t<div class=\"page-settings\"></div>';\n\t\t\t\t}\n\t\t\t\tout += table[table.length-1].innerHTML;\n\t\t\t}\n\t\t\treturn out;\n\t\t},\n\n\n\t\tprint_other_charges: function(parent) {\n\t\t\tvar oc = getchildren('Purchase Taxes and Charges', doc.name, 'purchase_tax_details');\n\t\t\tvar rows = '<table width=100%>\\n';\n\t\t\tfor(var i=0; i<oc.length; i++) {\n\t\t\t\trows +=\n\t\t\t\t\t'<tr>\\n' +\n\t\t\t\t\t\t'\\t<td>' + oc[i].description + '</td>\\n' +\n\t\t\t\t\t\t'\\t<td style=\"width: 38%; text-align: right;\">' + format_currency(oc[i].tax_amount / (doc.conversion_rate || 1), doc.currency) + '</td>\\n' +\n\t\t\t\t\t'</tr>\\n';\n\t\t\t}\n\t\t\treturn rows + '</table>\\n';\n\t\t}\n\t};\n</script>\n\n\n<!-- Page Layout Settings -->\n<div class='common page-header'>\n\t<!-- \n\t\tPage Header will contain\n\t\t\t+ table 1\n\t\t\t\t+ table 1a\n\t\t\t\t\t- Name\n\t\t\t\t\t- Address\n\t\t\t\t\t- Contact\n\t\t\t\t\t- Mobile No\n\t\t\t\t+ table 1b\n\t\t\t\t\t- Voucher Date\n\t\t\t\t\t- Due Date\n\t-->\n\t<table class='header-table' cellspacing=0>\n\t\t<thead>\n\t\t\t<tr><td><script>'<h1>' + (doc.select_print_heading || 'Purchase Order') + '</h1>'</script></td></tr>\n\t\t\t<tr><td><h3><script>cur_frm.docname</script></h3></td></tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td width=60%><table width=100% cellspacing=0><tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td width=22%><b>Name</b></td>\n\t\t\t\t\t\t<td><script>doc.supplier_name</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><b>Address</b></td>\n\t\t\t\t\t\t<td><script>replace_newlines(doc.address_display)</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><b>Contact</b></td>\n\t\t\t\t\t\t<td><script>doc.contact_display</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody></table></td>\n\t\t\t\t<td><table width=100% cellspacing=0><tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td width=63%><b>Purchase Order Date</b></td>\n\t\t\t\t\t\t<td><script>date.str_to_user(doc.transaction_date)</script></td>\n\t\t\t\t\t<tr>\t\t\t\t\t\n\t\t\t\t</tbody></table></td>\n\t\t\t</tr>\n\t\t</tbody>\n\t\t<tfoot>\n\t\t\n\t\t</tfoot>\n\t</table>\n</div>\n<div class='common page-body'>\n\t<!-- \n\t\tPage Body will contain\n\t\t\t+ table 2\n\t\t\t\t- Sales Invoice Data\n\t-->\n\t<script>si_std.print_item_table()</script>\n</div>\n<div class='common page-footer'>\n\t<!-- \n\t\tPage Footer will contain\n\t\t\t+ table 3\n\t\t\t\t- Terms and Conditions\n\t\t\t\t- Total Rounded Amount Calculation\n\t\t\t\t- Total Rounded Amount in Words\n\t-->\n\t<table class='footer-table' width=100% cellspacing=0>\n\t\t<thead>\n\t\t\t\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td width=60% style='padding-right: 10px;'>\n\t\t\t\t\t<b>Terms, Conditions & Other Information:</b><br />\n\t\t\t\t\t<script>doc.terms</script>\n\t\t\t\t</td>\n\t\t\t\t<td>\n\t\t\t\t\t<table cellspacing=0 width=100%><tbody>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>Net Total</td>\n\t\t\t\t\t\t\t<td style=\"width: 38%; text-align: right;\"><script>\n\t\t\t\t\t\t\t\tformat_currency(doc.net_total_import, doc.currency)\n\t\t\t\t\t\t\t</script></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>\n\t\t\t\t\t\t<tr style='font-weight: bold'>\n\t\t\t\t\t\t\t<td>Grand Total</td>\n\t\t\t\t\t\t\t<td style=\"width: 38%; text-align: right;\"><script>\n\t\t\t\t\t\t\t\tformat_currency(doc.grand_total_import, doc.currency)\n\t\t\t\t\t\t\t</script></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody></table>\n\t\t\t\t\t<br /><b>In Words</b><br />\n\t\t\t\t\t<i><script>doc.in_words_import</script></i>\n\t\t\t\t</td>\n\t\t\t</tr>\t\t\n\t\t</tbody>\n\t\t<tfoot>\n\t\t\n\t\t</tfoot>\n\t</table>\n</div>\n",
+ "html": "<!--\n\tSample Print Format for ERPNext\n\tPlease use at your own discretion\n\tFor suggestions and contributions:\n\t\thttps://github.com/webnotes/erpnext-print-templates\n\n\tFreely usable under MIT license\n-->\n\n<!-- Style Settings -->\n<style>\n\t/*\n\t\tcommon style for whole page\n\t\tThis should include:\n\t\t+ page size related settings\n\t\t+ font family settings\n\t\t+ line spacing settings\n\t*/\n\t@media screen {\n\t\tbody {\n\t\t\twidth: 8.3in;\n\t\t}\n\t}\n\n\thtml, body, div, span, td {\n\t\tfont-family: \"Georgia\", serif;\n\t\tfont-size: 12px;\n\t}\n\n\tbody {\n\t\tpadding: 10px;\n\t\tmargin: auto;\n\t\tfont-size: 12px;\n\t}\n\n\t.common {\n\t\tfont-family: \"Georgia\", serif !important;\n\t\tfont-size: 12px;\n\t\tpadding: 10px 0px;\n\t}\n\n\ttable {\n\t\tborder-collapse: collapse;\n\t\twidth: 100%;\n\t\tvertical-align: top;\n\t}\n\n\ttable td {\n\t\tpadding: 2px 0px;\n\t}\n\t\n\ttable h1, h2, h3, h4, h5, h6 {\n\t\tpadding: 0px;\n\t\tmargin: 0px;\n\t}\n\n\ttable.header-table td {\n\t\tvertical-align: top;\n\t}\n\n\ttable.header-table thead {\n\t\tborder-bottom: 1px solid black;\n\t}\n\n\ttable.header-table h3 {\n\t\tcolor: gray;\n\t}\n\n\ttable.header-table thead td {\n\t\tpadding: 5px 0px;\n\t}\n\n\tdiv.page-body table td:nth-child(6),\n\tdiv.page-body table td:nth-child(7) {\n\t\ttext-align: right;\n\t}\n\n\ttable.footer-table td {\n\t\tvertical-align: top;\n\t}\n\n\ttable.footer-table td table td:nth-child(2),\n\ttable.footer-table td table td:nth-child(3) {\n\t\ttext-align: right;\n\t}\n</style>\n\n\n<!-- Javascript -->\n<script>\n\tsi_std = {\n\t\tprint_item_table: function() {\n\t\t\tvar table = print_table(\n\t\t\t\t'Purchase Order',\n\t\t\t\tdoc.name,\n\t\t\t\t'po_details',\n\t\t\t\t'Purchase Order Item',\n\t\t\t\t[// Here specify the table columns to be displayed\n\t\t\t\t\t'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',\n\t\t\t\t\t'import_rate', 'import_amount'\n\t\t\t\t],\n\t\t\t\t[// Here specify the labels of column headings\n\t\t\t\t\t'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',\n\t\t\t\t\t'UoM', 'Basic Rate', 'Amount'\n\t\t\t\t],\n\t\t\t\t[// Here specify the column widths\n\t\t\t\t\t'3%', '10%', '15%', '32%', '5%',\n\t\t\t\t\t'5%', '15%', '15%'\n\t\t\t\t]\n\t\t\t);\n\n\t\t\t// This code takes care of page breaks\n\t\t\tif(table.appendChild) {\n\t\t\t\tout = table.innerHTML;\n\t\t\t} else {\n\t\t\t\tout = '';\n\t\t\t\tfor(var i=0; i < (table.length-1); i++) {\n\t\t\t\t\tout += table[i].innerHTML + \n\t\t\t\t\t\t'<div style = \"page-break-after: always;\" \\\n\t\t\t\t\t\tclass = \"page_break\"></div>\\\n\t\t\t\t\t\t<div class=\"page-settings\"></div>';\n\t\t\t\t}\n\t\t\t\tout += table[table.length-1].innerHTML;\n\t\t\t}\n\t\t\treturn out;\n\t\t},\n\n\n\t\tprint_other_charges: function(parent) {\n\t\t\tvar oc = getchildren('Purchase Taxes and Charges', doc.name, 'other_charges');\n\t\t\tvar rows = '<table width=100%>\\n';\n\t\t\tfor(var i=0; i<oc.length; i++) {\n\t\t\t\trows +=\n\t\t\t\t\t'<tr>\\n' +\n\t\t\t\t\t\t'\\t<td>' + oc[i].description + '</td>\\n' +\n\t\t\t\t\t\t'\\t<td style=\"width: 38%; text-align: right;\">' + format_currency(oc[i].tax_amount / (doc.conversion_rate || 1), doc.currency) + '</td>\\n' +\n\t\t\t\t\t'</tr>\\n';\n\t\t\t}\n\t\t\treturn rows + '</table>\\n';\n\t\t}\n\t};\n</script>\n\n\n<!-- Page Layout Settings -->\n<div class='common page-header'>\n\t<!-- \n\t\tPage Header will contain\n\t\t\t+ table 1\n\t\t\t\t+ table 1a\n\t\t\t\t\t- Name\n\t\t\t\t\t- Address\n\t\t\t\t\t- Contact\n\t\t\t\t\t- Mobile No\n\t\t\t\t+ table 1b\n\t\t\t\t\t- Voucher Date\n\t\t\t\t\t- Due Date\n\t-->\n\t<table class='header-table' cellspacing=0>\n\t\t<thead>\n\t\t\t<tr><td><script>'<h1>' + (doc.select_print_heading || 'Purchase Order') + '</h1>'</script></td></tr>\n\t\t\t<tr><td><h3><script>cur_frm.docname</script></h3></td></tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td width=60%><table width=100% cellspacing=0><tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td width=22%><b>Name</b></td>\n\t\t\t\t\t\t<td><script>doc.supplier_name</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><b>Address</b></td>\n\t\t\t\t\t\t<td><script>replace_newlines(doc.address_display)</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><b>Contact</b></td>\n\t\t\t\t\t\t<td><script>doc.contact_display</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody></table></td>\n\t\t\t\t<td><table width=100% cellspacing=0><tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td width=63%><b>Purchase Order Date</b></td>\n\t\t\t\t\t\t<td><script>date.str_to_user(doc.transaction_date)</script></td>\n\t\t\t\t\t<tr>\t\t\t\t\t\n\t\t\t\t</tbody></table></td>\n\t\t\t</tr>\n\t\t</tbody>\n\t\t<tfoot>\n\t\t\n\t\t</tfoot>\n\t</table>\n</div>\n<div class='common page-body'>\n\t<!-- \n\t\tPage Body will contain\n\t\t\t+ table 2\n\t\t\t\t- Sales Invoice Data\n\t-->\n\t<script>si_std.print_item_table()</script>\n</div>\n<div class='common page-footer'>\n\t<!-- \n\t\tPage Footer will contain\n\t\t\t+ table 3\n\t\t\t\t- Terms and Conditions\n\t\t\t\t- Total Rounded Amount Calculation\n\t\t\t\t- Total Rounded Amount in Words\n\t-->\n\t<table class='footer-table' width=100% cellspacing=0>\n\t\t<thead>\n\t\t\t\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td width=60% style='padding-right: 10px;'>\n\t\t\t\t\t<b>Terms, Conditions & Other Information:</b><br />\n\t\t\t\t\t<script>doc.terms</script>\n\t\t\t\t</td>\n\t\t\t\t<td>\n\t\t\t\t\t<table cellspacing=0 width=100%><tbody>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>Net Total</td>\n\t\t\t\t\t\t\t<td style=\"width: 38%; text-align: right;\"><script>\n\t\t\t\t\t\t\t\tformat_currency(doc.net_total_import, doc.currency)\n\t\t\t\t\t\t\t</script></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>\n\t\t\t\t\t\t<tr style='font-weight: bold'>\n\t\t\t\t\t\t\t<td>Grand Total</td>\n\t\t\t\t\t\t\t<td style=\"width: 38%; text-align: right;\"><script>\n\t\t\t\t\t\t\t\tformat_currency(doc.grand_total_import, doc.currency)\n\t\t\t\t\t\t\t</script></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody></table>\n\t\t\t\t\t<br /><b>In Words</b><br />\n\t\t\t\t\t<i><script>doc.in_words_import</script></i>\n\t\t\t\t</td>\n\t\t\t</tr>\t\t\n\t\t</tbody>\n\t\t<tfoot>\n\t\t\n\t\t</tfoot>\n\t</table>\n</div>\n",
"module": "Buying",
"name": "__common__",
"print_format_type": "Client",
diff --git a/erpnext/buying/Print Format/Purchase Order Modern/Purchase Order Modern.txt b/erpnext/buying/Print Format/Purchase Order Modern/Purchase Order Modern.txt
index 3be7eb0..9e0693a 100644
--- a/erpnext/buying/Print Format/Purchase Order Modern/Purchase Order Modern.txt
+++ b/erpnext/buying/Print Format/Purchase Order Modern/Purchase Order Modern.txt
@@ -9,7 +9,7 @@
{
"doc_type": "Purchase Order",
"doctype": "Print Format",
- "html": "<!--\n Sample Print Format for ERPNext\n\tPlease use at your own discretion\n\tFor suggestions and contributions:\n\t\thttps://github.com/webnotes/erpnext-print-templates\n\n\tFreely usable under MIT license\n-->\n\n<!-- Style Settings -->\n<style>\n\t/*\n\t\tcommon style for whole page\n\t\tThis should include:\n\t\t+ page size related settings\n\t\t+ font family settings\n\t\t+ line spacing settings\n\t*/\n\t@media screen {\n\t\tbody {\n\t\t\twidth: 8.3in;\n\t\t}\n\t}\n\n\thtml, body, div, span, td {\n\t\tfont-family: \"Helvetica\", \"Arial\", sans-serif;\n\t\tfont-size: 12px;\n\t}\n\n\tbody {\n\t\tpadding: 10px;\n\t\tmargin: auto;\n\t\tfont-size: 12px;\n line-height: 150%;\n\t}\n\n\t.common {\n\t\tfont-family: \"Helvetica\", \"Arial\", sans-serif !important;\n\t\tfont-size: 12px;\n\t\tpadding: 10px 0px;\n\t}\n\n\ttable {\n\t\tborder-collapse: collapse;\n\t\twidth: 100%;\n\t\tvertical-align: top;\n\t\tborder-style: none !important;\n\t}\n\n\ttable td {\n\t\tpadding: 2px 0px;\n\t\tborder-style: none !important;\n\t}\n\t\n\ttable h1, h2, h3, h4, h5, h6 {\n\t\tpadding: 0px;\n\t\tmargin: 0px;\n\t}\n\n\ttable.header-table td {\n\t\tvertical-align: top;\n\t}\n\n\ttable.header-table h1 {\n\t\ttext-transform: uppercase;\n\t\tcolor: white;\n\t\tfont-size: 55px;\n\t\tfont-style: italic;\n\t}\n\n\ttable.header-table thead tr:nth-child(1) div {\n\t\theight: 24px;\n\t\tbackground-color: #696969;\n\t\tvertical-align: middle;\n\t\tpadding: 12px 0px 0px 0px;\n\t\twidth: 100%;\n\t}\n\n\tdiv.page-body table td:nth-child(6),\n\tdiv.page-body table td:nth-child(7) {\n\t\ttext-align: right;\n\t}\n\n\tdiv.page-body table tr td {\n\t\tbackground-color: #DCDCDC !important;\n\t}\n\n\tdiv.page-body table tr:nth-child(1) td {\n\t\tbackground-color: #696969 !important;\n\t\tcolor: white !important;\n\t}\n\n\ttable.footer-table td {\n\t\tvertical-align: top;\n\t}\n\n\ttable.footer-table td table td:nth-child(2),\n\ttable.footer-table td table td:nth-child(3) {\n\t\ttext-align: right;\n\t}\n\n\ttable.footer-table tfoot td {\n\t\tbackground-color: #696969;\n\t\theight: 10px;\n\t}\n\n\t.imp-details {\n\t\tbackground-color: #DCDCDC;\n\t}\n</style>\n\n\n<!-- Javascript -->\n<script>\n\tsi_std = {\n\t\tprint_item_table: function() {\n\t\t\tvar table = print_table(\n\t\t\t\t'Purchase Order',\n\t\t\t\tdoc.name,\n\t\t\t\t'po_details',\n\t\t\t\t'Purchase Order Item',\n\t\t\t\t[// Here specify the table columns to be displayed\n\t\t\t\t\t'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',\n\t\t\t\t\t'import_rate', 'import_amount'\n\t\t\t\t],\n\t\t\t\t[// Here specify the labels of column headings\n\t\t\t\t\t'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',\n\t\t\t\t\t'UoM', 'Basic Rate', 'Amount'\n\t\t\t\t],\n\t\t\t\t[// Here specify the column widths\n\t\t\t\t\t'3%', '10%', '15%', '32%', '5%',\n\t\t\t\t\t'5%', '15%', '15%'\n\t\t\t\t]\n\t\t\t);\n\n\t\t\t// This code takes care of page breaks\n\t\t\tif(table.appendChild) {\n\t\t\t\tout = table.innerHTML;\n\t\t\t} else {\n\t\t\t\tout = '';\n\t\t\t\tfor(var i=0; i < (table.length-1); i++) {\n\t\t\t\t\tout += table[i].innerHTML + \n\t\t\t\t\t\t'<div style = \"page-break-after: always;\" \\\n\t\t\t\t\t\tclass = \"page_break\"></div>\\\n\t\t\t\t\t\t<div class=\"page-settings\"></div>';\n\t\t\t\t}\n\t\t\t\tout += table[table.length-1].innerHTML;\n\t\t\t}\n\t\t\treturn out;\n\t\t},\n\n\n\t\tprint_other_charges: function(parent) {\n\t\t\tvar oc = getchildren('Purchase Taxes and Charges', doc.name, 'purchase_tax_details');\n\t\t\tvar rows = '<table width=100%>\\n';\n\t\t\tfor(var i=0; i<oc.length; i++) {\n\t\t\t\trows +=\n\t\t\t\t\t'<tr>\\n' +\n\t\t\t\t\t\t'\\t<td>' + oc[i].description + '</td>\\n' +\n\t\t\t\t\t\t'\\t<td style=\"width: 38%; text-align: right;\">' + format_currency(oc[i].tax_amount / (doc.conversion_rate || 1), doc.currency) + '</td>\\n' +\n\t\t\t\t\t'</tr>\\n';\n\t\t\t}\n\t\t\treturn rows + '</table>\\n';\n\t\t}\n\t};\n</script>\n\n\n<!-- Page Layout Settings -->\n<div class='common page-header'>\n\t<!-- \n\t\tPage Header will contain\n\t\t\t+ table 1\n\t\t\t\t+ table 1a\n\t\t\t\t\t- Name\n\t\t\t\t\t- Address\n\t\t\t\t\t- Contact\n\t\t\t\t\t- Mobile No\n\t\t\t\t+ table 1b\n\t\t\t\t\t- Voucher Date\n\t\t\t\t\t- Due Date\n\t-->\n\t<table class='header-table' cellspacing=0>\n\t\t<thead>\n\t\t\t<tr><td colspan=2><div><script>'<h1>' + (doc.select_print_heading || 'Purchase Order') + '</h1>'</script></div></td></tr>\n\t\t\t<tr><td colspan=2><div style=\"height:15px\"></div></td></tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td width=60%><table width=100% cellspacing=0><tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td width=22%><b>Name</b></td>\n\t\t\t\t\t\t<td><script>doc.supplier_name</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><b>Address</b></td>\n\t\t\t\t\t\t<td><script>replace_newlines(doc.address_display)</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><b>Contact</b></td>\n\t\t\t\t\t\t<td><script>doc.contact_display</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody></table></td>\n\t\t\t\t<td><table width=100% cellspacing=0><tbody>\n\t\t\t\t\t<tr class='imp-details'>\n\t\t\t\t\t\t<td><b>Purchase Order No.</b></td>\n\t\t\t\t\t\t<td><script>cur_frm.docname</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td width=63%><b>Purchase Order Date</b></td>\n\t\t\t\t\t\t<td><script>date.str_to_user(doc.transaction_date)</script></td>\n\t\t\t\t\t<tr>\t\t\t\t\t\n\t\t\t\t</tbody></table></td>\n\t\t\t</tr>\n\t\t</tbody>\n\t\t<tfoot>\n\t\t\n\t\t</tfoot>\n\t</table>\n</div>\n<div class='common page-body'>\n\t<!-- \n\t\tPage Body will contain\n\t\t\t+ table 2\n\t\t\t\t- Sales Invoice Data\n\t-->\n\t<script>si_std.print_item_table()</script>\n</div>\n<div class='common page-footer'>\n\t<!-- \n\t\tPage Footer will contain\n\t\t\t+ table 3\n\t\t\t\t- Terms and Conditions\n\t\t\t\t- Total Rounded Amount Calculation\n\t\t\t\t- Total Rounded Amount in Words\n\t-->\n\t<table class='footer-table' width=100% cellspacing=0>\n\t\t<thead>\n\t\t\t\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td width=60% style='padding-right: 10px;'>\n\t\t\t\t\t<b>Terms, Conditions & Other Information:</b><br />\n\t\t\t\t\t<script>doc.terms</script>\n\t\t\t\t</td>\n\t\t\t\t<td>\n\t\t\t\t\t<table cellspacing=0 width=100%><tbody>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>Net Total</td>\n\t\t\t\t\t\t\t<td style=\"width: 38%; text-align: right;\"><script>\n\t\t\t\t\t\t\t\tformat_currency(doc.net_total_import, doc.currency)\n\t\t\t\t\t\t\t</script></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>\n\t\t\t\t\t\t<tr style='font-weight: bold' class='imp-details'>\n\t\t\t\t\t\t\t<td>Grand Total</td>\n\t\t\t\t\t\t\t<td style=\"width: 38%; text-align: right;\"><script>\n\t\t\t\t\t\t\t\tformat_currency(doc.grand_total_import, doc.currency)\n\t\t\t\t\t\t\t</script></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody></table>\n\t\t\t\t\t<br /><b>In Words</b><br />\n\t\t\t\t\t<i><script>doc.in_words_import</script></i>\n\t\t\t\t</td>\n\t\t\t</tr>\t\t\n\t\t</tbody>\n\t\t<tfoot>\n\t\t\t<tr><td colspan=2><div></div></td><tr>\n\t\t</tfoot>\n\t</table>\n</div>\n",
+ "html": "<!--\n Sample Print Format for ERPNext\n\tPlease use at your own discretion\n\tFor suggestions and contributions:\n\t\thttps://github.com/webnotes/erpnext-print-templates\n\n\tFreely usable under MIT license\n-->\n\n<!-- Style Settings -->\n<style>\n\t/*\n\t\tcommon style for whole page\n\t\tThis should include:\n\t\t+ page size related settings\n\t\t+ font family settings\n\t\t+ line spacing settings\n\t*/\n\t@media screen {\n\t\tbody {\n\t\t\twidth: 8.3in;\n\t\t}\n\t}\n\n\thtml, body, div, span, td {\n\t\tfont-family: \"Helvetica\", \"Arial\", sans-serif;\n\t\tfont-size: 12px;\n\t}\n\n\tbody {\n\t\tpadding: 10px;\n\t\tmargin: auto;\n\t\tfont-size: 12px;\n line-height: 150%;\n\t}\n\n\t.common {\n\t\tfont-family: \"Helvetica\", \"Arial\", sans-serif !important;\n\t\tfont-size: 12px;\n\t\tpadding: 10px 0px;\n\t}\n\n\ttable {\n\t\tborder-collapse: collapse;\n\t\twidth: 100%;\n\t\tvertical-align: top;\n\t\tborder-style: none !important;\n\t}\n\n\ttable td {\n\t\tpadding: 2px 0px;\n\t\tborder-style: none !important;\n\t}\n\t\n\ttable h1, h2, h3, h4, h5, h6 {\n\t\tpadding: 0px;\n\t\tmargin: 0px;\n\t}\n\n\ttable.header-table td {\n\t\tvertical-align: top;\n\t}\n\n\ttable.header-table h1 {\n\t\ttext-transform: uppercase;\n\t\tcolor: white;\n\t\tfont-size: 55px;\n\t\tfont-style: italic;\n\t}\n\n\ttable.header-table thead tr:nth-child(1) div {\n\t\theight: 24px;\n\t\tbackground-color: #696969;\n\t\tvertical-align: middle;\n\t\tpadding: 12px 0px 0px 0px;\n\t\twidth: 100%;\n\t}\n\n\tdiv.page-body table td:nth-child(6),\n\tdiv.page-body table td:nth-child(7) {\n\t\ttext-align: right;\n\t}\n\n\tdiv.page-body table tr td {\n\t\tbackground-color: #DCDCDC !important;\n\t}\n\n\tdiv.page-body table tr:nth-child(1) td {\n\t\tbackground-color: #696969 !important;\n\t\tcolor: white !important;\n\t}\n\n\ttable.footer-table td {\n\t\tvertical-align: top;\n\t}\n\n\ttable.footer-table td table td:nth-child(2),\n\ttable.footer-table td table td:nth-child(3) {\n\t\ttext-align: right;\n\t}\n\n\ttable.footer-table tfoot td {\n\t\tbackground-color: #696969;\n\t\theight: 10px;\n\t}\n\n\t.imp-details {\n\t\tbackground-color: #DCDCDC;\n\t}\n</style>\n\n\n<!-- Javascript -->\n<script>\n\tsi_std = {\n\t\tprint_item_table: function() {\n\t\t\tvar table = print_table(\n\t\t\t\t'Purchase Order',\n\t\t\t\tdoc.name,\n\t\t\t\t'po_details',\n\t\t\t\t'Purchase Order Item',\n\t\t\t\t[// Here specify the table columns to be displayed\n\t\t\t\t\t'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',\n\t\t\t\t\t'import_rate', 'import_amount'\n\t\t\t\t],\n\t\t\t\t[// Here specify the labels of column headings\n\t\t\t\t\t'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',\n\t\t\t\t\t'UoM', 'Basic Rate', 'Amount'\n\t\t\t\t],\n\t\t\t\t[// Here specify the column widths\n\t\t\t\t\t'3%', '10%', '15%', '32%', '5%',\n\t\t\t\t\t'5%', '15%', '15%'\n\t\t\t\t]\n\t\t\t);\n\n\t\t\t// This code takes care of page breaks\n\t\t\tif(table.appendChild) {\n\t\t\t\tout = table.innerHTML;\n\t\t\t} else {\n\t\t\t\tout = '';\n\t\t\t\tfor(var i=0; i < (table.length-1); i++) {\n\t\t\t\t\tout += table[i].innerHTML + \n\t\t\t\t\t\t'<div style = \"page-break-after: always;\" \\\n\t\t\t\t\t\tclass = \"page_break\"></div>\\\n\t\t\t\t\t\t<div class=\"page-settings\"></div>';\n\t\t\t\t}\n\t\t\t\tout += table[table.length-1].innerHTML;\n\t\t\t}\n\t\t\treturn out;\n\t\t},\n\n\n\t\tprint_other_charges: function(parent) {\n\t\t\tvar oc = getchildren('Purchase Taxes and Charges', doc.name, 'other_charges');\n\t\t\tvar rows = '<table width=100%>\\n';\n\t\t\tfor(var i=0; i<oc.length; i++) {\n\t\t\t\trows +=\n\t\t\t\t\t'<tr>\\n' +\n\t\t\t\t\t\t'\\t<td>' + oc[i].description + '</td>\\n' +\n\t\t\t\t\t\t'\\t<td style=\"width: 38%; text-align: right;\">' + format_currency(oc[i].tax_amount / (doc.conversion_rate || 1), doc.currency) + '</td>\\n' +\n\t\t\t\t\t'</tr>\\n';\n\t\t\t}\n\t\t\treturn rows + '</table>\\n';\n\t\t}\n\t};\n</script>\n\n\n<!-- Page Layout Settings -->\n<div class='common page-header'>\n\t<!-- \n\t\tPage Header will contain\n\t\t\t+ table 1\n\t\t\t\t+ table 1a\n\t\t\t\t\t- Name\n\t\t\t\t\t- Address\n\t\t\t\t\t- Contact\n\t\t\t\t\t- Mobile No\n\t\t\t\t+ table 1b\n\t\t\t\t\t- Voucher Date\n\t\t\t\t\t- Due Date\n\t-->\n\t<table class='header-table' cellspacing=0>\n\t\t<thead>\n\t\t\t<tr><td colspan=2><div><script>'<h1>' + (doc.select_print_heading || 'Purchase Order') + '</h1>'</script></div></td></tr>\n\t\t\t<tr><td colspan=2><div style=\"height:15px\"></div></td></tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td width=60%><table width=100% cellspacing=0><tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td width=22%><b>Name</b></td>\n\t\t\t\t\t\t<td><script>doc.supplier_name</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><b>Address</b></td>\n\t\t\t\t\t\t<td><script>replace_newlines(doc.address_display)</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><b>Contact</b></td>\n\t\t\t\t\t\t<td><script>doc.contact_display</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody></table></td>\n\t\t\t\t<td><table width=100% cellspacing=0><tbody>\n\t\t\t\t\t<tr class='imp-details'>\n\t\t\t\t\t\t<td><b>Purchase Order No.</b></td>\n\t\t\t\t\t\t<td><script>cur_frm.docname</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td width=63%><b>Purchase Order Date</b></td>\n\t\t\t\t\t\t<td><script>date.str_to_user(doc.transaction_date)</script></td>\n\t\t\t\t\t<tr>\t\t\t\t\t\n\t\t\t\t</tbody></table></td>\n\t\t\t</tr>\n\t\t</tbody>\n\t\t<tfoot>\n\t\t\n\t\t</tfoot>\n\t</table>\n</div>\n<div class='common page-body'>\n\t<!-- \n\t\tPage Body will contain\n\t\t\t+ table 2\n\t\t\t\t- Sales Invoice Data\n\t-->\n\t<script>si_std.print_item_table()</script>\n</div>\n<div class='common page-footer'>\n\t<!-- \n\t\tPage Footer will contain\n\t\t\t+ table 3\n\t\t\t\t- Terms and Conditions\n\t\t\t\t- Total Rounded Amount Calculation\n\t\t\t\t- Total Rounded Amount in Words\n\t-->\n\t<table class='footer-table' width=100% cellspacing=0>\n\t\t<thead>\n\t\t\t\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td width=60% style='padding-right: 10px;'>\n\t\t\t\t\t<b>Terms, Conditions & Other Information:</b><br />\n\t\t\t\t\t<script>doc.terms</script>\n\t\t\t\t</td>\n\t\t\t\t<td>\n\t\t\t\t\t<table cellspacing=0 width=100%><tbody>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>Net Total</td>\n\t\t\t\t\t\t\t<td style=\"width: 38%; text-align: right;\"><script>\n\t\t\t\t\t\t\t\tformat_currency(doc.net_total_import, doc.currency)\n\t\t\t\t\t\t\t</script></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>\n\t\t\t\t\t\t<tr style='font-weight: bold' class='imp-details'>\n\t\t\t\t\t\t\t<td>Grand Total</td>\n\t\t\t\t\t\t\t<td style=\"width: 38%; text-align: right;\"><script>\n\t\t\t\t\t\t\t\tformat_currency(doc.grand_total_import, doc.currency)\n\t\t\t\t\t\t\t</script></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody></table>\n\t\t\t\t\t<br /><b>In Words</b><br />\n\t\t\t\t\t<i><script>doc.in_words_import</script></i>\n\t\t\t\t</td>\n\t\t\t</tr>\t\t\n\t\t</tbody>\n\t\t<tfoot>\n\t\t\t<tr><td colspan=2><div></div></td><tr>\n\t\t</tfoot>\n\t</table>\n</div>\n",
"module": "Buying",
"name": "__common__",
"print_format_type": "Client",
diff --git a/erpnext/buying/Print Format/Purchase Order Spartan/Purchase Order Spartan.txt b/erpnext/buying/Print Format/Purchase Order Spartan/Purchase Order Spartan.txt
index 908ee78..79016a7 100644
--- a/erpnext/buying/Print Format/Purchase Order Spartan/Purchase Order Spartan.txt
+++ b/erpnext/buying/Print Format/Purchase Order Spartan/Purchase Order Spartan.txt
@@ -9,7 +9,7 @@
{
"doc_type": "Purchase Order",
"doctype": "Print Format",
- "html": "<!--\n\tSample Print Format for ERPNext\n\tPlease use at your own discretion\n\tFor suggestions and contributions:\n\t\thttps://github.com/webnotes/erpnext-print-templates\n\n\tFreely usable under MIT license\n-->\n\n<!-- Style Settings -->\n<style>\n\t/*\n\t\tcommon style for whole page\n\t\tThis should include:\n\t\t+ page size related settings\n\t\t+ font family settings\n\t\t+ line spacing settings\n\t*/\n\t@media screen {\n\t\tbody {\n\t\t\twidth: 8.3in;\n\t\t}\n\t}\n\n\thtml, body, div, span, td {\n\t\tfont-family: \"Arial\", sans-serif;\n\t\tfont-size: 12px;\n\t}\n\n\tbody {\n\t\tpadding: 10px;\n\t\tmargin: auto;\n\t\tfont-size: 12px;\n\t}\n\n\t.common {\n\t\tfont-family: \"Arial\", sans-serif !important;\n\t\tfont-size: 12px;\n\t\tpadding: 0px;\n\t}\n\n\ttable {\n\t\twidth: 100% !important;\n\t\tvertical-align: top;\n\t}\n\n\ttable td {\n\t\tpadding: 2px 0px;\n\t}\n\n\ttable, td {\n\t\tborder-collapse: collapse !important;\n\t\tpadding: 0px;\n\t\tmargin: 0px !important;\n\t}\n\t\n\ttable h1, h2, h3, h4, h5, h6 {\n\t\tpadding: 0px;\n\t\tmargin: 0px;\n\t}\n\n\ttable.header-table td {\n\t\tvertical-align: top;\n\t}\n\n\ttable.header-table h3 {\n\t\tcolor: gray;\n\t}\n\n\ttable.header-table thead td {\n\t\tpadding: 5px;\n\t}\n\n\ttable.header-table > thead,\n\ttable.header-table > tbody > tr > td,\n\ttable.footer-table > tbody > tr > td {\n\t\tborder: 1px solid black;\n\t\tpadding: 5px;\n\t}\n\n\ttable.footer-table > tbody,\n\ttable.header-table > thead {\n\t\tborder-bottom: 3px solid black;\n\t}\n\n\ttable.header-table > thead {\n\t\tborder-top: 3px solid black;\n\t}\n\n\tdiv.page-body table td:nth-child(6),\n\tdiv.page-body table td:nth-child(7) {\n\t\ttext-align: right;\n\t}\n\n\tdiv.page-body td {\n\t\tbackground-color: white !important;\n\t\tborder: 1px solid black !important;\n\t}\n\n\ttable.footer-table td {\n\t\tvertical-align: top;\n\t}\n\n\ttable.footer-table td table td:nth-child(2),\n\ttable.footer-table td table td:nth-child(3) {\n\t\ttext-align: right;\n\t}\n</style>\n\n\n<!-- Javascript -->\n<script>\n\tsi_std = {\n\t\tprint_item_table: function() {\n\t\t\tvar table = print_table(\n\t\t\t\t'Purchase Order',\n\t\t\t\tdoc.name,\n\t\t\t\t'po_details',\n\t\t\t\t'Purchase Order Item',\n\t\t\t\t[// Here specify the table columns to be displayed\n\t\t\t\t\t'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',\n\t\t\t\t\t'import_rate', 'import_amount'\n\t\t\t\t],\n\t\t\t\t[// Here specify the labels of column headings\n\t\t\t\t\t'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',\n\t\t\t\t\t'UoM', 'Basic Rate', 'Amount'\n\t\t\t\t],\n\t\t\t\t[// Here specify the column widths\n\t\t\t\t\t'3%', '10%', '15%', '32%', '5%',\n\t\t\t\t\t'5%', '15%', '15%'\n\t\t\t\t]\n\t\t\t);\n\n\t\t\t// This code takes care of page breaks\n\t\t\tif(table.appendChild) {\n\t\t\t\tout = table.innerHTML;\n\t\t\t} else {\n\t\t\t\tout = '';\n\t\t\t\tfor(var i=0; i < (table.length-1); i++) {\n\t\t\t\t\tout += table[i].innerHTML + \n\t\t\t\t\t\t'<div style = \"page-break-after: always;\" \\\n\t\t\t\t\t\tclass = \"page_break\"></div>\\\n\t\t\t\t\t\t<div class=\"page-settings\"></div>';\n\t\t\t\t}\n\t\t\t\tout += table[table.length-1].innerHTML;\n\t\t\t}\n\t\t\treturn out;\n\t\t},\n\n\n\t\tprint_other_charges: function(parent) {\n\t\t\tvar oc = getchildren('Purchase Taxes and Charges', doc.name, 'purchase_tax_details');\n\t\t\tvar rows = '<table width=100%>\\n';\n\t\t\tfor(var i=0; i<oc.length; i++) {\n\t\t\t\trows +=\n\t\t\t\t\t'<tr>\\n' +\n\t\t\t\t\t\t'\\t<td>' + oc[i].description + '</td>\\n' + \n\t\t\t\t\t\t'\\t<td style=\"width: 38%; text-align: right;\">' + format_currency(oc[i].tax_amount / (doc.conversion_rate || 1), doc.currency) + '</td>\\n' +\n\t\t\t\t\t'</tr>\\n';\n\t\t\t}\n\t\t\treturn rows + '</table>\\n';\n\t\t}\n\t};\n</script>\n\n\n<!-- Page Layout Settings -->\n<div class='common page-header'>\n\t<!-- \n\t\tPage Header will contain\n\t\t\t+ table 1\n\t\t\t\t+ table 1a\n\t\t\t\t\t- Name\n\t\t\t\t\t- Address\n\t\t\t\t\t- Contact\n\t\t\t\t\t- Mobile No\n\t\t\t\t+ table 1b\n\t\t\t\t\t- Voucher Date\n\t\t\t\t\t- Due Date\n\t-->\n\t<table class='header-table' cellspacing=0>\n\t\t<thead>\n\t\t\t<tr><td colspan=2><script>'<h1>' + (doc.select_print_heading || 'Purchase Order') + '</h1>'</script></td></tr>\n\t\t\t<tr><td colspan=2><h3><script>cur_frm.docname</script></h3></td></tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td width=60%><table width=100% cellspacing=0><tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td width=22%><b>Name</b></td>\n\t\t\t\t\t\t<td><script>doc.supplier_name</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><b>Address</b></td>\n\t\t\t\t\t\t<td><script>replace_newlines(doc.address_display)</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><b>Contact</b></td>\n\t\t\t\t\t\t<td><script>doc.contact_display</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody></table></td>\n\t\t\t\t<td><table width=100% cellspacing=0><tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td width=63%><b>Purchase Order Date</b></td>\n\t\t\t\t\t\t<td><script>date.str_to_user(doc.transaction_date)</script></td>\n\t\t\t\t\t<tr>\t\t\t\t\t\n\t\t\t\t</tbody></table></td>\n\t\t\t</tr>\n\t\t</tbody>\n\t\t<tfoot>\n\t\t\n\t\t</tfoot>\n\t</table>\n</div>\n<div class='common page-body'>\n\t<!-- \n\t\tPage Body will contain\n\t\t\t+ table 2\n\t\t\t\t- Sales Invoice Data\n\t-->\n\t<script>si_std.print_item_table()</script>\n</div>\n<div class='common page-footer'>\n\t<!-- \n\t\tPage Footer will contain\n\t\t\t+ table 3\n\t\t\t\t- Terms and Conditions\n\t\t\t\t- Total Rounded Amount Calculation\n\t\t\t\t- Total Rounded Amount in Words\n\t-->\n\t<table class='footer-table' width=100% cellspacing=0>\n\t\t<thead>\n\t\t\t\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td width=60% style='padding-right: 10px;'>\n\t\t\t\t\t<b>Terms, Conditions & Other Information:</b><br />\n\t\t\t\t\t<script>doc.terms</script>\n\t\t\t\t</td>\n\t\t\t\t<td>\n\t\t\t\t\t<table cellspacing=0 width=100%><tbody>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>Net Total</td>\n\t\t\t\t\t\t\t<td style=\"width: 38%; text-align: right;\"><script>\n\t\t\t\t\t\t\t\tformat_currency(doc.net_total_import, doc.currency)\n\t\t\t\t\t\t\t</script></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>\n\t\t\t\t\t\t<tr style='font-weight: bold'>\n\t\t\t\t\t\t\t<td>Grand Total</td>\n\t\t\t\t\t\t\t<td style=\"width: 38%; text-align: right;\"><script>\n\t\t\t\t\t\t\t\tformat_currency(doc.grand_total_import, doc.currency)\n\t\t\t\t\t\t\t</script></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody></table>\n\t\t\t\t\t<br /><b>In Words</b><br />\n\t\t\t\t\t<i><script>doc.in_words_import</script></i>\n\t\t\t\t</td>\n\t\t\t</tr>\t\t\n\t\t</tbody>\n\t\t<tfoot>\n\t\t\n\t\t</tfoot>\n\t</table>\n</div>\n",
+ "html": "<!--\n\tSample Print Format for ERPNext\n\tPlease use at your own discretion\n\tFor suggestions and contributions:\n\t\thttps://github.com/webnotes/erpnext-print-templates\n\n\tFreely usable under MIT license\n-->\n\n<!-- Style Settings -->\n<style>\n\t/*\n\t\tcommon style for whole page\n\t\tThis should include:\n\t\t+ page size related settings\n\t\t+ font family settings\n\t\t+ line spacing settings\n\t*/\n\t@media screen {\n\t\tbody {\n\t\t\twidth: 8.3in;\n\t\t}\n\t}\n\n\thtml, body, div, span, td {\n\t\tfont-family: \"Arial\", sans-serif;\n\t\tfont-size: 12px;\n\t}\n\n\tbody {\n\t\tpadding: 10px;\n\t\tmargin: auto;\n\t\tfont-size: 12px;\n\t}\n\n\t.common {\n\t\tfont-family: \"Arial\", sans-serif !important;\n\t\tfont-size: 12px;\n\t\tpadding: 0px;\n\t}\n\n\ttable {\n\t\twidth: 100% !important;\n\t\tvertical-align: top;\n\t}\n\n\ttable td {\n\t\tpadding: 2px 0px;\n\t}\n\n\ttable, td {\n\t\tborder-collapse: collapse !important;\n\t\tpadding: 0px;\n\t\tmargin: 0px !important;\n\t}\n\t\n\ttable h1, h2, h3, h4, h5, h6 {\n\t\tpadding: 0px;\n\t\tmargin: 0px;\n\t}\n\n\ttable.header-table td {\n\t\tvertical-align: top;\n\t}\n\n\ttable.header-table h3 {\n\t\tcolor: gray;\n\t}\n\n\ttable.header-table thead td {\n\t\tpadding: 5px;\n\t}\n\n\ttable.header-table > thead,\n\ttable.header-table > tbody > tr > td,\n\ttable.footer-table > tbody > tr > td {\n\t\tborder: 1px solid black;\n\t\tpadding: 5px;\n\t}\n\n\ttable.footer-table > tbody,\n\ttable.header-table > thead {\n\t\tborder-bottom: 3px solid black;\n\t}\n\n\ttable.header-table > thead {\n\t\tborder-top: 3px solid black;\n\t}\n\n\tdiv.page-body table td:nth-child(6),\n\tdiv.page-body table td:nth-child(7) {\n\t\ttext-align: right;\n\t}\n\n\tdiv.page-body td {\n\t\tbackground-color: white !important;\n\t\tborder: 1px solid black !important;\n\t}\n\n\ttable.footer-table td {\n\t\tvertical-align: top;\n\t}\n\n\ttable.footer-table td table td:nth-child(2),\n\ttable.footer-table td table td:nth-child(3) {\n\t\ttext-align: right;\n\t}\n</style>\n\n\n<!-- Javascript -->\n<script>\n\tsi_std = {\n\t\tprint_item_table: function() {\n\t\t\tvar table = print_table(\n\t\t\t\t'Purchase Order',\n\t\t\t\tdoc.name,\n\t\t\t\t'po_details',\n\t\t\t\t'Purchase Order Item',\n\t\t\t\t[// Here specify the table columns to be displayed\n\t\t\t\t\t'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',\n\t\t\t\t\t'import_rate', 'import_amount'\n\t\t\t\t],\n\t\t\t\t[// Here specify the labels of column headings\n\t\t\t\t\t'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',\n\t\t\t\t\t'UoM', 'Basic Rate', 'Amount'\n\t\t\t\t],\n\t\t\t\t[// Here specify the column widths\n\t\t\t\t\t'3%', '10%', '15%', '32%', '5%',\n\t\t\t\t\t'5%', '15%', '15%'\n\t\t\t\t]\n\t\t\t);\n\n\t\t\t// This code takes care of page breaks\n\t\t\tif(table.appendChild) {\n\t\t\t\tout = table.innerHTML;\n\t\t\t} else {\n\t\t\t\tout = '';\n\t\t\t\tfor(var i=0; i < (table.length-1); i++) {\n\t\t\t\t\tout += table[i].innerHTML + \n\t\t\t\t\t\t'<div style = \"page-break-after: always;\" \\\n\t\t\t\t\t\tclass = \"page_break\"></div>\\\n\t\t\t\t\t\t<div class=\"page-settings\"></div>';\n\t\t\t\t}\n\t\t\t\tout += table[table.length-1].innerHTML;\n\t\t\t}\n\t\t\treturn out;\n\t\t},\n\n\n\t\tprint_other_charges: function(parent) {\n\t\t\tvar oc = getchildren('Purchase Taxes and Charges', doc.name, 'other_charges');\n\t\t\tvar rows = '<table width=100%>\\n';\n\t\t\tfor(var i=0; i<oc.length; i++) {\n\t\t\t\trows +=\n\t\t\t\t\t'<tr>\\n' +\n\t\t\t\t\t\t'\\t<td>' + oc[i].description + '</td>\\n' + \n\t\t\t\t\t\t'\\t<td style=\"width: 38%; text-align: right;\">' + format_currency(oc[i].tax_amount / (doc.conversion_rate || 1), doc.currency) + '</td>\\n' +\n\t\t\t\t\t'</tr>\\n';\n\t\t\t}\n\t\t\treturn rows + '</table>\\n';\n\t\t}\n\t};\n</script>\n\n\n<!-- Page Layout Settings -->\n<div class='common page-header'>\n\t<!-- \n\t\tPage Header will contain\n\t\t\t+ table 1\n\t\t\t\t+ table 1a\n\t\t\t\t\t- Name\n\t\t\t\t\t- Address\n\t\t\t\t\t- Contact\n\t\t\t\t\t- Mobile No\n\t\t\t\t+ table 1b\n\t\t\t\t\t- Voucher Date\n\t\t\t\t\t- Due Date\n\t-->\n\t<table class='header-table' cellspacing=0>\n\t\t<thead>\n\t\t\t<tr><td colspan=2><script>'<h1>' + (doc.select_print_heading || 'Purchase Order') + '</h1>'</script></td></tr>\n\t\t\t<tr><td colspan=2><h3><script>cur_frm.docname</script></h3></td></tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td width=60%><table width=100% cellspacing=0><tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td width=22%><b>Name</b></td>\n\t\t\t\t\t\t<td><script>doc.supplier_name</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><b>Address</b></td>\n\t\t\t\t\t\t<td><script>replace_newlines(doc.address_display)</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><b>Contact</b></td>\n\t\t\t\t\t\t<td><script>doc.contact_display</script></td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody></table></td>\n\t\t\t\t<td><table width=100% cellspacing=0><tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td width=63%><b>Purchase Order Date</b></td>\n\t\t\t\t\t\t<td><script>date.str_to_user(doc.transaction_date)</script></td>\n\t\t\t\t\t<tr>\t\t\t\t\t\n\t\t\t\t</tbody></table></td>\n\t\t\t</tr>\n\t\t</tbody>\n\t\t<tfoot>\n\t\t\n\t\t</tfoot>\n\t</table>\n</div>\n<div class='common page-body'>\n\t<!-- \n\t\tPage Body will contain\n\t\t\t+ table 2\n\t\t\t\t- Sales Invoice Data\n\t-->\n\t<script>si_std.print_item_table()</script>\n</div>\n<div class='common page-footer'>\n\t<!-- \n\t\tPage Footer will contain\n\t\t\t+ table 3\n\t\t\t\t- Terms and Conditions\n\t\t\t\t- Total Rounded Amount Calculation\n\t\t\t\t- Total Rounded Amount in Words\n\t-->\n\t<table class='footer-table' width=100% cellspacing=0>\n\t\t<thead>\n\t\t\t\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td width=60% style='padding-right: 10px;'>\n\t\t\t\t\t<b>Terms, Conditions & Other Information:</b><br />\n\t\t\t\t\t<script>doc.terms</script>\n\t\t\t\t</td>\n\t\t\t\t<td>\n\t\t\t\t\t<table cellspacing=0 width=100%><tbody>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>Net Total</td>\n\t\t\t\t\t\t\t<td style=\"width: 38%; text-align: right;\"><script>\n\t\t\t\t\t\t\t\tformat_currency(doc.net_total_import, doc.currency)\n\t\t\t\t\t\t\t</script></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>\n\t\t\t\t\t\t<tr style='font-weight: bold'>\n\t\t\t\t\t\t\t<td>Grand Total</td>\n\t\t\t\t\t\t\t<td style=\"width: 38%; text-align: right;\"><script>\n\t\t\t\t\t\t\t\tformat_currency(doc.grand_total_import, doc.currency)\n\t\t\t\t\t\t\t</script></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody></table>\n\t\t\t\t\t<br /><b>In Words</b><br />\n\t\t\t\t\t<i><script>doc.in_words_import</script></i>\n\t\t\t\t</td>\n\t\t\t</tr>\t\t\n\t\t</tbody>\n\t\t<tfoot>\n\t\t\n\t\t</tfoot>\n\t</table>\n</div>\n",
"module": "Buying",
"name": "__common__",
"print_format_type": "Client",
diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.js b/erpnext/buying/doctype/purchase_common/purchase_common.js
index d01627a..039165f 100644
--- a/erpnext/buying/doctype/purchase_common/purchase_common.js
+++ b/erpnext/buying/doctype/purchase_common/purchase_common.js
@@ -62,14 +62,13 @@
},
supplier: function() {
+ var me = this;
if(this.frm.doc.supplier || this.frm.doc.credit_to) {
if(!this.frm.doc.company) {
this.frm.set_value("supplier", null);
msgprint(wn._("Please specify Company"));
} else {
- var me = this;
var buying_price_list = this.frm.doc.buying_price_list;
-
return this.frm.call({
doc: this.frm.doc,
method: "set_supplier_defaults",
@@ -77,6 +76,8 @@
callback: function(r) {
if(!r.exc) {
if(me.frm.doc.buying_price_list !== buying_price_list) me.buying_price_list();
+ if (me.frm.doc.taxes_and_charges)
+ me.frm.script_manager.trigger("taxes_and_charges")
}
}
});
@@ -241,21 +242,6 @@
}
},
- purchase_other_charges: function() {
- var me = this;
- if(this.frm.doc.purchase_other_charges) {
- return this.frm.call({
- doc: this.frm.doc,
- method: "get_purchase_tax_details",
- callback: function(r) {
- if(!r.exc) {
- me.calculate_taxes_and_totals();
- }
- }
- });
- }
- },
-
calculate_taxes_and_totals: function() {
this._super();
this.calculate_total_advance("Purchase Invoice", "advance_allocation_details");
@@ -398,13 +384,6 @@
}
},
- show_item_wise_taxes: function() {
- if(this.frm.fields_dict.tax_calculation) {
- $(this.get_item_wise_taxes_html())
- .appendTo($(this.frm.fields_dict.tax_calculation.wrapper).empty());
- }
- },
-
change_form_labels: function(company_currency) {
var me = this;
var field_label_map = {};
@@ -499,4 +478,4 @@
});
var tname = cur_frm.cscript.tname;
-var fname = cur_frm.cscript.fname;
+var fname = cur_frm.cscript.fname;
\ No newline at end of file
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js
index edf7c82..5213885 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.js
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.js
@@ -5,7 +5,7 @@
cur_frm.cscript.tname = "Purchase Order Item";
cur_frm.cscript.fname = "po_details";
-cur_frm.cscript.other_fname = "purchase_tax_details";
+cur_frm.cscript.other_fname = "other_charges";
{% include 'buying/doctype/purchase_common/purchase_common.js' %};
{% include 'accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js' %}
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.txt b/erpnext/buying/doctype/purchase_order/purchase_order.txt
index 2790e41..2dbafd2 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.txt
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-21 16:16:39",
"docstatus": 0,
- "modified": "2014-01-20 17:49:08",
+ "modified": "2014-01-29 15:26:21",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -299,7 +299,7 @@
"doctype": "DocField",
"fieldname": "taxes",
"fieldtype": "Section Break",
- "label": "Taxes",
+ "label": "Taxes and Charges",
"oldfieldtype": "Section Break",
"options": "icon-money",
"print_hide": 0
@@ -307,9 +307,9 @@
{
"description": "If you have created a standard template in Purchase Taxes and Charges Master, select one and click on the button below.",
"doctype": "DocField",
- "fieldname": "purchase_other_charges",
+ "fieldname": "taxes_and_charges",
"fieldtype": "Link",
- "label": "Tax Master",
+ "label": "Taxes and Charges",
"no_copy": 0,
"oldfieldname": "purchase_other_charges",
"oldfieldtype": "Link",
@@ -318,7 +318,7 @@
},
{
"doctype": "DocField",
- "fieldname": "purchase_tax_details",
+ "fieldname": "other_charges",
"fieldtype": "Table",
"label": "Purchase Taxes and Charges",
"no_copy": 0,
@@ -328,9 +328,9 @@
},
{
"doctype": "DocField",
- "fieldname": "tax_calculation",
+ "fieldname": "other_charges_calculation",
"fieldtype": "HTML",
- "label": "Tax Calculation",
+ "label": "Taxes and Charges Calculation",
"no_copy": 1,
"oldfieldtype": "HTML",
"print_hide": 1
@@ -699,6 +699,7 @@
"write": 1
},
{
+ "cancel": 0,
"delete": 0,
"doctype": "DocPerm",
"role": "Supplier"
diff --git a/erpnext/buying/doctype/supplier/supplier.txt b/erpnext/buying/doctype/supplier/supplier.txt
index 5c305f5..a5d100f 100644
--- a/erpnext/buying/doctype/supplier/supplier.txt
+++ b/erpnext/buying/doctype/supplier/supplier.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-01-10 16:34:11",
"docstatus": 0,
- "modified": "2014-01-20 17:49:29",
+ "modified": "2014-01-28 19:05:55",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -159,6 +159,14 @@
},
{
"doctype": "DocField",
+ "fieldname": "default_currency",
+ "fieldtype": "Link",
+ "label": "Default Currency",
+ "no_copy": 1,
+ "options": "Currency"
+ },
+ {
+ "doctype": "DocField",
"fieldname": "default_price_list",
"fieldtype": "Link",
"label": "Price List",
@@ -166,11 +174,10 @@
},
{
"doctype": "DocField",
- "fieldname": "default_currency",
+ "fieldname": "default_taxes_and_charges",
"fieldtype": "Link",
- "label": "Default Currency",
- "no_copy": 1,
- "options": "Currency"
+ "label": "Taxes and Charges",
+ "options": "Purchase Taxes and Charges Master"
},
{
"doctype": "DocField",
diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
index bc56abd..562e69d 100644
--- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
+++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
@@ -4,7 +4,7 @@
// define defaults for purchase common
cur_frm.cscript.tname = "Supplier Quotation Item";
cur_frm.cscript.fname = "quotation_items";
-cur_frm.cscript.other_fname = "purchase_tax_details";
+cur_frm.cscript.other_fname = "other_charges";
// attach required files
{% include 'buying/doctype/purchase_common/purchase_common.js' %};
diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.txt b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.txt
index e1441e5..0a4a3ec 100644
--- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.txt
+++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-21 16:16:45",
"docstatus": 0,
- "modified": "2014-01-20 17:49:29",
+ "modified": "2014-01-29 15:25:52",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -290,16 +290,16 @@
"doctype": "DocField",
"fieldname": "taxes",
"fieldtype": "Section Break",
- "label": "Taxes",
+ "label": "Taxes and Charges",
"oldfieldtype": "Section Break",
"options": "icon-money"
},
{
"description": "If you have created a standard template in Purchase Taxes and Charges Master, select one and click on the button below.",
"doctype": "DocField",
- "fieldname": "purchase_other_charges",
+ "fieldname": "taxes_and_charges",
"fieldtype": "Link",
- "label": "Purchase Taxes and Charges",
+ "label": "Taxes and Charges",
"no_copy": 1,
"oldfieldname": "purchase_other_charges",
"oldfieldtype": "Link",
@@ -308,7 +308,7 @@
},
{
"doctype": "DocField",
- "fieldname": "purchase_tax_details",
+ "fieldname": "other_charges",
"fieldtype": "Table",
"label": "Purchase Taxes and Charges",
"no_copy": 0,
@@ -318,9 +318,9 @@
},
{
"doctype": "DocField",
- "fieldname": "tax_calculation",
+ "fieldname": "other_charges_calculation",
"fieldtype": "HTML",
- "label": "Tax Calculation",
+ "label": "Taxes and Charges Calculation",
"no_copy": 1,
"oldfieldtype": "HTML",
"print_hide": 1
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 937449c..2e05903 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -130,6 +130,10 @@
})
self.doclist.append(tax)
+
+ def get_other_charges(self):
+ self.doclist = self.doc.clear_table(self.doclist, "other_charges")
+ self.set_taxes("other_charges", "taxes_and_charges")
def calculate_taxes_and_totals(self):
self.discount_amount_applied = False
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index 83b5909..7ef771a 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -38,7 +38,7 @@
self.set_missing_item_details(get_item_details)
if self.doc.fields.get("__islocal"):
- self.set_taxes("purchase_tax_details", "purchase_other_charges")
+ self.set_taxes("other_charges", "taxes_and_charges")
def set_supplier_from_item_default(self):
if self.meta.get_field("supplier") and not self.doc.supplier:
@@ -57,14 +57,10 @@
for w in warehouses:
validate_warehouse_company(w, self.doc.company)
- def get_purchase_tax_details(self):
- self.doclist = self.doc.clear_table(self.doclist, "purchase_tax_details")
- self.set_taxes("purchase_tax_details", "purchase_other_charges")
-
def validate_stock_or_nonstock_items(self):
if not self.get_stock_items():
tax_for_valuation = [d.account_head for d in
- self.doclist.get({"parentfield": "purchase_tax_details"})
+ self.doclist.get({"parentfield": "other_charges"})
if d.category in ["Valuation", "Valuation and Total"]]
if tax_for_valuation:
webnotes.msgprint(_("""Tax Category can not be 'Valuation' or 'Valuation and Total' as all items are non-stock items"""), raise_exception=1)
@@ -79,7 +75,7 @@
self.doc.currency)
def calculate_taxes_and_totals(self):
- self.other_fname = "purchase_tax_details"
+ self.other_fname = "other_charges"
super(BuyingController, self).calculate_taxes_and_totals()
self.calculate_total_advance("Purchase Invoice", "advance_allocation_details")
@@ -203,7 +199,7 @@
last_stock_item_idx = d.idx
total_valuation_amount = sum([flt(d.tax_amount) for d in
- self.doclist.get({"parentfield": "purchase_tax_details"})
+ self.doclist.get({"parentfield": "other_charges"})
if d.category in ["Valuation", "Valuation and Total"]])
diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py
index 52dcaaa..bcfe0bc 100644
--- a/erpnext/controllers/selling_controller.py
+++ b/erpnext/controllers/selling_controller.py
@@ -30,7 +30,7 @@
self.set_missing_lead_customer_details()
self.set_price_list_and_item_details()
if self.doc.fields.get("__islocal"):
- self.set_taxes("other_charges", "charge")
+ self.set_taxes("other_charges", "taxes_and_charges")
def set_missing_lead_customer_details(self):
if self.doc.customer:
@@ -50,10 +50,6 @@
self.set_price_list_currency("Selling")
self.set_missing_item_details(get_item_details)
- def get_other_charges(self):
- self.doclist = self.doc.clear_table(self.doclist, "other_charges")
- self.set_taxes("other_charges", "charge")
-
def apply_shipping_rule(self):
if self.doc.shipping_rule:
shipping_rule = webnotes.bean("Shipping Rule", self.doc.shipping_rule)
diff --git a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.js b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.js
index 649c35d..59bf829 100644
--- a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.js
+++ b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.js
@@ -1,31 +1,27 @@
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
-cur_frm.cscript.onload = function(doc,dt,dn){
- if(!doc.posting_date) set_multiple(dt,dn,{posting_date:get_today()});
- if(!doc.leave_transaction_type) set_multiple(dt,dn,{leave_transaction_type:'Allocation'});
-
+cur_frm.cscript.onload = function(doc, dt, dn){
+ if(!doc.posting_date)
+ set_multiple(dt, dn, {posting_date: get_today()});
+ if(!doc.leave_transaction_type)
+ set_multiple(dt, dn, {leave_transaction_type: 'Allocation'});
}
-
-// Validation For To Date
-// ================================================================================================
cur_frm.cscript.to_date = function(doc, cdt, cdn) {
- return $c('runserverobj', args={'method':'to_date_validation','docs':wn.model.compress(make_doclist(doc.doctype, doc.name))},
- function(r, rt) {
- var doc = locals[cdt][cdn];
- if (r.message) {
- alert(wn._("To date cannot be before from date"));
- doc.to_date = '';
- refresh_field('to_date');
- }
- }
- );
+ return $c('runserverobj', args={'method':'to_date_validation','docs':wn.model.compress(make_doclist(doc.doctype, doc.name))},
+ function(r, rt) {
+ var doc = locals[cdt][cdn];
+ if (r.message) {
+ msgprint(wn._("To date cannot be before from date"));
+ doc.to_date = '';
+ refresh_field('to_date');
+ }
+ }
+ );
}
-// Allocation Type
-// ================================================================================================
cur_frm.cscript.allocation_type = function (doc, cdt, cdn){
- doc.no_of_days = '';
- refresh_field('no_of_days');
-}
+ doc.no_of_days = '';
+ refresh_field('no_of_days');
+}
\ No newline at end of file
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 79644a8..3eb69fd 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -3,20 +3,17 @@
erpnext.patches.4_0.move_warehouse_user_to_restrictions
erpnext.patches.4_0.new_permissions
erpnext.patches.4_0.update_incharge_name_to_sales_person_in_maintenance_schedule
-execute:webnotes.reload_doc('accounts', 'doctype', 'sales_invoice') # 2014-01-03
-execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2014-01-03
-execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2014-01-03
-execute:webnotes.reload_doc('stock', 'doctype', 'delivery_note') # 2014-01-03
-execute:webnotes.reload_doc('accounts', 'Print Format', 'POS Invoice') # 2014-01-03
-execute:webnotes.reload_doc('accounts', 'Print Format', 'Sales Invoice Classic') # 2014-01-03
-execute:webnotes.reload_doc('accounts', 'Print Format', 'Sales Invoice Modern') # 2014-01-03
-execute:webnotes.reload_doc('accounts', 'Print Format', 'Sales Invoice Spartan') # 2014-01-03
-execute:webnotes.reload_doc('selling', 'Print Format', 'Quotation Classic') # 2014-01-03
-execute:webnotes.reload_doc('selling', 'Print Format', 'Quotation Modern') # 2014-01-03
-execute:webnotes.reload_doc('selling', 'Print Format', 'Quotation Spartan') # 2014-01-03
-execute:webnotes.reload_doc('selling', 'Print Format', 'Sales Order Classic') # 2014-01-03
-execute:webnotes.reload_doc('selling', 'Print Format', 'Sales Order Modern') # 2014-01-03
-execute:webnotes.reload_doc('selling', 'Print Format', 'Sales Order Spartan') # 2014-01-03
-execute:webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Classic') # 2014-01-03
-execute:webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Modern') # 2014-01-03
-execute:webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Spartan') # 2014-01-03
\ No newline at end of file
+execute:webnotes.reload_doc('accounts', 'doctype', 'sales_invoice') # 2014-01-29
+execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2014-01-29
+execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2014-01-29
+execute:webnotes.reload_doc('stock', 'doctype', 'delivery_note') # 2014-01-29
+erpnext.patches.4_0.reload_sales_print_format
+execute:webnotes.reload_doc('accounts', 'doctype', 'purchase_invoice') # 2014-01-29
+execute:webnotes.reload_doc('buying', 'doctype', 'purchase_order') # 2014-01-29
+execute:webnotes.reload_doc('buying', 'doctype', 'supplier_quotation') # 2014-01-29
+execute:webnotes.reload_doc('stock', 'doctype', 'purchase_receipt') # 2014-01-29
+erpnext.patches.4_0.reload_purchase_print_format
+execute:webnotes.reload_doc('accounts', 'doctype', 'pos_setting') # 2014-01-29
+execute:webnotes.reload_doc('selling', 'doctype', 'customer') # 2014-01-29
+execute:webnotes.reload_doc('buying', 'doctype', 'supplier') # 2014-01-29
+erpnext.patches.4_0.map_charge_to_taxes_and_charges
\ No newline at end of file
diff --git a/erpnext/patches/4_0/map_charge_to_taxes_and_charges.py b/erpnext/patches/4_0/map_charge_to_taxes_and_charges.py
new file mode 100644
index 0000000..fc51c2a
--- /dev/null
+++ b/erpnext/patches/4_0/map_charge_to_taxes_and_charges.py
@@ -0,0 +1,20 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+def execute():
+ # udpate sales cycle
+ webnotes.conn.sql("""update `tabSales Invoice` set taxes_and_charges=charge""")
+ webnotes.conn.sql("""update `tabSales Order` set taxes_and_charges=charge""")
+ webnotes.conn.sql("""update `tabQuotation` set taxes_and_charges=charge""")
+ webnotes.conn.sql("""update `tabDelivery Note` set taxes_and_charges=charge""")
+
+ # udpate purchase cycle
+ webnotes.conn.sql("""update `tabPurchase Invoice` set taxes_and_charges=purchase_other_charges""")
+ webnotes.conn.sql("""update `tabPurchase Order` set taxes_and_charges=purchase_other_charges""")
+ webnotes.conn.sql("""update `tabSupplier Quotation` set taxes_and_charges=purchase_other_charges""")
+ webnotes.conn.sql("""update `tabPurchase Receipt` set taxes_and_charges=purchase_other_charges""")
+
+ webnotes.conn.sql("""update `tabPurchase Taxes and Charges` set parentfield='other_charges'""")
\ No newline at end of file
diff --git a/erpnext/patches/4_0/reload_purchase_print_format.py b/erpnext/patches/4_0/reload_purchase_print_format.py
new file mode 100644
index 0000000..83f95c0
--- /dev/null
+++ b/erpnext/patches/4_0/reload_purchase_print_format.py
@@ -0,0 +1,10 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+def execute():
+ webnotes.reload_doc('buying', 'Print Format', 'Purchase Order Classic')
+ webnotes.reload_doc('buying', 'Print Format', 'Purchase Order Modern')
+ webnotes.reload_doc('buying', 'Print Format', 'Purchase Order Spartan')
\ No newline at end of file
diff --git a/erpnext/patches/4_0/reload_sales_print_format.py b/erpnext/patches/4_0/reload_sales_print_format.py
new file mode 100644
index 0000000..f4cf446
--- /dev/null
+++ b/erpnext/patches/4_0/reload_sales_print_format.py
@@ -0,0 +1,20 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+def execute():
+ webnotes.reload_doc('accounts', 'Print Format', 'POS Invoice')
+ webnotes.reload_doc('accounts', 'Print Format', 'Sales Invoice Classic')
+ webnotes.reload_doc('accounts', 'Print Format', 'Sales Invoice Modern')
+ webnotes.reload_doc('accounts', 'Print Format', 'Sales Invoice Spartan')
+ webnotes.reload_doc('selling', 'Print Format', 'Quotation Classic')
+ webnotes.reload_doc('selling', 'Print Format', 'Quotation Modern')
+ webnotes.reload_doc('selling', 'Print Format', 'Quotation Spartan')
+ webnotes.reload_doc('selling', 'Print Format', 'Sales Order Classic')
+ webnotes.reload_doc('selling', 'Print Format', 'Sales Order Modern')
+ webnotes.reload_doc('selling', 'Print Format', 'Sales Order Spartan')
+ webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Classic')
+ webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Modern')
+ webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Spartan')
\ No newline at end of file
diff --git a/erpnext/patches/patch_list.py b/erpnext/patches/patch_list.py
index 6e27628..5c83ce1 100644
--- a/erpnext/patches/patch_list.py
+++ b/erpnext/patches/patch_list.py
@@ -271,4 +271,6 @@
"execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2013-12-26",
"execute:webnotes.reload_doc('stock', 'doctype', 'delivery_note') # 2013-12-26",
"patches.1401.enable_all_price_list",
+ "patches.1401.fix_serial_no_status_and_warehouse",
+ "patches.1401.fix_planned_qty",
]
\ No newline at end of file
diff --git a/erpnext/public/js/queries.js b/erpnext/public/js/queries.js
index dbaa27d..dab5828 100644
--- a/erpnext/public/js/queries.js
+++ b/erpnext/public/js/queries.js
@@ -7,35 +7,35 @@
profile: function() {
return { query: "webnotes.core.doctype.profile.profile.profile_query" };
},
-
+
lead: function() {
return { query: "erpnext.controllers.queries.lead_query" };
},
-
+
customer: function() {
return { query: "erpnext.controllers.queries.customer_query" };
},
-
+
supplier: function() {
return { query: "erpnext.controllers.queries.supplier_query" };
},
-
+
account: function() {
return { query: "erpnext.controllers.queries.account_query" };
},
-
+
item: function() {
return { query: "erpnext.controllers.queries.item_query" };
},
-
+
bom: function() {
return { query: "erpnext.controllers.queries.bom" };
},
-
+
task: function() {
- return { query: "projects.utils.query_task" };
+ return { query: "erpnext.projects.utils.query_task" };
},
-
+
customer_filter: function(doc) {
if(!doc.customer) {
wn.throw(wn._("Please specify a") + " " +
@@ -44,7 +44,7 @@
return { filters: { customer: doc.customer } };
},
-
+
supplier_filter: function(doc) {
if(!doc.supplier) {
wn.throw(wn._("Please specify a") + " " +
@@ -53,9 +53,17 @@
return { filters: { supplier: doc.supplier } };
},
-
+
+ lead_filter: function(doc) {
+ if(!doc.lead) {
+ wn.throw(wn._("Please specify a") + " " +
+ wn._(wn.meta.get_label(doc.doctype, "lead", doc.name)));
+ }
+
+ return { filters: { lead: doc.lead } };
+ },
+
not_a_group_filter: function() {
return { filters: { is_group: "No" } };
},
-
});
\ No newline at end of file
diff --git a/erpnext/public/js/transaction.js b/erpnext/public/js/transaction.js
index 0dfdd07..24fc332 100644
--- a/erpnext/public/js/transaction.js
+++ b/erpnext/public/js/transaction.js
@@ -708,4 +708,26 @@
});
}
},
+
+ taxes_and_charges: function() {
+ var me = this;
+ if(this.frm.doc.taxes_and_charges) {
+ return this.frm.call({
+ doc: this.frm.doc,
+ method: "get_other_charges",
+ callback: function(r) {
+ if(!r.exc) {
+ me.calculate_taxes_and_totals();
+ }
+ }
+ });
+ }
+ },
+
+ show_item_wise_taxes: function() {
+ if(this.frm.fields_dict.other_charges_calculation) {
+ $(this.get_item_wise_taxes_html())
+ .appendTo($(this.frm.fields_dict.other_charges_calculation.wrapper).empty());
+ }
+ },
});
\ No newline at end of file
diff --git a/erpnext/selling/doctype/customer/customer.txt b/erpnext/selling/doctype/customer/customer.txt
index 6eabaf0..c6c0e9f 100644
--- a/erpnext/selling/doctype/customer/customer.txt
+++ b/erpnext/selling/doctype/customer/customer.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-06-11 14:26:44",
"docstatus": 0,
- "modified": "2014-01-20 17:48:32",
+ "modified": "2014-01-28 19:06:18",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -26,6 +26,7 @@
"parenttype": "DocType"
},
{
+ "cancel": 0,
"doctype": "DocPerm",
"name": "__common__",
"parent": "Customer",
@@ -254,6 +255,14 @@
},
{
"doctype": "DocField",
+ "fieldname": "default_taxes_and_charges",
+ "fieldtype": "Link",
+ "label": "Taxes and Charges",
+ "options": "Sales Taxes and Charges Master",
+ "permlevel": 0
+ },
+ {
+ "doctype": "DocField",
"fieldname": "credit_days",
"fieldtype": "Int",
"label": "Credit Days",
@@ -343,7 +352,6 @@
},
{
"amend": 0,
- "cancel": 0,
"create": 1,
"delete": 0,
"doctype": "DocPerm",
@@ -363,7 +371,6 @@
},
{
"amend": 0,
- "cancel": 0,
"create": 1,
"delete": 1,
"doctype": "DocPerm",
diff --git a/erpnext/selling/doctype/opportunity/opportunity.js b/erpnext/selling/doctype/opportunity/opportunity.js
index 396def8..538b05d 100644
--- a/erpnext/selling/doctype/opportunity/opportunity.js
+++ b/erpnext/selling/doctype/opportunity/opportunity.js
@@ -15,13 +15,13 @@
if(!this.frm.doc.enquiry_from)
hide_field(['customer', 'customer_address', 'contact_person', 'customer_name','lead', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']);
if(!this.frm.doc.status)
- set_multiple(cdt,cdn,{status:'Draft'});
+ set_multiple(cdt, cdn, { status:'Draft' });
if(!this.frm.doc.date)
this.frm.doc.transaction_date = date.obj_to_str(new Date());
if(!this.frm.doc.company && wn.defaults.get_default("company"))
- set_multiple(cdt,cdn,{company:wn.defaults.get_default("company")});
- if(!this.frm.doc.fiscal_year && sys_defaults.fiscal_year)
- set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year});
+ set_multiple(cdt, cdn, { company:wn.defaults.get_default("company") });
+ if(!this.frm.doc.fiscal_year && sys_defaults.fiscal_year)
+ set_multiple(cdt, cdn, { fiscal_year:sys_defaults.fiscal_year });
if(this.frm.doc.enquiry_from) {
if(this.frm.doc.enquiry_from == 'Customer') {
@@ -99,15 +99,15 @@
$.extend(cur_frm.cscript, new erpnext.selling.Opportunity({frm: cur_frm}));
-cur_frm.cscript.refresh = function(doc, cdt, cdn){
+cur_frm.cscript.refresh = function(doc, cdt, cdn) {
erpnext.hide_naming_series();
cur_frm.clear_custom_buttons();
if(doc.docstatus === 1 && doc.status!=="Lost") {
cur_frm.add_custom_button(wn._('Create Quotation'), cur_frm.cscript.create_quotation);
- if(doc.status!=="Quotation") {
+ if(doc.status!=="Quotation")
cur_frm.add_custom_button(wn._('Opportunity Lost'), cur_frm.cscript['Declare Opportunity Lost']);
- }
+
cur_frm.add_custom_button(wn._('Send SMS'), cur_frm.cscript.send_sms, "icon-mobile-phone");
}
@@ -116,31 +116,29 @@
}
cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
- if(doc.enquiry_from == 'Lead' && doc.lead) {
- cur_frm.cscript.lead(doc,cdt,cdn);
- }
+ if(doc.enquiry_from == 'Lead' && doc.lead)
+ cur_frm.cscript.lead(doc, cdt, cdn);
}
cur_frm.cscript.item_code = function(doc, cdt, cdn) {
var d = locals[cdt][cdn];
- if (d.item_code) {
- return get_server_fields('get_item_details',d.item_code, 'enquiry_details',doc, cdt,cdn,1);
- }
+ if (d.item_code)
+ return get_server_fields('get_item_details', d.item_code, 'enquiry_details', doc, cdt, cdn, 1);
}
// hide - unhide fields on basis of enquiry_from lead or customer
-cur_frm.cscript.enquiry_from = function(doc,cdt,cdn){
- cur_frm.cscript.lead_cust_show(doc,cdt,cdn);
+cur_frm.cscript.enquiry_from = function(doc, cdt, cdn) {
+ cur_frm.cscript.lead_cust_show(doc, cdt, cdn);
}
// hide - unhide fields based on lead or customer
-cur_frm.cscript.lead_cust_show = function(doc,cdt,cdn){
- if(doc.enquiry_from == 'Lead'){
+cur_frm.cscript.lead_cust_show = function(doc, cdt, cdn) {
+ if(doc.enquiry_from == 'Lead') {
unhide_field(['lead']);
hide_field(['customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
doc.lead = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
}
- else if(doc.enquiry_from == 'Customer'){
+ else if(doc.enquiry_from == 'Customer') {
unhide_field(['customer']);
hide_field(['lead', 'address_display', 'contact_display', 'contact_mobile',
'contact_email', 'territory', 'customer_group']);
@@ -164,15 +162,13 @@
wn.model.map_current_doc({
method: "erpnext.selling.doctype.lead.lead.make_opportunity",
source_name: cur_frm.doc.lead
- })
+ });
unhide_field(['customer_name', 'address_display','contact_mobile', 'customer_address',
- 'contact_email', 'territory']);
+ 'contact_email', 'territory']);
}
-
-
-cur_frm.cscript['Declare Opportunity Lost'] = function(){
+cur_frm.cscript['Declare Opportunity Lost'] = function() {
var dialog = new wn.ui.Dialog({
title: wn._("Set as Lost"),
fields: [
@@ -200,5 +196,4 @@
})
});
dialog.show();
-
}
\ No newline at end of file
diff --git a/erpnext/selling/doctype/quotation/quotation.js b/erpnext/selling/doctype/quotation/quotation.js
index bb2ce8c..b1f4394 100644
--- a/erpnext/selling/doctype/quotation/quotation.js
+++ b/erpnext/selling/doctype/quotation/quotation.js
@@ -15,12 +15,21 @@
erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({
onload: function(doc, dt, dn) {
+ var me = this;
this._super(doc, dt, dn);
if(doc.customer && !doc.quotation_to)
doc.quotation_to = "Customer";
else if(doc.lead && !doc.quotation_to)
doc.quotation_to = "Lead";
-
+
+ // to overwrite the customer_filter trigger from queries.js
+ if (doc.lead) {
+ $.each(["customer_address", "shipping_address_name"],
+ function(i, opts) {
+ me.frm.set_query(opts, erpnext.queries["lead_filter"]);
+ }
+ );
+ }
},
refresh: function(doc, dt, dn) {
this._super(doc, dt, dn);
@@ -68,6 +77,12 @@
quotation_to: function() {
this.frm.toggle_reqd("lead", this.frm.doc.quotation_to == "Lead");
this.frm.toggle_reqd("customer", this.frm.doc.quotation_to == "Customer");
+ if (this.frm.doc.quotation_to == "Lead") {
+ this.frm.set_value("customer", null);
+ this.frm.set_value("contact_person", null);
+ }
+ else if (this.frm.doc.quotation_to == "Customer")
+ this.frm.set_value("lead", null);
},
tc_name: function() {
@@ -90,7 +105,8 @@
cur_frm.script_manager.make(erpnext.selling.QuotationController);
cur_frm.fields_dict.lead.get_query = function(doc,cdt,cdn) {
- return{ query: "erpnext.controllers.queries.lead_query" } }
+ return{ query: "erpnext.controllers.queries.lead_query" }
+}
cur_frm.cscript.lead = function(doc, cdt, cdn) {
if(doc.lead) {
@@ -152,7 +168,6 @@
}
cur_frm.cscript.on_submit = function(doc, cdt, cdn) {
- if(cint(wn.boot.notification_settings.quotation)) {
+ if(cint(wn.boot.notification_settings.quotation))
cur_frm.email_doc(wn.boot.notification_settings.quotation_message);
- }
}
\ No newline at end of file
diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py
index 6a030b9..ba571ae 100644
--- a/erpnext/selling/doctype/quotation/quotation.py
+++ b/erpnext/selling/doctype/quotation/quotation.py
@@ -3,14 +3,11 @@
from __future__ import unicode_literals
import webnotes
-
from webnotes.utils import cstr
from webnotes.model.bean import getlist
from webnotes.model.code import get_obj
from webnotes import _, msgprint
-
-
from erpnext.controllers.selling_controller import SellingController
class DocType(SellingController):
diff --git a/erpnext/selling/doctype/quotation/quotation.txt b/erpnext/selling/doctype/quotation/quotation.txt
index f12a2a7..a8a1c07 100644
--- a/erpnext/selling/doctype/quotation/quotation.txt
+++ b/erpnext/selling/doctype/quotation/quotation.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-24 19:29:08",
"docstatus": 0,
- "modified": "2014-01-20 17:49:16",
+ "modified": "2014-01-29 19:42:32",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -373,17 +373,17 @@
"doctype": "DocField",
"fieldname": "taxes",
"fieldtype": "Section Break",
- "label": "Taxes",
+ "label": "Taxes and Charges",
"oldfieldtype": "Section Break",
"options": "icon-money",
"read_only": 0
},
{
"doctype": "DocField",
- "fieldname": "charge",
+ "fieldname": "taxes_and_charges",
"fieldtype": "Link",
"hidden": 0,
- "label": "Tax Master",
+ "label": "Taxes and Charges",
"oldfieldname": "charge",
"oldfieldtype": "Link",
"options": "Sales Taxes and Charges Master",
@@ -674,6 +674,7 @@
"read_only": 0
},
{
+ "depends_on": "eval:doc.customer",
"doctype": "DocField",
"fieldname": "contact_person",
"fieldtype": "Link",
diff --git a/erpnext/selling/doctype/sales_order/sales_order.txt b/erpnext/selling/doctype/sales_order/sales_order.txt
index d187f67..01c2817 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.txt
+++ b/erpnext/selling/doctype/sales_order/sales_order.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-06-18 12:39:59",
"docstatus": 0,
- "modified": "2014-01-20 17:49:23",
+ "modified": "2014-01-28 18:47:42",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -398,16 +398,16 @@
"doctype": "DocField",
"fieldname": "taxes",
"fieldtype": "Section Break",
- "label": "Taxes",
+ "label": "Taxes and Charges",
"oldfieldtype": "Section Break",
"options": "icon-money",
"print_hide": 0
},
{
"doctype": "DocField",
- "fieldname": "charge",
+ "fieldname": "taxes_and_charges",
"fieldtype": "Link",
- "label": "Tax Master",
+ "label": "Taxes and Charges",
"oldfieldname": "charge",
"oldfieldtype": "Link",
"options": "Sales Taxes and Charges Master",
@@ -928,11 +928,13 @@
"write": 1
},
{
+ "cancel": 0,
"delete": 0,
"doctype": "DocPerm",
"role": "Accounts User"
},
{
+ "cancel": 0,
"delete": 0,
"doctype": "DocPerm",
"role": "Customer"
diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js
index 1baaf7b..fe78ee7 100644
--- a/erpnext/selling/sales_common.js
+++ b/erpnext/selling/sales_common.js
@@ -35,8 +35,8 @@
me.frm.set_query(opts[0], erpnext.queries[opts[1]]);
});
- if(this.frm.fields_dict.charge) {
- this.frm.set_query("charge", function() {
+ if(this.frm.fields_dict.taxes_and_charges) {
+ this.frm.set_query("taxes_and_charges", function() {
return {
filters: [
['Sales Taxes and Charges Master', 'company', '=', me.frm.doc.company],
@@ -80,7 +80,7 @@
if(item.warehouse) filters["warehouse"] = item.warehouse
return {
- query : "controllers.queries.get_batch_no",
+ query : "erpnext.controllers.queries.get_batch_no",
filters: filters
}
}
@@ -119,6 +119,8 @@
(me.frm.doc.selling_price_list !== selling_price_list) ?
me.selling_price_list() :
me.price_list_currency();
+ if (me.frm.doc.taxes_and_charges)
+ me.frm.script_manager.trigger("taxes_and_charges")
}
}
});
@@ -511,28 +513,6 @@
this.frm.doc.in_words = this.frm.doc.in_words_export = "";
},
- show_item_wise_taxes: function() {
- if(this.frm.fields_dict.other_charges_calculation) {
- $(this.get_item_wise_taxes_html())
- .appendTo($(this.frm.fields_dict.other_charges_calculation.wrapper).empty());
- }
- },
-
- charge: function() {
- var me = this;
- if(this.frm.doc.charge) {
- return this.frm.call({
- doc: this.frm.doc,
- method: "get_other_charges",
- callback: function(r) {
- if(!r.exc) {
- me.calculate_taxes_and_totals();
- }
- }
- });
- }
- },
-
shipping_rule: function() {
var me = this;
if(this.frm.doc.shipping_rule) {
@@ -690,4 +670,4 @@
}
}
refresh_field('sales_bom_help');
-}
+}
\ No newline at end of file
diff --git a/erpnext/stock/Print Format/Purchase Receipt Format/Purchase Receipt Format.txt b/erpnext/stock/Print Format/Purchase Receipt Format/Purchase Receipt Format.txt
deleted file mode 100644
index d39583e..0000000
--- a/erpnext/stock/Print Format/Purchase Receipt Format/Purchase Receipt Format.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-[
- {
- "owner": "Administrator",
- "docstatus": 0,
- "creation": "2010-08-08 17:09:34",
- "modified_by": "Administrator",
- "modified": "2011-10-19 14:18:26"
- },
- {
- "name": "__common__",
- "module": "Stock",
- "standard": "Yes",
- "html": "<html>\n<head>\n<!--Other charges function-->\n<script>\n var make_row = function(title,val,bold){\n var bstart = '<b>'; var bend = '</b>';\n return '<tr><td style=\"width:50%\">'+(bold?bstart:'')+title+(bold?bend:'')+'</td>'\n +'<td style=\"width:20%;text-align:right\">'+doc.currency+'</td>'\n +'<td style=\"width:30%;text-align:right\">'+(val?val:'0.00')+'</td>'\n +'</tr>'\n }\n\n function get_other_charges(){\n var out ='';\n out += '<div><table class=\"noborder\" style=\"width:100%\">';\n out += make_row('Total Amount',fmt_money(convert_rate(doc.total_amount)),1)\n +make_row('Grand Total',fmt_money(convert_rate(doc.grand_total)),1);\n out += '</table></div>';\n return out;\n }\n\n function get_buying_costs(){\n var out ='';\n if(doc.buying_cost_transport || doc.buying_cost_taxes || doc.buying_cost_other){\n out += '<div><table class=\"noborder\" style=\"width:100%\">'\n + '<tr><td style=\"width:100%\"><b>'+'Buying Cost Details'+'</b></td></tr>';\n if(doc.buying_cost_transport){ out += make_row('Transport Cost',fmt_money(convert_rate(doc.buying_cost_transport)),0)}\n if(doc.buying_cost_taxes){ out += make_row('Taxes',fmt_money(convert_rate(doc.buying_cost_taxes)),0)}\n if(doc.buying_cost_other){ out += make_row('Other Cost',fmt_money(convert_rate(doc.buying_cost_other)),0)}\n out += '</table></div>';\n }\n return out;\n }\n\nfunction get_letter_head() {\n\t// add letter head\n\tvar cp = locals['Control Panel']['Control Panel'];\n\tif(doc.letter_head)\n\t\tvar lh= cstr(_p.letter_heads[doc.letter_head]);\n\telse if(cp.letter_head)\n\t\tvar lh= cp.letter_head;\n\telse \n\t\tvar lh= '';\n\t\t\n\treturn lh;\n}\n\n \n function convert_rate(val){\n var new_val = flt(val)/flt(doc.conversion_rate);\n return new_val;\n }\n \n function get_transport_details(){\n var out = '';\n if(doc.transporter_name || doc.lr_no || doc.lr_date){\n out += '<div><table class=\"noborder\" style=\"width:40%\">'\n +'<tr><td style=\"width:80%\"><b>' + 'Transporter Details'+'</b></td><td style=\"width:20%\"></td></tr>'\n\n if(doc.transporter_name){ out += '<tr><td style=\"width:40%\">' + 'Transporter Name'+'</td><td style=\"width:60%\">'+doc.transporter_name+'</td></tr>'}\n if(doc.lr_no){ out += '<tr><td style=\"width:40%\">' + 'LR No'+'</td><td style=\"width:60%\">'+doc.lr_no+'</td></tr>'}\n if(doc.lr_date){ out += '<tr><td style=\"width:40%\">' + 'LR Date'+'</td><td style=\"width:60%\">'+doc.lr_date+'</td></tr>'}\n out += '</table></div>'\n }\n return out;\n }\n\n</script>\n</head>\n<body>\n<div style=\"border:1px solid black;padding:15px\">\n<!--header-->\n<div><script>get_letter_head()</script></div>\n<div style=\"border-bottom: 1px solid; padding-bottom: 5px;\">\n <div><br><b>Purchase Receipt: <script>doc.name</script></b></div>\n <div>Date: <script>date.str_to_user(doc.transaction_date)</script></div>\n</div>\n\n<div style=\"padding-top:15px\">\n<div><script>doc.supplier</script></div>\n<div><br><script>replace_newlines(doc.address_display)</script></div>\n</div>\n\n<div>\n<br>\n <script>\n var t = print_table('Purchase Receipt', doc.name, 'purchase_receipt_details', 'Purchase Receipt Item', ['SR', 'item_code','description','received_qty','qty','rejected_qty','po_rate','amount','billed_qty'], ['Sr', 'Item Code', 'Description','Received Quantity','Accepted Qty','Rejected Qty','Rate','Amount','Billed Qty'], ['4%','12%', '24%', '10%','10%','10%','10%','10%','10%'])\n if(t.appendChild) {\n // single\n out = t.innerHTML;\n } \n else {//multiple\n out = ''\n for(var i=0;i<t.length;i++) {\n if(i!=t.length-1){\n out += '<div style:\"padding-top:5px;\"></div>' + t[i].innerHTML +'<div style=\"page-break-after:always\"></div>';\n }\n else out += '<div style:\"padding-top:5px;\"></div>' + t[i].innerHTML;\n }\n }\n out;\n </script>\n\n</div>\n\n<!--Other charges table-->\n<div>\n<table style=\"width:100%\">\n <tr><td style=\"width:40%\"><script>get_buying_costs()</script></td>\n <td style=\"width:20%\"></td><td style=\"width:40%\"><script>get_other_charges()</script></td></tr>\n</table>\n</div>\n<div><script>get_transport_details()</script></div>\n<div><br>Payment Terms</div>\n<div><br><script>replace_newlines(doc.payment_terms)</script></div>\n<div><br>For NCSCI</div>\n<div><br><br>(Authorised Signatory)</div>\n</div></body>\n</html>",
- "doctype": "Print Format"
- },
- {
- "name": "Purchase Receipt Format",
- "doctype": "Print Format"
- }
-]
\ No newline at end of file
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.txt b/erpnext/stock/doctype/delivery_note/delivery_note.txt
index 63b62d6..a20723d 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.txt
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-24 19:29:09",
"docstatus": 0,
- "modified": "2014-01-20 17:48:35",
+ "modified": "2014-01-28 18:51:42",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -402,7 +402,7 @@
"doctype": "DocField",
"fieldname": "taxes",
"fieldtype": "Section Break",
- "label": "Taxes",
+ "label": "Taxes and Charges",
"oldfieldtype": "Section Break",
"options": "icon-money",
"read_only": 0
@@ -410,9 +410,9 @@
{
"description": "If you have created a standard template in Sales Taxes and Charges Master, select one and click on the button below.",
"doctype": "DocField",
- "fieldname": "charge",
+ "fieldname": "taxes_and_charges",
"fieldtype": "Link",
- "label": "Tax Master",
+ "label": "Taxes and Charges",
"oldfieldname": "charge",
"oldfieldtype": "Link",
"options": "Sales Taxes and Charges Master",
@@ -1071,6 +1071,7 @@
"write": 0
},
{
+ "cancel": 0,
"delete": 0,
"doctype": "DocPerm",
"role": "Customer"
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index e894d0d..1e89dc1 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -23,7 +23,7 @@
cur_frm.cscript.make_dashboard = function() {
cur_frm.dashboard.reset();
- if(cur_frm.doc.__islocal)
+ if(cur_frm.doc.__islocal)
return;
}
@@ -34,26 +34,27 @@
}
cur_frm.cscript.item_code = function(doc) {
- if(!doc.item_name) cur_frm.set_value("item_name", doc.item_code);
- if(!doc.description) cur_frm.set_value("description", doc.item_code);
+ if(!doc.item_name)
+ cur_frm.set_value("item_name", doc.item_code);
+ if(!doc.description)
+ cur_frm.set_value("description", doc.item_code);
}
cur_frm.fields_dict['default_bom'].get_query = function(doc) {
- //var d = locals[this.doctype][this.docname];
- return{
- filters:{
- 'item': doc.item_code,
- 'is_active': 0
- }
- }
+ return {
+ filters: {
+ 'item': doc.item_code,
+ 'is_active': 0
+ }
+ }
}
// Expense Account
// ---------------------------------
-cur_frm.fields_dict['purchase_account'].get_query = function(doc){
- return{
- filters:{
+cur_frm.fields_dict['purchase_account'].get_query = function(doc) {
+ return {
+ filters: {
'debit_or_credit': "Debit",
'group_or_ledger': "Ledger"
}
@@ -63,8 +64,8 @@
// Income Account
// --------------------------------
cur_frm.fields_dict['default_income_account'].get_query = function(doc) {
- return{
- filters:{
+ return {
+ filters: {
'debit_or_credit': "Credit",
'group_or_ledger': "Ledger",
'account_type': "Income Account"
@@ -76,7 +77,7 @@
// Purchase Cost Center
// -----------------------------
cur_frm.fields_dict['cost_center'].get_query = function(doc) {
- return{
+ return {
filters:{ 'group_or_ledger': "Ledger" }
}
}
@@ -85,15 +86,15 @@
// Sales Cost Center
// -----------------------------
cur_frm.fields_dict['default_sales_cost_center'].get_query = function(doc) {
- return{
+ return {
filters:{ 'group_or_ledger': "Ledger" }
}
}
cur_frm.fields_dict['item_tax'].grid.get_field("tax_type").get_query = function(doc, cdt, cdn) {
- return{
- filters:[
+ return {
+ filters: [
['Account', 'account_type', 'in',
'Tax, Chargeable, Income Account, Expense Account'],
['Account', 'docstatus', '!=', 2]
@@ -102,12 +103,10 @@
}
cur_frm.cscript.tax_type = function(doc, cdt, cdn){
- var d = locals[cdt][cdn];
- return get_server_fields('get_tax_rate',d.tax_type,'item_tax',doc, cdt, cdn, 1);
+ var d = locals[cdt][cdn];
+ return get_server_fields('get_tax_rate', d.tax_type, 'item_tax', doc, cdt, cdn, 1);
}
-
-//get query select item group
cur_frm.fields_dict['item_group'].get_query = function(doc,cdt,cdn) {
return {
filters: [
@@ -116,44 +115,39 @@
}
}
-// for description from attachment
-// takes the first attachment and creates
-// a table with both image and attachment in HTML
-// in the "alternate_description" field
cur_frm.cscript.add_image = function(doc, dt, dn) {
if(!doc.image) {
msgprint(wn._('Please select an "Image" first'));
return;
}
- doc.description_html = repl('<table style="width: 100%; table-layout: fixed;">'+
- '<tr><td style="width:110px"><img src="%(imgurl)s" width="100px"></td>'+
- '<td>%(desc)s</td></tr>'+
- '</table>', {imgurl: wn.utils.get_file_link(doc.image), desc:doc.description});
+ doc.description_html = repl('<table style="width: 100%; table-layout: fixed;">' +
+ '<tr><td style="width:110px"><img src="%(imgurl)s" width="100px"></td>' +
+ '<td>%(desc)s</td></tr>' +
+ '</table>', {imgurl: wn.utils.get_file_link(doc.image), desc:doc.description});
refresh_field('description_html');
}
+
// Quotation to validation - either customer or lead mandatory
-cur_frm.cscript.weight_to_validate = function(doc,cdt,cdn){
-
- if((doc.nett_weight || doc.gross_weight) && !doc.weight_uom)
- {
- alert(wn._('Weight is mentioned,\nPlease mention "Weight UOM" too'));
- validated=0;
- }
+cur_frm.cscript.weight_to_validate = function(doc, cdt, cdn){
+ if((doc.nett_weight || doc.gross_weight) && !doc.weight_uom) {
+ msgprint(wn._('Weight is mentioned,\nPlease mention "Weight UOM" too'));
+ validated = 0;
+ }
}
-cur_frm.cscript.validate = function(doc,cdt,cdn){
- cur_frm.cscript.weight_to_validate(doc,cdt,cdn);
+cur_frm.cscript.validate = function(doc, cdt, cdn){
+ cur_frm.cscript.weight_to_validate(doc, cdt, cdn);
}
-cur_frm.fields_dict.item_customer_details.grid.get_field("customer_name").get_query =
-function(doc,cdt,cdn) {
- return{ query: "erpnext.controllers.queries.customer_query" } }
-
-cur_frm.fields_dict.item_supplier_details.grid.get_field("supplier").get_query =
- function(doc,cdt,cdn) {
- return{ query: "erpnext.controllers.queries.supplier_query" } }
+cur_frm.fields_dict.item_customer_details.grid.get_field("customer_name").get_query = function(doc, cdt, cdn) {
+ return { query: "erpnext.controllers.queries.customer_query" }
+}
+
+cur_frm.fields_dict.item_supplier_details.grid.get_field("supplier").get_query = function(doc, cdt, cdn) {
+ return { query: "erpnext.controllers.queries.supplier_query" }
+}
cur_frm.cscript.copy_from_item_group = function(doc) {
wn.model.with_doc("Item Group", doc.item_group, function() {
@@ -172,9 +166,9 @@
cur_frm.cscript.image = function() {
refresh_field("image_view");
- if(!cur_frm.doc.description_html) {
+ if(!cur_frm.doc.description_html)
cur_frm.cscript.add_image(cur_frm.doc);
- } else {
+ else {
msgprint(wn._("You may need to update: ") +
wn.meta.get_docfield(cur_frm.doc.doctype, "description_html").label);
}
diff --git a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
index 95026ad..523d555 100644
--- a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
+++ b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
@@ -39,13 +39,13 @@
for pr in purchase_receipts:
pr_bean = webnotes.bean('Purchase Receipt', pr)
- idx = max([d.idx for d in pr_bean.doclist.get({"parentfield": "purchase_tax_details"})])
+ idx = max([d.idx for d in pr_bean.doclist.get({"parentfield": "other_charges"})])
for lc in self.doclist.get({"parentfield": "landed_cost_details"}):
amt = flt(lc.amount) * flt(pr_bean.doc.net_total)/ flt(total_amt)
matched_row = pr_bean.doclist.get({
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"category": "Valuation",
"add_deduct_tax": "Add",
"charge_type": "Actual",
@@ -53,7 +53,7 @@
})
if not matched_row: # add if not exists
- ch = addchild(pr_bean.doc, 'purchase_tax_details', 'Purchase Taxes and Charges')
+ ch = addchild(pr_bean.doc, 'other_charges', 'Purchase Taxes and Charges')
ch.category = 'Valuation'
ch.add_deduct_tax = 'Add'
ch.charge_type = 'Actual'
diff --git a/erpnext/stock/doctype/price_list/price_list.txt b/erpnext/stock/doctype/price_list/price_list.txt
index 7f8b3a1..253dce7 100644
--- a/erpnext/stock/doctype/price_list/price_list.txt
+++ b/erpnext/stock/doctype/price_list/price_list.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-01-25 11:35:09",
"docstatus": 0,
- "modified": "2014-01-20 17:50:00",
+ "modified": "2014-01-27 11:11:08",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -10,6 +10,9 @@
"allow_attach": 0,
"allow_copy": 0,
"allow_import": 1,
+ "allow_email": 1,
+ "allow_print": 1,
+ "allow_rename": 1,
"autoname": "field:price_list_name",
"description": "Price List Master",
"doctype": "DocType",
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
index 5151c00..1a08cd2 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
@@ -3,7 +3,7 @@
cur_frm.cscript.tname = "Purchase Receipt Item";
cur_frm.cscript.fname = "purchase_receipt_details";
-cur_frm.cscript.other_fname = "purchase_tax_details";
+cur_frm.cscript.other_fname = "other_charges";
{% include 'buying/doctype/purchase_common/purchase_common.js' %};
{% include 'accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js' %}
@@ -106,27 +106,28 @@
$.extend(cur_frm.cscript, new erpnext.stock.PurchaseReceiptController({frm: cur_frm}));
cur_frm.fields_dict['supplier_address'].get_query = function(doc, cdt, cdn) {
- return{
- filters:{ 'supplier': doc.supplier}
+ return {
+ filters: { 'supplier': doc.supplier}
}
}
cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
- return{
- filters:{ 'supplier': doc.supplier}
+ return {
+ filters: { 'supplier': doc.supplier }
}
}
-cur_frm.cscript.new_contact = function(){
+cur_frm.cscript.new_contact = function() {
tn = wn.model.make_new_doc_and_get_name('Contact');
locals['Contact'][tn].is_supplier = 1;
- if(doc.supplier) locals['Contact'][tn].supplier = doc.supplier;
+ if(doc.supplier)
+ locals['Contact'][tn].supplier = doc.supplier;
loaddoc('Contact', tn);
}
cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) {
- return{
- filters:[
+ return {
+ filters: [
['Project', 'status', 'not in', 'Completed, Cancelled']
]
}
@@ -134,28 +135,25 @@
cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('batch_no').get_query= function(doc, cdt, cdn) {
var d = locals[cdt][cdn];
- if(d.item_code){
- return{
- filters:{'item': d.item_code}
+ if(d.item_code) {
+ return {
+ filters: {'item': d.item_code}
}
}
- else{
- alert(wn._("Please enter Item Code."));
- }
+ else
+ msgprint(wn._("Please enter Item Code."));
}
-cur_frm.cscript.select_print_heading = function(doc,cdt,cdn){
- if(doc.select_print_heading){
- // print heading
+cur_frm.cscript.select_print_heading = function(doc, cdt, cdn) {
+ if(doc.select_print_heading)
cur_frm.pformat.print_heading = doc.select_print_heading;
- }
else
cur_frm.pformat.print_heading = "Purchase Receipt";
}
cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) {
- return{
- filters:[
+ return {
+ filters: [
['Print Heading', 'docstatus', '!=', '2']
]
}
@@ -170,7 +168,6 @@
}
cur_frm.cscript.on_submit = function(doc, cdt, cdn) {
- if(cint(wn.boot.notification_settings.purchase_receipt)) {
+ if(cint(wn.boot.notification_settings.purchase_receipt))
cur_frm.email_doc(wn.boot.notification_settings.purchase_receipt_message);
- }
-}
+}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.txt b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.txt
index 960bb21..28c2572 100755
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.txt
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-21 16:16:39",
"docstatus": 0,
- "modified": "2014-01-20 17:49:12",
+ "modified": "2014-01-29 15:25:14",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -329,16 +329,16 @@
"doctype": "DocField",
"fieldname": "taxes",
"fieldtype": "Section Break",
- "label": "Taxes",
+ "label": "Taxes and Charges",
"oldfieldtype": "Section Break",
"options": "icon-money"
},
{
"description": "If you have created a standard template in Purchase Taxes and Charges Master, select one and click on the button below.",
"doctype": "DocField",
- "fieldname": "purchase_other_charges",
+ "fieldname": "taxes_and_charges",
"fieldtype": "Link",
- "label": "Purchase Taxes and Charges",
+ "label": "Taxes and Charges",
"oldfieldname": "purchase_other_charges",
"oldfieldtype": "Link",
"options": "Purchase Taxes and Charges Master",
@@ -346,7 +346,7 @@
},
{
"doctype": "DocField",
- "fieldname": "purchase_tax_details",
+ "fieldname": "other_charges",
"fieldtype": "Table",
"label": "Purchase Taxes and Charges",
"oldfieldname": "purchase_tax_details",
@@ -355,9 +355,9 @@
},
{
"doctype": "DocField",
- "fieldname": "tax_calculation",
+ "fieldname": "other_charges_calculation",
"fieldtype": "HTML",
- "label": "Tax Calculation",
+ "label": "Taxes and Charges Calculation",
"oldfieldtype": "HTML",
"print_hide": 1
},
@@ -836,6 +836,7 @@
"write": 1
},
{
+ "cancel": 0,
"delete": 0,
"doctype": "DocPerm",
"role": "Supplier"
diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
index 89e77ce..c40b72b 100644
--- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
@@ -184,7 +184,7 @@
"charge_type": "Actual",
"description": "Shipping Charges",
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"rate": 100.0,
"tax_amount": 100.0,
},
@@ -195,7 +195,7 @@
"charge_type": "Actual",
"description": "VAT",
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"rate": 120.0,
"tax_amount": 120.0,
},
@@ -206,7 +206,7 @@
"charge_type": "Actual",
"description": "Customs Duty",
"doctype": "Purchase Taxes and Charges",
- "parentfield": "purchase_tax_details",
+ "parentfield": "other_charges",
"rate": 150.0,
"tax_amount": 150.0,
},
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index 9c1da65..45cc89c 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -94,6 +94,8 @@
self.doc.status = "Delivered"
else:
self.doc.status = "Not Available"
+ else:
+ self.doc.status = "Not Available"
def set_purchase_details(self, purchase_sle):
if purchase_sle:
@@ -185,10 +187,9 @@
def on_stock_ledger_entry(self):
if self.via_stock_ledger and not self.doc.fields.get("__islocal"):
last_sle = self.get_last_sle()
- if last_sle:
- self.set_status(last_sle.get("last_sle"))
- self.set_purchase_details(last_sle.get("purchase_sle"))
- self.set_sales_details(last_sle.get("delivery_sle"))
+ self.set_status(last_sle.get("last_sle"))
+ self.set_purchase_details(last_sle.get("purchase_sle"))
+ self.set_sales_details(last_sle.get("delivery_sle"))
def on_communication(self):
return
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 6bd9564..52436ee 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -7,7 +7,7 @@
wn.require("assets/erpnext/js/controllers/stock_controller.js");
wn.provide("erpnext.stock");
-erpnext.stock.StockEntry = erpnext.stock.StockController.extend({
+erpnext.stock.StockEntry = erpnext.stock.StockController.extend({
setup: function() {
var me = this;
@@ -54,11 +54,11 @@
}
}
},
-
+
onload_post_render: function() {
this.set_default_account();
},
-
+
refresh: function() {
var me = this;
erpnext.hide_naming_series();
@@ -79,11 +79,11 @@
}
},
-
+
on_submit: function() {
this.clean_up();
},
-
+
after_cancel: function() {
this.clean_up();
},
@@ -114,7 +114,7 @@
});
}
},
-
+
clean_up: function() {
// Clear Production Order record from locals, because it is updated via Stock Entry
if(this.frm.doc.production_order &&
@@ -123,7 +123,7 @@
this.frm.doc.production_order);
}
},
-
+
get_items: function() {
if(this.frm.doc.production_order || this.frm.doc.bom_no) {
// if production order / bom is mentioned, get items
@@ -136,13 +136,13 @@
});
}
},
-
+
qty: function(doc, cdt, cdn) {
var d = locals[cdt][cdn];
d.transfer_qty = flt(d.qty) * flt(d.conversion_factor);
refresh_field('mtn_details');
},
-
+
production_order: function() {
var me = this;
this.toggle_enable_bom();
@@ -158,11 +158,11 @@
}
});
},
-
+
toggle_enable_bom: function() {
this.frm.toggle_enable("bom_no", !this.frm.doc.production_order);
},
-
+
get_doctype_docname: function() {
if(this.frm.doc.purpose === "Sales Return") {
if(this.frm.doc.delivery_note_no && this.frm.doc.sales_invoice_no) {
@@ -191,7 +191,7 @@
}
}
},
-
+
add_excise_button: function() {
if(wn.boot.control_panel.country === "India")
this.frm.add_custom_button(wn._("Make Excise Invoice"), function() {
@@ -201,7 +201,7 @@
loaddoc('Journal Voucher', excise.name);
});
},
-
+
make_return_jv: function() {
if(this.get_doctype_docname()) {
return this.frm.call({
@@ -233,7 +233,7 @@
if(!row.s_warehouse) row.s_warehouse = this.frm.doc.from_warehouse;
if(!row.t_warehouse) row.t_warehouse = this.frm.doc.to_warehouse;
},
-
+
mtn_details_on_form_rendered: function(doc, grid_row) {
erpnext.setup_serial_no(grid_row)
}
@@ -288,12 +288,11 @@
cur_frm.cscript.supplier = function(doc, cdt, cdn) {
if(doc.supplier)
return get_server_fields('get_supp_addr', '', '', doc, cdt, cdn, 1);
-
}
cur_frm.fields_dict['production_order'].get_query = function(doc) {
- return{
- filters:[
+ return {
+ filters: [
['Production Order', 'docstatus', '=', 1],
['Production Order', 'qty', '>','`tabProduction Order`.produced_qty']
]
@@ -306,7 +305,7 @@
// Overloaded query for link batch_no
cur_frm.fields_dict['mtn_details'].grid.get_field('batch_no').get_query = function(doc, cdt, cdn) {
- var d = locals[cdt][cdn];
+ var d = locals[cdt][cdn];
if(d.item_code) {
return{
query: "erpnext.stock.doctype.stock_entry.stock_entry.get_batch_no",
@@ -371,7 +370,7 @@
cur_frm.cscript.validate_items = function(doc) {
cl = getchildren('Stock Entry Detail', doc.name, 'mtn_details');
if (!cl.length) {
- alert(wn._("Item table can not be blank"));
+ msgprint(wn._("Item table can not be blank"));
validated = false;
}
}
@@ -385,9 +384,9 @@
}
cur_frm.fields_dict.customer.get_query = function(doc, cdt, cdn) {
- return{ query: "erpnext.controllers.queries.customer_query" }
+ return { query: "erpnext.controllers.queries.customer_query" }
}
cur_frm.fields_dict.supplier.get_query = function(doc, cdt, cdn) {
- return{ query: "erpnext.controllers.queries.supplier_query" }
-}
+ return { query: "erpnext.controllers.queries.supplier_query" }
+}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index f1485f3..5c760f4 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -344,7 +344,8 @@
pro_bean = webnotes.bean("Production Order", self.doc.production_order)
_validate_production_order(pro_bean)
self.update_produced_qty(pro_bean)
- self.update_planned_qty(pro_bean)
+ if self.doc.purpose == "Manufacture/Repack":
+ self.update_planned_qty(pro_bean)
def update_produced_qty(self, pro_bean):
if self.doc.purpose == "Manufacture/Repack":
diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
index 1d7c2e4..4ec6c89 100644
--- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
@@ -6,6 +6,7 @@
from webnotes.utils import flt
from erpnext.stock.doctype.serial_no.serial_no import *
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
+from erpnext.stock.doctype.stock_ledger_entry.stock_ledger_entry import StockFreezeError
class TestStockEntry(unittest.TestCase):
def tearDown(self):
@@ -18,7 +19,7 @@
webnotes.conn.sql("""delete from `tabMaterial Request Item`""")
webnotes.conn.sql("""delete from `tabMaterial Request`""")
self._clear_stock_account_balance()
-
+
webnotes.conn.set_value("Stock Settings", None, "auto_indent", True)
st1 = webnotes.bean(copy=test_records[0])
@@ -28,119 +29,120 @@
st2 = webnotes.bean(copy=test_records[1])
st2.insert()
st2.submit()
-
+
from erpnext.stock.utils import reorder_item
+
reorder_item()
-
+
mr_name = webnotes.conn.sql("""select parent from `tabMaterial Request Item`
where item_code='_Test Item'""")
-
+
self.assertTrue(mr_name)
-
+
webnotes.conn.set_default("company", self.old_default_company)
def test_material_receipt_gl_entry(self):
self._clear_stock_account_balance()
set_perpetual_inventory()
-
+
mr = webnotes.bean(copy=test_records[0])
mr.insert()
mr.submit()
-
- stock_in_hand_account = webnotes.conn.get_value("Account", {"account_type": "Warehouse",
+
+ stock_in_hand_account = webnotes.conn.get_value("Account", {"account_type": "Warehouse",
"master_name": mr.doclist[1].t_warehouse})
-
- self.check_stock_ledger_entries("Stock Entry", mr.doc.name,
+
+ self.check_stock_ledger_entries("Stock Entry", mr.doc.name,
[["_Test Item", "_Test Warehouse - _TC", 50.0]])
-
- self.check_gl_entries("Stock Entry", mr.doc.name,
+
+ self.check_gl_entries("Stock Entry", mr.doc.name,
sorted([
- [stock_in_hand_account, 5000.0, 0.0],
+ [stock_in_hand_account, 5000.0, 0.0],
["Stock Adjustment - _TC", 0.0, 5000.0]
])
)
-
+
mr.cancel()
-
- self.assertFalse(webnotes.conn.sql("""select * from `tabStock Ledger Entry`
- where voucher_type='Stock Entry' and voucher_no=%s""", mr.doc.name))
-
- self.assertFalse(webnotes.conn.sql("""select * from `tabGL Entry`
+
+ self.assertFalse(webnotes.conn.sql("""select * from `tabStock Ledger Entry`
where voucher_type='Stock Entry' and voucher_no=%s""", mr.doc.name))
-
+
+ self.assertFalse(webnotes.conn.sql("""select * from `tabGL Entry`
+ where voucher_type='Stock Entry' and voucher_no=%s""", mr.doc.name))
+
def test_material_issue_gl_entry(self):
self._clear_stock_account_balance()
set_perpetual_inventory()
-
+
self._insert_material_receipt()
-
+
mi = webnotes.bean(copy=test_records[1])
mi.insert()
mi.submit()
-
- self.check_stock_ledger_entries("Stock Entry", mi.doc.name,
+
+ self.check_stock_ledger_entries("Stock Entry", mi.doc.name,
[["_Test Item", "_Test Warehouse - _TC", -40.0]])
-
- stock_in_hand_account = webnotes.conn.get_value("Account", {"account_type": "Warehouse",
+
+ stock_in_hand_account = webnotes.conn.get_value("Account", {"account_type": "Warehouse",
"master_name": mi.doclist[1].s_warehouse})
- self.check_gl_entries("Stock Entry", mi.doc.name,
+ self.check_gl_entries("Stock Entry", mi.doc.name,
sorted([
- [stock_in_hand_account, 0.0, 4000.0],
+ [stock_in_hand_account, 0.0, 4000.0],
["Stock Adjustment - _TC", 4000.0, 0.0]
])
)
-
+
mi.cancel()
- self.assertFalse(webnotes.conn.sql("""select * from `tabStock Ledger Entry`
- where voucher_type='Stock Entry' and voucher_no=%s""", mi.doc.name))
-
- self.assertFalse(webnotes.conn.sql("""select * from `tabGL Entry`
+ self.assertFalse(webnotes.conn.sql("""select * from `tabStock Ledger Entry`
where voucher_type='Stock Entry' and voucher_no=%s""", mi.doc.name))
-
- self.assertEquals(webnotes.conn.get_value("Bin", {"warehouse": mi.doclist[1].s_warehouse,
+
+ self.assertFalse(webnotes.conn.sql("""select * from `tabGL Entry`
+ where voucher_type='Stock Entry' and voucher_no=%s""", mi.doc.name))
+
+ self.assertEquals(webnotes.conn.get_value("Bin", {"warehouse": mi.doclist[1].s_warehouse,
"item_code": mi.doclist[1].item_code}, "actual_qty"), 50)
-
- self.assertEquals(webnotes.conn.get_value("Bin", {"warehouse": mi.doclist[1].s_warehouse,
+
+ self.assertEquals(webnotes.conn.get_value("Bin", {"warehouse": mi.doclist[1].s_warehouse,
"item_code": mi.doclist[1].item_code}, "stock_value"), 5000)
-
+
def test_material_transfer_gl_entry(self):
self._clear_stock_account_balance()
set_perpetual_inventory()
self._insert_material_receipt()
-
+
mtn = webnotes.bean(copy=test_records[2])
mtn.insert()
mtn.submit()
- self.check_stock_ledger_entries("Stock Entry", mtn.doc.name,
+ self.check_stock_ledger_entries("Stock Entry", mtn.doc.name,
[["_Test Item", "_Test Warehouse - _TC", -45.0], ["_Test Item", "_Test Warehouse 1 - _TC", 45.0]])
- stock_in_hand_account = webnotes.conn.get_value("Account", {"account_type": "Warehouse",
+ stock_in_hand_account = webnotes.conn.get_value("Account", {"account_type": "Warehouse",
"master_name": mtn.doclist[1].s_warehouse})
- fixed_asset_account = webnotes.conn.get_value("Account", {"account_type": "Warehouse",
+ fixed_asset_account = webnotes.conn.get_value("Account", {"account_type": "Warehouse",
"master_name": mtn.doclist[1].t_warehouse})
-
- self.check_gl_entries("Stock Entry", mtn.doc.name,
+
+ self.check_gl_entries("Stock Entry", mtn.doc.name,
sorted([
- [stock_in_hand_account, 0.0, 4500.0],
+ [stock_in_hand_account, 0.0, 4500.0],
[fixed_asset_account, 4500.0, 0.0],
])
)
-
+
mtn.cancel()
- self.assertFalse(webnotes.conn.sql("""select * from `tabStock Ledger Entry`
- where voucher_type='Stock Entry' and voucher_no=%s""", mtn.doc.name))
-
- self.assertFalse(webnotes.conn.sql("""select * from `tabGL Entry`
+ self.assertFalse(webnotes.conn.sql("""select * from `tabStock Ledger Entry`
where voucher_type='Stock Entry' and voucher_no=%s""", mtn.doc.name))
-
-
+
+ self.assertFalse(webnotes.conn.sql("""select * from `tabGL Entry`
+ where voucher_type='Stock Entry' and voucher_no=%s""", mtn.doc.name))
+
+
def test_repack_no_change_in_valuation(self):
self._clear_stock_account_balance()
set_perpetual_inventory()
@@ -150,47 +152,47 @@
repack = webnotes.bean(copy=test_records[3])
repack.insert()
repack.submit()
-
- self.check_stock_ledger_entries("Stock Entry", repack.doc.name,
- [["_Test Item", "_Test Warehouse - _TC", -50.0],
+
+ self.check_stock_ledger_entries("Stock Entry", repack.doc.name,
+ [["_Test Item", "_Test Warehouse - _TC", -50.0],
["_Test Item Home Desktop 100", "_Test Warehouse - _TC", 1]])
-
+
gl_entries = webnotes.conn.sql("""select account, debit, credit
from `tabGL Entry` where voucher_type='Stock Entry' and voucher_no=%s
order by account desc""", repack.doc.name, as_dict=1)
self.assertFalse(gl_entries)
-
+
set_perpetual_inventory(0)
-
+
def test_repack_with_change_in_valuation(self):
self._clear_stock_account_balance()
set_perpetual_inventory()
self._insert_material_receipt()
-
+
repack = webnotes.bean(copy=test_records[3])
repack.doclist[2].incoming_rate = 6000
repack.insert()
repack.submit()
-
- stock_in_hand_account = webnotes.conn.get_value("Account", {"account_type": "Warehouse",
+
+ stock_in_hand_account = webnotes.conn.get_value("Account", {"account_type": "Warehouse",
"master_name": repack.doclist[2].t_warehouse})
-
- self.check_gl_entries("Stock Entry", repack.doc.name,
+
+ self.check_gl_entries("Stock Entry", repack.doc.name,
sorted([
- [stock_in_hand_account, 1000.0, 0.0],
+ [stock_in_hand_account, 1000.0, 0.0],
["Stock Adjustment - _TC", 0.0, 1000.0],
])
)
set_perpetual_inventory(0)
-
+
def check_stock_ledger_entries(self, voucher_type, voucher_no, expected_sle):
expected_sle.sort(key=lambda x: x[0])
-
+
# check stock ledger entries
- sle = webnotes.conn.sql("""select item_code, warehouse, actual_qty
- from `tabStock Ledger Entry` where voucher_type = %s
- and voucher_no = %s order by item_code, warehouse, actual_qty""",
+ sle = webnotes.conn.sql("""select item_code, warehouse, actual_qty
+ from `tabStock Ledger Entry` where voucher_type = %s
+ and voucher_no = %s order by item_code, warehouse, actual_qty""",
(voucher_type, voucher_no), as_list=1)
self.assertTrue(sle)
sle.sort(key=lambda x: x[0])
@@ -199,61 +201,61 @@
self.assertEquals(expected_sle[i][0], sle[0])
self.assertEquals(expected_sle[i][1], sle[1])
self.assertEquals(expected_sle[i][2], sle[2])
-
+
def check_gl_entries(self, voucher_type, voucher_no, expected_gl_entries):
expected_gl_entries.sort(key=lambda x: x[0])
-
+
gl_entries = webnotes.conn.sql("""select account, debit, credit
- from `tabGL Entry` where voucher_type=%s and voucher_no=%s
+ from `tabGL Entry` where voucher_type=%s and voucher_no=%s
order by account asc, debit asc""", (voucher_type, voucher_no), as_list=1)
self.assertTrue(gl_entries)
gl_entries.sort(key=lambda x: x[0])
-
+
for i, gle in enumerate(gl_entries):
self.assertEquals(expected_gl_entries[i][0], gle[0])
self.assertEquals(expected_gl_entries[i][1], gle[1])
self.assertEquals(expected_gl_entries[i][2], gle[2])
-
+
def _insert_material_receipt(self):
self._clear_stock_account_balance()
se1 = webnotes.bean(copy=test_records[0])
se1.insert()
se1.submit()
-
+
se2 = webnotes.bean(copy=test_records[0])
se2.doclist[1].item_code = "_Test Item Home Desktop 100"
se2.insert()
se2.submit()
-
+
webnotes.conn.set_default("company", self.old_default_company)
-
+
def _get_actual_qty(self):
- return flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item",
+ return flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item",
"warehouse": "_Test Warehouse - _TC"}, "actual_qty"))
-
+
def _test_sales_invoice_return(self, item_code, delivered_qty, returned_qty):
from erpnext.stock.doctype.stock_entry.stock_entry import NotUpdateStockError
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice \
import test_records as sales_invoice_test_records
-
+
# invalid sales invoice as update stock not checked
si = webnotes.bean(copy=sales_invoice_test_records[1])
si.insert()
si.submit()
-
+
se = webnotes.bean(copy=test_records[0])
se.doc.purpose = "Sales Return"
se.doc.sales_invoice_no = si.doc.name
se.doclist[1].qty = returned_qty
se.doclist[1].transfer_qty = returned_qty
self.assertRaises(NotUpdateStockError, se.insert)
-
+
self._insert_material_receipt()
-
+
# check currency available qty in bin
actual_qty_0 = self._get_actual_qty()
-
+
# insert a pos invoice with update stock
si = webnotes.bean(copy=sales_invoice_test_records[1])
si.doc.is_pos = si.doc.update_stock = 1
@@ -262,12 +264,12 @@
si.doclist[1].qty = 5.0
si.insert()
si.submit()
-
+
# check available bin qty after invoice submission
actual_qty_1 = self._get_actual_qty()
-
+
self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1)
-
+
# check if item is validated
se = webnotes.bean(copy=test_records[0])
se.doc.purpose = "Sales Return"
@@ -277,10 +279,10 @@
se.doclist[1].item_code = "_Test Item Home Desktop 200"
se.doclist[1].qty = returned_qty
se.doclist[1].transfer_qty = returned_qty
-
+
# check if stock entry gets submitted
self.assertRaises(webnotes.DoesNotExistError, se.insert)
-
+
# try again
se = webnotes.bean(copy=test_records[0])
se.doc.purpose = "Sales Return"
@@ -291,45 +293,45 @@
se.doclist[1].transfer_qty = returned_qty
# in both cases item code remains _Test Item when returning
se.insert()
-
+
se.submit()
-
+
# check if available qty is increased
actual_qty_2 = self._get_actual_qty()
-
+
self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2)
-
+
return se
-
+
def test_sales_invoice_return_of_non_packing_item(self):
self._clear_stock_account_balance()
self._test_sales_invoice_return("_Test Item", 5, 2)
-
+
def test_sales_invoice_return_of_packing_item(self):
self._clear_stock_account_balance()
self._test_sales_invoice_return("_Test Sales BOM Item", 25, 20)
-
+
def _test_delivery_note_return(self, item_code, delivered_qty, returned_qty):
self._insert_material_receipt()
-
+
from erpnext.stock.doctype.delivery_note.test_delivery_note \
import test_records as delivery_note_test_records
from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice
-
+
actual_qty_0 = self._get_actual_qty()
# make a delivery note based on this invoice
dn = webnotes.bean(copy=delivery_note_test_records[0])
dn.doclist[1].item_code = item_code
dn.insert()
dn.submit()
-
+
actual_qty_1 = self._get_actual_qty()
-
+
self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1)
-
+
si_doclist = make_sales_invoice(dn.doc.name)
-
+
si = webnotes.bean(si_doclist)
si.doc.posting_date = dn.doc.posting_date
si.doc.debit_to = "_Test Customer - _TC"
@@ -338,7 +340,7 @@
d.cost_center = "_Test Cost Center - _TC"
si.insert()
si.submit()
-
+
# insert and submit stock entry for sales return
se = webnotes.bean(copy=test_records[0])
se.doc.purpose = "Sales Return"
@@ -346,60 +348,60 @@
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()
se.submit()
-
+
actual_qty_2 = self._get_actual_qty()
self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2)
-
+
return se
-
+
def test_delivery_note_return_of_non_packing_item(self):
self._clear_stock_account_balance()
self._test_delivery_note_return("_Test Item", 5, 2)
-
+
def test_delivery_note_return_of_packing_item(self):
self._clear_stock_account_balance()
self._test_delivery_note_return("_Test Sales BOM Item", 25, 20)
-
+
def _test_sales_return_jv(self, se):
from erpnext.stock.doctype.stock_entry.stock_entry import make_return_jv
jv_list = make_return_jv(se.doc.name)
-
+
self.assertEqual(len(jv_list), 3)
self.assertEqual(jv_list[0].get("voucher_type"), "Credit Note")
self.assertEqual(jv_list[0].get("posting_date"), se.doc.posting_date)
self.assertEqual(jv_list[1].get("account"), "_Test Customer - _TC")
self.assertEqual(jv_list[2].get("account"), "Sales - _TC")
self.assertTrue(jv_list[1].get("against_invoice"))
-
+
def test_make_return_jv_for_sales_invoice_non_packing_item(self):
self._clear_stock_account_balance()
se = self._test_sales_invoice_return("_Test Item", 5, 2)
self._test_sales_return_jv(se)
-
+
def test_make_return_jv_for_sales_invoice_packing_item(self):
self._clear_stock_account_balance()
se = self._test_sales_invoice_return("_Test Sales BOM Item", 25, 20)
self._test_sales_return_jv(se)
-
+
def test_make_return_jv_for_delivery_note_non_packing_item(self):
self._clear_stock_account_balance()
se = self._test_delivery_note_return("_Test Item", 5, 2)
self._test_sales_return_jv(se)
-
+
se = self._test_delivery_note_return_against_sales_order("_Test Item", 5, 2)
self._test_sales_return_jv(se)
-
+
def test_make_return_jv_for_delivery_note_packing_item(self):
self._clear_stock_account_balance()
se = self._test_delivery_note_return("_Test Sales BOM Item", 25, 20)
self._test_sales_return_jv(se)
-
+
se = self._test_delivery_note_return_against_sales_order("_Test Sales BOM Item", 25, 20)
self._test_sales_return_jv(se)
-
+
def _test_delivery_note_return_against_sales_order(self, item_code, delivered_qty, returned_qty):
self._insert_material_receipt()
@@ -407,13 +409,13 @@
from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice, make_delivery_note
actual_qty_0 = self._get_actual_qty()
-
+
so = webnotes.bean(copy=sales_order_test_records[0])
so.doclist[1].item_code = item_code
so.doclist[1].qty = 5.0
so.insert()
so.submit()
-
+
dn_doclist = make_delivery_note(so.doc.name)
dn = webnotes.bean(dn_doclist)
@@ -421,7 +423,7 @@
dn.doc.posting_date = so.doc.delivery_date
dn.insert()
dn.submit()
-
+
actual_qty_1 = self._get_actual_qty()
self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1)
@@ -452,12 +454,12 @@
self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2)
return se
-
+
def test_purchase_receipt_return(self):
self._clear_stock_account_balance()
-
+
actual_qty_0 = self._get_actual_qty()
-
+
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt \
import test_records as purchase_receipt_test_records
@@ -467,28 +469,28 @@
pr = webnotes.bean(copy=purchase_receipt_test_records[0])
pr.insert()
pr.submit()
-
+
actual_qty_1 = self._get_actual_qty()
-
+
self.assertEquals(actual_qty_0 + 5, actual_qty_1)
-
+
pi_doclist = make_purchase_invoice(pr.doc.name)
-
+
pi = webnotes.bean(pi_doclist)
pi.doc.posting_date = pr.doc.posting_date
pi.doc.credit_to = "_Test Supplier - _TC"
for d in pi.doclist.get({"parentfield": "entries"}):
d.expense_head = "_Test Account Cost for Goods Sold - _TC"
d.cost_center = "_Test Cost Center - _TC"
-
- for d in pi.doclist.get({"parentfield": "purchase_tax_details"}):
+
+ for d in pi.doclist.get({"parentfield": "other_charges"}):
d.cost_center = "_Test Cost Center - _TC"
-
+
pi.run_method("calculate_taxes_and_totals")
pi.doc.bill_no = "NA"
pi.insert()
pi.submit()
-
+
# submit purchase return
se = webnotes.bean(copy=test_records[0])
se.doc.purpose = "Purchase Return"
@@ -499,22 +501,22 @@
se.doclist[1].s_warehouse = "_Test Warehouse - _TC"
se.insert()
se.submit()
-
+
actual_qty_2 = self._get_actual_qty()
-
+
self.assertEquals(actual_qty_1 - 5, actual_qty_2)
-
+
webnotes.conn.set_default("company", self.old_default_company)
-
+
return se, pr.doc.name
-
+
def test_over_stock_return(self):
from erpnext.stock.doctype.stock_entry.stock_entry import StockOverReturnError
self._clear_stock_account_balance()
-
+
# out of 10, 5 gets returned
prev_se, pr_docname = self.test_purchase_receipt_return()
-
+
# submit purchase return - return another 6 qtys so that exception is raised
se = webnotes.bean(copy=test_records[0])
se.doc.purpose = "Purchase Return"
@@ -523,20 +525,20 @@
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 - _TC"
-
+
self.assertRaises(StockOverReturnError, se.insert)
-
+
def _test_purchase_return_jv(self, se):
from erpnext.stock.doctype.stock_entry.stock_entry import make_return_jv
jv_list = make_return_jv(se.doc.name)
-
+
self.assertEqual(len(jv_list), 3)
self.assertEqual(jv_list[0].get("voucher_type"), "Debit Note")
self.assertEqual(jv_list[0].get("posting_date"), se.doc.posting_date)
self.assertEqual(jv_list[1].get("account"), "_Test Supplier - _TC")
self.assertEqual(jv_list[2].get("account"), "_Test Account Cost for Goods Sold - _TC")
self.assertTrue(jv_list[1].get("against_voucher"))
-
+
def test_make_return_jv_for_purchase_receipt(self):
self._clear_stock_account_balance()
se, pr_name = self.test_purchase_receipt_return()
@@ -544,10 +546,10 @@
se, pr_name = self._test_purchase_return_return_against_purchase_order()
self._test_purchase_return_jv(se)
-
+
def _test_purchase_return_return_against_purchase_order(self):
self._clear_stock_account_balance()
-
+
actual_qty_0 = self._get_actual_qty()
from erpnext.buying.doctype.purchase_order.test_purchase_order \
@@ -555,7 +557,7 @@
from erpnext.buying.doctype.purchase_order.purchase_order import \
make_purchase_receipt, make_purchase_invoice
-
+
# submit purchase receipt
po = webnotes.bean(copy=purchase_order_test_records[0])
po.doc.is_subcontracted = None
@@ -563,34 +565,34 @@
po.doclist[1].import_rate = 50
po.insert()
po.submit()
-
+
pr_doclist = make_purchase_receipt(po.doc.name)
-
+
pr = webnotes.bean(pr_doclist)
pr.doc.posting_date = po.doc.transaction_date
pr.insert()
pr.submit()
-
+
actual_qty_1 = self._get_actual_qty()
-
+
self.assertEquals(actual_qty_0 + 10, actual_qty_1)
-
+
pi_doclist = make_purchase_invoice(po.doc.name)
-
+
pi = webnotes.bean(pi_doclist)
pi.doc.posting_date = pr.doc.posting_date
pi.doc.credit_to = "_Test Supplier - _TC"
for d in pi.doclist.get({"parentfield": "entries"}):
d.expense_head = "_Test Account Cost for Goods Sold - _TC"
d.cost_center = "_Test Cost Center - _TC"
- for d in pi.doclist.get({"parentfield": "purchase_tax_details"}):
+ for d in pi.doclist.get({"parentfield": "other_charges"}):
d.cost_center = "_Test Cost Center - _TC"
-
+
pi.run_method("calculate_taxes_and_totals")
pi.doc.bill_no = "NA"
pi.insert()
pi.submit()
-
+
# submit purchase return
se = webnotes.bean(copy=test_records[0])
se.doc.purpose = "Purchase Return"
@@ -601,23 +603,23 @@
se.doclist[1].s_warehouse = "_Test Warehouse - _TC"
se.insert()
se.submit()
-
+
actual_qty_2 = self._get_actual_qty()
-
+
self.assertEquals(actual_qty_1 - 5, actual_qty_2)
-
+
webnotes.conn.set_default("company", self.old_default_company)
-
+
return se, pr.doc.name
-
+
def _clear_stock_account_balance(self):
webnotes.conn.sql("delete from `tabStock Ledger Entry`")
webnotes.conn.sql("""delete from `tabBin`""")
webnotes.conn.sql("""delete from `tabGL Entry`""")
-
+
self.old_default_company = webnotes.conn.get_default("company")
webnotes.conn.set_default("company", "_Test Company")
-
+
def test_serial_no_not_reqd(self):
se = webnotes.bean(copy=test_records[0])
se.doclist[1].serial_no = "ABCD"
@@ -649,7 +651,7 @@
se.doclist[1].transfer_qty = 2
se.insert()
self.assertRaises(SerialNoQtyError, se.submit)
-
+
def test_serial_no_transfer_in(self):
self._clear_stock_account_balance()
se = webnotes.bean(copy=test_records[0])
@@ -659,13 +661,13 @@
se.doclist[1].transfer_qty = 2
se.insert()
se.submit()
-
+
self.assertTrue(webnotes.conn.exists("Serial No", "ABCD"))
self.assertTrue(webnotes.conn.exists("Serial No", "EFGH"))
-
+
se.cancel()
self.assertFalse(webnotes.conn.get_value("Serial No", "ABCD", "warehouse"))
-
+
def test_serial_no_not_exists(self):
self._clear_stock_account_balance()
se = webnotes.bean(copy=test_records[0])
@@ -678,11 +680,11 @@
se.doclist[1].transfer_qty = 2
se.insert()
self.assertRaises(SerialNoNotExistsError, se.submit)
-
+
def test_serial_duplicate(self):
self._clear_stock_account_balance()
self.test_serial_by_series()
-
+
se = webnotes.bean(copy=test_records[0])
se.doclist[1].item_code = "_Test Serialized Item With Series"
se.doclist[1].qty = 1
@@ -690,22 +692,22 @@
se.doclist[1].transfer_qty = 1
se.insert()
self.assertRaises(SerialNoDuplicateError, se.submit)
-
+
def test_serial_by_series(self):
self._clear_stock_account_balance()
se = make_serialized_item()
serial_nos = get_serial_nos(se.doclist[1].serial_no)
-
+
self.assertTrue(webnotes.conn.exists("Serial No", serial_nos[0]))
self.assertTrue(webnotes.conn.exists("Serial No", serial_nos[1]))
-
+
return se
def test_serial_item_error(self):
self._clear_stock_account_balance()
self.test_serial_by_series()
-
+
se = webnotes.bean(copy=test_records[0])
se.doc.purpose = "Material Transfer"
se.doclist[1].item_code = "_Test Serialized Item"
@@ -721,7 +723,7 @@
self._clear_stock_account_balance()
se = make_serialized_item()
serial_no = get_serial_nos(se.doclist[1].serial_no)[0]
-
+
se = webnotes.bean(copy=test_records[0])
se.doc.purpose = "Material Transfer"
se.doclist[1].item_code = "_Test Serialized Item With Series"
@@ -733,14 +735,14 @@
se.insert()
se.submit()
self.assertTrue(webnotes.conn.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse 1 - _TC")
-
+
se.cancel()
self.assertTrue(webnotes.conn.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse - _TC")
def test_serial_warehouse_error(self):
self._clear_stock_account_balance()
make_serialized_item()
-
+
se = webnotes.bean(copy=test_records[0])
se.doc.purpose = "Material Transfer"
se.doclist[1].item_code = "_Test Serialized Item With Series"
@@ -751,12 +753,12 @@
se.doclist[1].t_warehouse = "_Test Warehouse - _TC"
se.insert()
self.assertRaises(SerialNoWarehouseError, se.submit)
-
+
def test_serial_cancel(self):
self._clear_stock_account_balance()
se = self.test_serial_by_series()
se.cancel()
-
+
serial_no = get_serial_nos(se.doclist[1].serial_no)[0]
self.assertFalse(webnotes.conn.get_value("Serial No", serial_no, "warehouse"))
@@ -802,6 +804,23 @@
webnotes.defaults.clear_default("Warehouse", "_Test Warehouse 1 - _TC1", "test@example.com", parenttype="Restriction")
webnotes.defaults.clear_default("Warehouse", "_Test Warehouse 2 - _TC1", "test2@example.com", parenttype="Restriction")
+ def test_freeze_stocks (self):
+ self._clear_stock_account_balance()
+ webnotes.conn.set_value('Stock Settings', None,'stock_auth_role', '')
+
+ # test freeze_stocks_upto
+ date_newer_than_test_records = add_days(getdate(test_records[0][0]['posting_date']), 5)
+ webnotes.conn.set_value("Stock Settings", None, "stock_frozen_upto", date_newer_than_test_records)
+ se = webnotes.bean(copy=test_records[0]).insert()
+ self.assertRaises (StockFreezeError, se.submit)
+ webnotes.conn.set_value("Stock Settings", None, "stock_frozen_upto", '')
+
+ # test freeze_stocks_upto_days
+ webnotes.conn.set_value("Stock Settings", None, "stock_frozen_upto_days", 7)
+ se = webnotes.bean(copy=test_records[0]).insert()
+ self.assertRaises (StockFreezeError, se.submit)
+ webnotes.conn.set_value("Stock Settings", None, "stock_frozen_upto_days", 0)
+
def make_serialized_item():
se = webnotes.bean(copy=test_records[0])
se.doclist[1].item_code = "_Test Serialized Item With Series"
@@ -814,70 +833,70 @@
test_records = [
[
{
- "company": "_Test Company",
- "doctype": "Stock Entry",
- "posting_date": "2013-01-01",
- "posting_time": "17:14:24",
+ "company": "_Test Company",
+ "doctype": "Stock Entry",
+ "posting_date": "2013-01-01",
+ "posting_time": "17:14:24",
"purpose": "Material Receipt",
- "fiscal_year": "_Test Fiscal Year 2013",
- },
+ "fiscal_year": "_Test Fiscal Year 2013",
+ },
{
- "conversion_factor": 1.0,
- "doctype": "Stock Entry Detail",
- "item_code": "_Test Item",
- "parentfield": "mtn_details",
+ "conversion_factor": 1.0,
+ "doctype": "Stock Entry Detail",
+ "item_code": "_Test Item",
+ "parentfield": "mtn_details",
"incoming_rate": 100,
- "qty": 50.0,
- "stock_uom": "_Test UOM",
- "transfer_qty": 50.0,
+ "qty": 50.0,
+ "stock_uom": "_Test UOM",
+ "transfer_qty": 50.0,
"uom": "_Test UOM",
"t_warehouse": "_Test Warehouse - _TC",
"expense_account": "Stock Adjustment - _TC",
"cost_center": "_Test Cost Center - _TC"
- },
+ },
],
[
{
- "company": "_Test Company",
- "doctype": "Stock Entry",
- "posting_date": "2013-01-25",
- "posting_time": "17:15",
+ "company": "_Test Company",
+ "doctype": "Stock Entry",
+ "posting_date": "2013-01-25",
+ "posting_time": "17:15",
"purpose": "Material Issue",
- "fiscal_year": "_Test Fiscal Year 2013",
- },
+ "fiscal_year": "_Test Fiscal Year 2013",
+ },
{
- "conversion_factor": 1.0,
- "doctype": "Stock Entry Detail",
- "item_code": "_Test Item",
- "parentfield": "mtn_details",
+ "conversion_factor": 1.0,
+ "doctype": "Stock Entry Detail",
+ "item_code": "_Test Item",
+ "parentfield": "mtn_details",
"incoming_rate": 100,
- "qty": 40.0,
- "stock_uom": "_Test UOM",
- "transfer_qty": 40.0,
+ "qty": 40.0,
+ "stock_uom": "_Test UOM",
+ "transfer_qty": 40.0,
"uom": "_Test UOM",
"s_warehouse": "_Test Warehouse - _TC",
"expense_account": "Stock Adjustment - _TC",
"cost_center": "_Test Cost Center - _TC"
- },
+ },
],
[
{
- "company": "_Test Company",
- "doctype": "Stock Entry",
- "posting_date": "2013-01-25",
- "posting_time": "17:14:24",
+ "company": "_Test Company",
+ "doctype": "Stock Entry",
+ "posting_date": "2013-01-25",
+ "posting_time": "17:14:24",
"purpose": "Material Transfer",
- "fiscal_year": "_Test Fiscal Year 2013",
- },
+ "fiscal_year": "_Test Fiscal Year 2013",
+ },
{
- "conversion_factor": 1.0,
- "doctype": "Stock Entry Detail",
- "item_code": "_Test Item",
- "parentfield": "mtn_details",
+ "conversion_factor": 1.0,
+ "doctype": "Stock Entry Detail",
+ "item_code": "_Test Item",
+ "parentfield": "mtn_details",
"incoming_rate": 100,
- "qty": 45.0,
- "stock_uom": "_Test UOM",
- "transfer_qty": 45.0,
+ "qty": 45.0,
+ "stock_uom": "_Test UOM",
+ "transfer_qty": 45.0,
"uom": "_Test UOM",
"s_warehouse": "_Test Warehouse - _TC",
"t_warehouse": "_Test Warehouse 1 - _TC",
@@ -887,40 +906,40 @@
],
[
{
- "company": "_Test Company",
- "doctype": "Stock Entry",
- "posting_date": "2013-01-25",
- "posting_time": "17:14:24",
+ "company": "_Test Company",
+ "doctype": "Stock Entry",
+ "posting_date": "2013-01-25",
+ "posting_time": "17:14:24",
"purpose": "Manufacture/Repack",
- "fiscal_year": "_Test Fiscal Year 2013",
- },
+ "fiscal_year": "_Test Fiscal Year 2013",
+ },
{
- "conversion_factor": 1.0,
- "doctype": "Stock Entry Detail",
- "item_code": "_Test Item",
- "parentfield": "mtn_details",
+ "conversion_factor": 1.0,
+ "doctype": "Stock Entry Detail",
+ "item_code": "_Test Item",
+ "parentfield": "mtn_details",
"incoming_rate": 100,
- "qty": 50.0,
- "stock_uom": "_Test UOM",
- "transfer_qty": 50.0,
+ "qty": 50.0,
+ "stock_uom": "_Test UOM",
+ "transfer_qty": 50.0,
"uom": "_Test UOM",
"s_warehouse": "_Test Warehouse - _TC",
"expense_account": "Stock Adjustment - _TC",
"cost_center": "_Test Cost Center - _TC"
- },
+ },
{
- "conversion_factor": 1.0,
- "doctype": "Stock Entry Detail",
- "item_code": "_Test Item Home Desktop 100",
- "parentfield": "mtn_details",
+ "conversion_factor": 1.0,
+ "doctype": "Stock Entry Detail",
+ "item_code": "_Test Item Home Desktop 100",
+ "parentfield": "mtn_details",
"incoming_rate": 5000,
- "qty": 1,
- "stock_uom": "_Test UOM",
- "transfer_qty": 1,
+ "qty": 1,
+ "stock_uom": "_Test UOM",
+ "transfer_qty": 1,
"uom": "_Test UOM",
"t_warehouse": "_Test Warehouse - _TC",
"expense_account": "Stock Adjustment - _TC",
"cost_center": "_Test Cost Center - _TC"
},
],
-]
\ No newline at end of file
+]
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index e43761c..d6217dc 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -1,11 +1,15 @@
+
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
import webnotes
from webnotes import msgprint
-from webnotes.utils import flt, getdate
+from webnotes.utils import flt, getdate, add_days
from webnotes.model.controller import DocListController
+from datetime import date
+
+class StockFreezeError(webnotes.ValidationError): pass
class DocType(DocListController):
def __init__(self, doc, doclist=[]):
@@ -20,28 +24,29 @@
self.scrub_posting_time()
from erpnext.accounts.utils import validate_fiscal_year
- validate_fiscal_year(self.doc.posting_date, self.doc.fiscal_year, self.meta.get_label("posting_date"))
-
+ validate_fiscal_year(self.doc.posting_date, self.doc.fiscal_year,
+ self.meta.get_label("posting_date"))
+
def on_submit(self):
self.check_stock_frozen_date()
self.actual_amt_check()
from erpnext.stock.doctype.serial_no.serial_no import process_serial_no
process_serial_no(self.doc)
-
+
#check for item quantity available in stock
def actual_amt_check(self):
if self.doc.batch_no:
- batch_bal_after_transaction = flt(webnotes.conn.sql("""select sum(actual_qty)
- from `tabStock Ledger Entry`
- where warehouse=%s and item_code=%s and batch_no=%s""",
+ batch_bal_after_transaction = 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])
-
+
if batch_bal_after_transaction < 0:
self.doc.fields.update({
'batch_bal': batch_bal_after_transaction - self.doc.actual_qty
})
-
+
webnotes.throw("""Not enough quantity (requested: %(actual_qty)s, \
current: %(batch_bal)s in Batch <b>%(batch_no)s</b> for Item \
<b>%(item_code)s</b> at Warehouse <b>%(warehouse)s</b> \
@@ -59,41 +64,49 @@
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 = webnotes.conn.sql("""select name, has_batch_no, docstatus,
- is_stock_item, has_serial_no, serial_no_series
- from tabItem where name=%s""",
+ item_det = webnotes.conn.sql("""select name, has_batch_no, docstatus,
+ is_stock_item, has_serial_no, serial_no_series
+ from tabItem where name=%s""",
self.doc.item_code, as_dict=True)[0]
if item_det.is_stock_item != 'Yes':
webnotes.throw("""Item: "%s" is not a Stock Item.""" % self.doc.item_code)
-
+
# check if batch number is required
if item_det.has_batch_no =='Yes' and self.doc.voucher_type != 'Stock Reconciliation':
if not self.doc.batch_no:
webnotes.throw("Batch number is mandatory for Item '%s'" % self.doc.item_code)
-
+
# check if batch belongs to item
- if not webnotes.conn.sql("""select name from `tabBatch`
+ 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)):
webnotes.throw("'%s' is not a valid Batch Number for Item '%s'" % (self.doc.batch_no, self.doc.item_code))
-
+
if not self.doc.stock_uom:
self.doc.stock_uom = item_det.stock_uom
-
+
def check_stock_frozen_date(self):
stock_frozen_upto = webnotes.conn.get_value('Stock Settings', None, 'stock_frozen_upto') or ''
if stock_frozen_upto:
stock_auth_role = webnotes.conn.get_value('Stock Settings', None,'stock_auth_role')
if getdate(self.doc.posting_date) <= getdate(stock_frozen_upto) and not stock_auth_role in webnotes.user.get_roles():
- msgprint("You are not authorized to do / modify back dated stock entries before %s" % getdate(stock_frozen_upto).strftime('%d-%m-%Y'), raise_exception=1)
+ msgprint("You are not authorized to do / modify back dated stock entries before %s" % getdate(stock_frozen_upto).strftime('%d-%m-%Y'), raise_exception=StockFreezeError)
+
+ stock_frozen_upto_days = int(webnotes.conn.get_value('Stock Settings', None, 'stock_frozen_upto_days') or 0)
+ if stock_frozen_upto_days:
+ stock_auth_role = webnotes.conn.get_value('Stock Settings', None,'stock_auth_role')
+ older_than_x_days_ago = (add_days(getdate(self.doc.posting_date), stock_frozen_upto_days) <= date.today())
+ if older_than_x_days_ago and not stock_auth_role in webnotes.user.get_roles():
+ msgprint("You are not authorized to do / modify back dated stock entries older than %d days ago" %stock_frozen_upto_days, raise_exception=StockFreezeError)
+
def scrub_posting_time(self):
if not self.doc.posting_time or self.doc.posting_time == '00:0':
self.doc.posting_time = '00:00'
def on_doctype_update():
- if not webnotes.conn.sql("""show index from `tabStock Ledger Entry`
+ if not webnotes.conn.sql("""show index from `tabStock Ledger Entry`
where Key_name="posting_sort_index" """):
webnotes.conn.commit()
- webnotes.conn.sql("""alter table `tabStock Ledger Entry`
+ webnotes.conn.sql("""alter table `tabStock Ledger Entry`
add index posting_sort_index(posting_date, posting_time, name)""")
\ No newline at end of file
diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.py b/erpnext/stock/doctype/stock_settings/stock_settings.py
index e3e29b9..30a9490 100644
--- a/erpnext/stock/doctype/stock_settings/stock_settings.py
+++ b/erpnext/stock/doctype/stock_settings/stock_settings.py
@@ -5,18 +5,23 @@
from __future__ import unicode_literals
import webnotes
-
+from webnotes import _
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
-
+
def validate(self):
- for key in ["item_naming_by", "item_group", "stock_uom",
+ for key in ["item_naming_by", "item_group", "stock_uom",
"allow_negative_stock"]:
webnotes.conn.set_default(key, self.doc.fields.get(key, ""))
from erpnext.setup.doctype.naming_series.naming_series import set_by_naming_series
set_by_naming_series("Item", "item_code",
self.doc.get("item_naming_by")=="Naming Series", hide_name_field=True)
-
+
+ stock_frozen_limit = 356
+ submitted_stock_frozen = self.doc.stock_frozen_upto_days
+ if submitted_stock_frozen > stock_frozen_limit:
+ self.doc.stock_frozen_upto_days = stock_frozen_limit
+ webnotes.msgprint (_("`Freeze Stocks Older Than` should be smaller than %d days.") %stock_frozen_limit)
diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.txt b/erpnext/stock/doctype/stock_settings/stock_settings.txt
index de8c864..09e5ca4 100644
--- a/erpnext/stock/doctype/stock_settings/stock_settings.txt
+++ b/erpnext/stock/doctype/stock_settings/stock_settings.txt
@@ -1,25 +1,25 @@
[
{
- "creation": "2013-06-24 16:37:54",
- "docstatus": 0,
- "modified": "2013-12-20 19:21:48",
- "modified_by": "Administrator",
+ "creation": "2013-06-24 16:37:54",
+ "docstatus": 0,
+ "modified": "2014-01-27 20:00:56",
+ "modified_by": "Administrator",
"owner": "Administrator"
- },
+ },
{
- "description": "Settings",
- "doctype": "DocType",
- "icon": "icon-cog",
- "issingle": 1,
- "module": "Stock",
+ "description": "Settings",
+ "doctype": "DocType",
+ "icon": "icon-cog",
+ "issingle": 1,
+ "module": "Stock",
"name": "__common__"
- },
+ },
{
- "doctype": "DocField",
- "name": "__common__",
- "parent": "Stock Settings",
- "parentfield": "fields",
- "parenttype": "DocType",
+ "doctype": "DocField",
+ "name": "__common__",
+ "parent": "Stock Settings",
+ "parentfield": "fields",
+ "parenttype": "DocType",
"permlevel": 0
},
{
@@ -35,96 +35,102 @@
"read": 1,
"role": "Material Manager",
"write": 1
- },
+ },
{
- "doctype": "DocType",
+ "doctype": "DocType",
"name": "Stock Settings"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "item_naming_by",
- "fieldtype": "Select",
- "label": "Item Naming By",
+ "doctype": "DocField",
+ "fieldname": "item_naming_by",
+ "fieldtype": "Select",
+ "label": "Item Naming By",
"options": "Item Code\nNaming Series"
- },
+ },
{
- "description": "<a href=\"#Sales Browser/Item Group\">Add / Edit</a>",
- "doctype": "DocField",
- "fieldname": "item_group",
- "fieldtype": "Link",
- "label": "Default Item Group",
+ "description": "<a href=\"#Sales Browser/Item Group\">Add / Edit</a>",
+ "doctype": "DocField",
+ "fieldname": "item_group",
+ "fieldtype": "Link",
+ "label": "Default Item Group",
"options": "Item Group"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "stock_uom",
- "fieldtype": "Link",
- "label": "Default Stock UOM",
+ "doctype": "DocField",
+ "fieldname": "stock_uom",
+ "fieldtype": "Link",
+ "label": "Default Stock UOM",
"options": "UOM"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "column_break_4",
+ "doctype": "DocField",
+ "fieldname": "column_break_4",
"fieldtype": "Column Break"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "allow_negative_stock",
- "fieldtype": "Check",
+ "doctype": "DocField",
+ "fieldname": "allow_negative_stock",
+ "fieldtype": "Check",
"label": "Allow Negative Stock"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "valuation_method",
- "fieldtype": "Select",
- "label": "Default Valuation Method",
+ "doctype": "DocField",
+ "fieldname": "valuation_method",
+ "fieldtype": "Select",
+ "label": "Default Valuation Method",
"options": "FIFO\nMoving Average"
- },
+ },
{
- "description": "Percentage you are allowed to receive or deliver more against the quantity ordered. For example: If you have ordered 100 units. and your Allowance is 10% then you are allowed to receive 110 units.",
- "doctype": "DocField",
- "fieldname": "tolerance",
- "fieldtype": "Float",
+ "description": "Percentage you are allowed to receive or deliver more against the quantity ordered. For example: If you have ordered 100 units. and your Allowance is 10% then you are allowed to receive 110 units.",
+ "doctype": "DocField",
+ "fieldname": "tolerance",
+ "fieldtype": "Float",
"label": "Allowance Percent"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "auto_material_request",
- "fieldtype": "Section Break",
+ "doctype": "DocField",
+ "fieldname": "auto_material_request",
+ "fieldtype": "Section Break",
"label": "Auto Material Request"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "auto_indent",
- "fieldtype": "Check",
+ "doctype": "DocField",
+ "fieldname": "auto_indent",
+ "fieldtype": "Check",
"label": "Raise Material Request when stock reaches re-order level"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "reorder_email_notify",
- "fieldtype": "Check",
+ "doctype": "DocField",
+ "fieldname": "reorder_email_notify",
+ "fieldtype": "Check",
"label": "Notify by Email on creation of automatic Material Request"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "freeze_stock_entries",
- "fieldtype": "Section Break",
+ "doctype": "DocField",
+ "fieldname": "freeze_stock_entries",
+ "fieldtype": "Section Break",
"label": "Freeze Stock Entries"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "stock_frozen_upto",
- "fieldtype": "Date",
+ "doctype": "DocField",
+ "fieldname": "stock_frozen_upto",
+ "fieldtype": "Date",
"label": "Stock Frozen Upto"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "stock_auth_role",
- "fieldtype": "Link",
- "label": "Role Allowed to edit frozen stock",
+ "doctype": "DocField",
+ "fieldname": "stock_frozen_upto_days",
+ "fieldtype": "Int",
+ "label": "Freeze Stocks Older Than [Days]"
+ },
+ {
+ "doctype": "DocField",
+ "fieldname": "stock_auth_role",
+ "fieldtype": "Link",
+ "label": "Role Allowed to edit frozen stock",
"options": "Role"
- },
+ },
{
"doctype": "DocPerm"
}
-]
\ No newline at end of file
+]
diff --git a/erpnext/utilities/doctype/address/address.py b/erpnext/utilities/doctype/address/address.py
index ad6e049..e371b51 100644
--- a/erpnext/utilities/doctype/address/address.py
+++ b/erpnext/utilities/doctype/address/address.py
@@ -4,7 +4,7 @@
from __future__ import unicode_literals
import webnotes
-from webnotes import msgprint
+from webnotes import msgprint, throw, _
from webnotes.utils import cstr, cint
class DocType:
@@ -16,11 +16,11 @@
if not self.doc.address_title:
self.doc.address_title = self.doc.customer \
or self.doc.supplier or self.doc.sales_partner or self.doc.lead
-
+
if self.doc.address_title:
self.doc.name = cstr(self.doc.address_title).strip() + "-" + cstr(self.doc.address_type).strip()
else:
- webnotes.msgprint("""Address Title is mandatory.""" + self.doc.customer, raise_exception=True)
+ throw(_("Address Title is mandatory."))
def validate(self):
self.validate_primary_address()
diff --git a/erpnext/utilities/transaction_base.py b/erpnext/utilities/transaction_base.py
index 2c6357a..8df7f25 100644
--- a/erpnext/utilities/transaction_base.py
+++ b/erpnext/utilities/transaction_base.py
@@ -64,7 +64,7 @@
out[f] = customer.fields.get(f)
# fields prepended with default in Customer doctype
- for f in ['sales_partner', 'commission_rate', 'currency', 'price_list']:
+ for f in ['sales_partner', 'commission_rate', 'currency', 'price_list', 'taxes_and_charges']:
if customer.fields.get("default_" + f):
out[f] = customer.fields.get("default_" + f)
@@ -115,7 +115,7 @@
sales_person.update({
"doctype": "Sales Team",
"parentfield": "sales_team",
- "idx": i+1
+ "idx": i + 1
})
# add child
@@ -128,12 +128,17 @@
out["supplier_name"] = supplier.supplier_name
if supplier.default_currency:
out["currency"] = supplier.default_currency
+
+ # fields prepended with default in Customer doctype
+ for f in ['currency', 'taxes_and_charges']:
+ if supplier.fields.get("default_" + f):
+ out[f] = supplier.fields.get("default_" + f)
out["buying_price_list"] = self.get_user_default_price_list("buying_price_list") or \
supplier.default_price_list or self.doc.buying_price_list
return out
-
+
def set_supplier_defaults(self):
for fieldname, val in self.get_supplier_defaults().items():
if self.meta.get_field(fieldname):
diff --git a/patches/1401/fix_planned_qty.py b/patches/1401/fix_planned_qty.py
new file mode 100644
index 0000000..979d949
--- /dev/null
+++ b/patches/1401/fix_planned_qty.py
@@ -0,0 +1,13 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+import webnotes
+
+def execute():
+ webnotes.conn.auto_commit_on_many_writes = 1
+ from utilities.repost_stock import repost_stock
+ for d in webnotes.conn.sql("""select distinct production_item, fg_warehouse
+ from `tabProduction Order` where docstatus>0""", as_dict=1):
+ repost_stock(d.production_item, d.fg_warehouse)
+
+ webnotes.conn.auto_commit_on_many_writes = 0
\ No newline at end of file
diff --git a/patches/1401/fix_serial_no_status_and_warehouse.py b/patches/1401/fix_serial_no_status_and_warehouse.py
new file mode 100644
index 0000000..9e5579c
--- /dev/null
+++ b/patches/1401/fix_serial_no_status_and_warehouse.py
@@ -0,0 +1,19 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+
+def execute():
+ serial_nos = webnotes.conn.sql("""select name from `tabSerial No` where docstatus=0
+ and status in ('Available', 'Sales Returned') and ifnull(warehouse, '') = ''""")
+ for sr in serial_nos:
+ try:
+ last_sle = webnotes.bean("Serial No", sr[0]).make_controller().get_last_sle()
+ if last_sle.actual_qty > 0:
+ webnotes.conn.set_value("Serial No", sr[0], "warehouse", last_sle.warehouse)
+
+ webnotes.conn.commit()
+ except:
+ pass
\ No newline at end of file