Merge remote-tracking branch 'webnotes/develop' into 4.0.0-wip

Conflicts:
	config.json
	erpnext/accounts/utils.py
	erpnext/patches/patch_list.py
	erpnext/stock/doctype/price_list/price_list.txt
	erpnext/stock/doctype/warehouse/warehouse.py
	portal/templates/sale.html
	portal/utils.py
	selling/doctype/sales_order/templates/pages/order.py
	selling/utils/cart.py
	selling/utils/product.py
	utilities/demo/demo_docs/Fiscal_Year.csv
	utilities/demo/make_demo.py
This commit is contained in:
Anand Doshi 2014-01-24 21:44:36 +05:30
commit cb39e0878e
20 changed files with 147 additions and 90 deletions

View File

@ -127,6 +127,7 @@ erpnext.POS = Class.extend({
this.party = party; this.party = party;
this.price_list = (party == "Customer" ? this.price_list = (party == "Customer" ?
this.frm.doc.selling_price_list : this.frm.doc.buying_price_list); this.frm.doc.selling_price_list : this.frm.doc.buying_price_list);
this.price_list_field = (party == "Customer" ? "selling_price_list" : "buying_price_list");
this.sales_or_purchase = (party == "Customer" ? "Sales" : "Purchase"); this.sales_or_purchase = (party == "Customer" ? "Sales" : "Purchase");
this.net_total = "net_total_" + export_or_import; this.net_total = "net_total_" + export_or_import;
this.grand_total = "grand_total_" + export_or_import; this.grand_total = "grand_total_" + export_or_import;
@ -287,22 +288,17 @@ erpnext.POS = Class.extend({
this.frm.cscript.fname, this.frm.doctype), function(i, d) { this.frm.cscript.fname, this.frm.doctype), function(i, d) {
if (d.item_code == item_code) { if (d.item_code == item_code) {
caught = true; caught = true;
if (serial_no) { if (serial_no)
d.serial_no += '\n' + serial_no; wn.model.set_value(d.doctype, d.name, "serial_no", d.serial_no + '\n' + serial_no);
me.frm.script_manager.trigger("serial_no", d.doctype, d.name); else
} wn.model.set_value(d.doctype, d.name, "qty", d.qty + 1);
else {
d.qty += 1;
me.frm.script_manager.trigger("qty", d.doctype, d.name);
}
} }
}); });
} }
// if item not found then add new item // if item not found then add new item
if (!caught) { if (!caught)
this.add_new_item_to_grid(item_code, serial_no); this.add_new_item_to_grid(item_code, serial_no);
}
this.refresh(); this.refresh();
this.refresh_search_box(); this.refresh_search_box();
@ -337,15 +333,16 @@ erpnext.POS = Class.extend({
wn.model.clear_doc(d.doctype, d.name); wn.model.clear_doc(d.doctype, d.name);
me.refresh_grid(); me.refresh_grid();
} else { } else {
d.qty = qty; wn.model.set_value(d.doctype, d.name, "qty", qty);
me.frm.script_manager.trigger("qty", d.doctype, d.name);
} }
} }
}); });
me.refresh(); this.refresh();
}, },
refresh: function() { refresh: function() {
var me = this; var me = this;
this.refresh_item_list();
this.party_field.set_input(this.frm.doc[this.party.toLowerCase()]); this.party_field.set_input(this.frm.doc[this.party.toLowerCase()]);
this.wrapper.find('input.discount-amount').val(this.frm.doc.discount_amount); this.wrapper.find('input.discount-amount').val(this.frm.doc.discount_amount);
this.barcode.set_input(""); this.barcode.set_input("");
@ -369,6 +366,14 @@ erpnext.POS = Class.extend({
this.make_party(); this.make_party();
} }
}, },
refresh_item_list: function() {
var me = this;
// refresh item list on change of price list
if (this.frm.doc[this.price_list_field] != this.price_list) {
this.price_list = this.frm.doc[this.price_list_field];
this.make_item_list();
}
},
show_items_in_item_cart: function() { show_items_in_item_cart: function() {
var me = this; var me = this;
var $items = this.wrapper.find("#cart tbody").empty(); var $items = this.wrapper.find("#cart tbody").empty();
@ -402,9 +407,8 @@ erpnext.POS = Class.extend({
)).appendTo($items); )).appendTo($items);
}); });
this.wrapper.find(".increase-qty, .decrease-qty").on("click", function() { this.wrapper.find("input.qty").on("focus", function() {
var item_code = $(this).closest("tr").attr("id"); $(this).select();
me.selected_item_qty_operation(item_code, $(this).attr("class"));
}); });
}, },
show_taxes: function() { show_taxes: function() {
@ -441,10 +445,16 @@ erpnext.POS = Class.extend({
// append quantity to the respective item after change from input box // append quantity to the respective item after change from input box
$(this.wrapper).find("input.qty").on("change", function() { $(this.wrapper).find("input.qty").on("change", function() {
var item_code = $(this).closest("tr")[0].id; var item_code = $(this).closest("tr").attr("id");
me.update_qty(item_code, $(this).val()); me.update_qty(item_code, $(this).val());
}); });
// increase/decrease qty on plus/minus button
$(this.wrapper).find(".increase-qty, .decrease-qty").on("click", function() {
var tr = $(this).closest("tr");
me.increase_decrease_qty(tr, $(this).attr("class"));
});
// on td click toggle the highlighting of row // on td click toggle the highlighting of row
$(this.wrapper).find("#cart tbody tr td").on("click", function() { $(this.wrapper).find("#cart tbody tr td").on("click", function() {
var row = $(this).closest("tr"); var row = $(this).closest("tr");
@ -462,6 +472,15 @@ erpnext.POS = Class.extend({
me.refresh_delete_btn(); me.refresh_delete_btn();
this.barcode.$input.focus(); this.barcode.$input.focus();
}, },
increase_decrease_qty: function(tr, operation) {
var item_code = tr.attr("id");
var item_qty = cint(tr.find("input.qty").val());
if (operation == "increase-qty")
this.update_qty(item_code, item_qty + 1);
else if (operation == "decrease-qty" && item_qty != 1)
this.update_qty(item_code, item_qty - 1);
},
disable_text_box_and_button: function() { disable_text_box_and_button: function() {
var me = this; var me = this;
// if form is submitted & cancelled then disable all input box & buttons // if form is submitted & cancelled then disable all input box & buttons
@ -533,26 +552,11 @@ erpnext.POS = Class.extend({
this.refresh_grid(); this.refresh_grid();
}, },
refresh_grid: function() { refresh_grid: function() {
this.frm.dirty();
this.frm.fields_dict[this.frm.cscript.fname].grid.refresh(); this.frm.fields_dict[this.frm.cscript.fname].grid.refresh();
this.frm.script_manager.trigger("calculate_taxes_and_totals"); this.frm.script_manager.trigger("calculate_taxes_and_totals");
this.refresh(); this.refresh();
}, },
selected_item_qty_operation: function(item_code, operation) {
var me = this;
var child = wn.model.get_children(this.frm.doctype + " Item", this.frm.doc.name,
this.frm.cscript.fname, this.frm.doctype);
$.each(child, function(i, d) {
if (d.item_code == item_code) {
if (operation == "increase-qty")
d.qty += 1;
else if (operation == "decrease-qty")
d.qty != 1 ? d.qty -= 1 : d.qty = 1;
me.refresh();
}
});
},
make_payment: function() { make_payment: function() {
var me = this; var me = this;
var no_of_items = $(this.wrapper).find("#cart tbody tr").length; var no_of_items = $(this.wrapper).find("#cart tbody tr").length;

View File

@ -320,12 +320,9 @@ class DocType(SellingController):
item = webnotes.conn.sql("select name,is_asset_item,is_sales_item from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life > now())"% d.item_code) item = webnotes.conn.sql("select name,is_asset_item,is_sales_item from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life > now())"% d.item_code)
acc = webnotes.conn.sql("select account_type from `tabAccount` where name = '%s' and docstatus != 2" % d.income_account) acc = webnotes.conn.sql("select account_type from `tabAccount` where name = '%s' and docstatus != 2" % d.income_account)
if not acc: if not acc:
msgprint("Account: "+d.income_account+" does not exist in the system") msgprint("Account: "+d.income_account+" does not exist in the system", raise_exception=True)
raise Exception
elif item and item[0][1] == 'Yes' and not acc[0][0] == 'Fixed Asset Account': elif item and item[0][1] == 'Yes' and not acc[0][0] == 'Fixed Asset Account':
msgprint("Please select income head with account type 'Fixed Asset Account' as Item %s is an asset item" % d.item_code) msgprint("Please select income head with account type 'Fixed Asset Account' as Item %s is an asset item" % d.item_code, raise_exception=True)
raise Exception
def validate_with_previous_doc(self): def validate_with_previous_doc(self):
super(DocType, self).validate_with_previous_doc(self.tname, { super(DocType, self).validate_with_previous_doc(self.tname, {

View File

@ -37,12 +37,15 @@ class AccountsReceivableReport(object):
return columns return columns
def get_data(self, customer_naming_by): def get_data(self, customer_naming_by):
from erpnext.accounts.utils import get_currency_precision
currency_precision = get_currency_precision() or 2
data = [] data = []
future_vouchers = self.get_entries_after(self.filters.report_date) future_vouchers = self.get_entries_after(self.filters.report_date)
for gle in self.get_entries_till(self.filters.report_date): for gle in self.get_entries_till(self.filters.report_date):
if self.is_receivable(gle, future_vouchers): if self.is_receivable(gle, future_vouchers):
outstanding_amount = self.get_outstanding_amount(gle, self.filters.report_date) outstanding_amount = self.get_outstanding_amount(gle, self.filters.report_date)
if abs(outstanding_amount) > 0.0: if abs(outstanding_amount) > 0.1/10**currency_precision:
due_date = self.get_due_date(gle) due_date = self.get_due_date(gle)
invoiced_amount = gle.debit if (gle.debit > 0) else 0 invoiced_amount = gle.debit if (gle.debit > 0) else 0
payment_received = invoiced_amount - outstanding_amount payment_received = invoiced_amount - outstanding_amount

View File

@ -34,7 +34,7 @@ def validate_filters(filters, account_details):
def get_columns(): def get_columns():
return ["Posting Date:Date:100", "Account:Link/Account:200", "Debit:Float:100", return ["Posting Date:Date:100", "Account:Link/Account:200", "Debit:Float:100",
"Credit:Float:100", "Voucher Type::120", "Voucher No::160", "Link::20", "Credit:Float:100", "Voucher Type::120", "Voucher No::160", "Link::20",
"Against Account::120", "Cost Center:Link/Cost Center:100", "Remarks::200"] "Against Account::120", "Cost Center:Link/Cost Center:100", "Remarks::400"]
def get_result(filters, account_details): def get_result(filters, account_details):
gl_entries = get_gl_entries(filters) gl_entries = get_gl_entries(filters)
@ -51,7 +51,7 @@ def get_gl_entries(filters):
gl_entries = webnotes.conn.sql("""select posting_date, account, gl_entries = webnotes.conn.sql("""select posting_date, account,
sum(ifnull(debit, 0)) as debit, sum(ifnull(credit, 0)) as credit, sum(ifnull(debit, 0)) as debit, sum(ifnull(credit, 0)) as credit,
voucher_type, voucher_no, cost_center, remarks, is_advance, against voucher_type, voucher_no, cost_center, remarks, is_opening, against
from `tabGL Entry` from `tabGL Entry`
where company=%(company)s {conditions} where company=%(company)s {conditions}
{group_by_condition} {group_by_condition}
@ -138,7 +138,7 @@ def get_accountwise_gle(filters, gl_entries, gle_map):
for gle in gl_entries: for gle in gl_entries:
amount = flt(gle.debit) - flt(gle.credit) amount = flt(gle.debit) - flt(gle.credit)
if filters.get("account") and (gle.posting_date < filters.from_date if filters.get("account") and (gle.posting_date < filters.from_date
or cstr(gle.is_advance) == "Yes"): or cstr(gle.is_opening) == "Yes"):
gle_map[gle.account].opening += amount gle_map[gle.account].opening += amount
opening += amount opening += amount
elif gle.posting_date <= filters.to_date: elif gle.posting_date <= filters.to_date:

View File

@ -379,3 +379,12 @@ def get_account_for(account_for_doctype, account_for):
return webnotes.conn.get_value("Account", {account_for_field: account_for_doctype, return webnotes.conn.get_value("Account", {account_for_field: account_for_doctype,
"master_name": account_for}) "master_name": account_for})
def get_currency_precision(currency=None):
if not currency:
currency = webnotes.conn.get_value("Company",
webnotes.conn.get_default("company"), "default_currency")
currency_format = webnotes.conn.get_value("Currency", currency, "number_format")
from webnotes.utils import get_number_format_info
return get_number_format_info(currency_format)[2]

View File

@ -3,7 +3,7 @@
{% include 'setup/doctype/contact_control/contact_control.js' %}; {% include 'setup/doctype/contact_control/contact_control.js' %};
cur_frm.cscript.refresh = function(doc,dt,dn) { cur_frm.cscript.refresh = function(doc, dt, dn) {
cur_frm.cscript.make_dashboard(doc); cur_frm.cscript.make_dashboard(doc);
erpnext.hide_naming_series(); erpnext.hide_naming_series();
@ -93,7 +93,7 @@ cur_frm.cscript.make_contact = function() {
cur_frm.contact_list.run(); cur_frm.contact_list.run();
} }
cur_frm.fields_dict['default_price_list'].get_query = function(doc,cdt,cdn) { cur_frm.fields_dict['default_price_list'].get_query = function(doc, cdt, cdn) {
return{ return{
filters:{'buying': 1} filters:{'buying': 1}
} }

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-05-13 16:10:02", "creation": "2013-05-13 16:10:02",
"docstatus": 0, "docstatus": 0,
"modified": "2013-05-13 16:21:07", "modified": "2014-01-24 18:19:11",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -11,7 +11,7 @@
"doctype": "Report", "doctype": "Report",
"is_standard": "Yes", "is_standard": "Yes",
"name": "__common__", "name": "__common__",
"query": "select \n mr.name as \"Material Request:Link/Material Request:120\",\n\tmr.transaction_date as \"Date:Date:100\",\n\tmr_item.item_code as \"Item Code:Link/Item:120\",\n\tmr_item.qty as \"Qty:Float:100\",\n\tmr_item.ordered_qty as \"Ordered Qty:Float:100\", \n\t(mr_item.qty - ifnull(mr_item.ordered_qty, 0)) as \"Qty to Order:Float:100\",\n\tmr_item.item_name as \"Item Name::150\",\n\tmr_item.description as \"Description::200\"\nfrom\n\t`tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere\n\tmr_item.parent = mr.name\n\tand mr.material_request_type = \"Purchase\"\n\tand mr.docstatus = 1\n\tand mr.status != \"Stopped\"\n\tand ifnull(mr_item.ordered_qty, 0) < ifnull(mr_item.qty, 0)\norder by mr.transaction_date asc", "query": "select \n mr.name as \"Material Request:Link/Material Request:120\",\n\tmr.transaction_date as \"Date:Date:100\",\n\tmr_item.item_code as \"Item Code:Link/Item:120\",\n\tsum(ifnull(mr_item.qty, 0)) as \"Qty:Float:100\",\n\tsum(ifnull(mr_item.ordered_qty, 0)) as \"Ordered Qty:Float:100\", \n\t(sum(mr_item.qty) - sum(ifnull(mr_item.ordered_qty, 0))) as \"Qty to Order:Float:100\",\n\tmr_item.item_name as \"Item Name::150\",\n\tmr_item.description as \"Description::200\"\nfrom\n\t`tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere\n\tmr_item.parent = mr.name\n\tand mr.material_request_type = \"Purchase\"\n\tand mr.docstatus = 1\n\tand mr.status != \"Stopped\"\ngroup by mr.name, mr_item.item_code\nhaving\n\tsum(ifnull(mr_item.ordered_qty, 0)) < sum(ifnull(mr_item.qty, 0))\norder by mr.transaction_date asc",
"ref_doctype": "Purchase Order", "ref_doctype": "Purchase Order",
"report_name": "Requested Items To Be Ordered", "report_name": "Requested Items To Be Ordered",
"report_type": "Query Report" "report_type": "Query Report"

View File

@ -89,8 +89,10 @@ def _get_price_list_rate(args, item_bean, meta):
# try fetching from price list # try fetching from price list
if args.buying_price_list and args.price_list_currency: if args.buying_price_list and args.price_list_currency:
price_list_rate = webnotes.conn.sql("""select ref_rate from `tabItem Price` price_list_rate = webnotes.conn.sql("""select ip.ref_rate from
where price_list=%s and item_code=%s and buying=1""", `tabItem Price` ip, `tabPrice List` pl
where ip.price_list=pl.name and ip.price_list=%s and
ip.item_code=%s and ip.buying=1 and pl.enabled=1""",
(args.buying_price_list, args.item_code), as_dict=1) (args.buying_price_list, args.item_code), as_dict=1)
if price_list_rate: if price_list_rate:

View File

@ -1,3 +1,4 @@
erpnext.patches.1401.enable_all_price_list
erpnext.patches.4_0.update_user_properties erpnext.patches.4_0.update_user_properties
erpnext.patches.4_0.move_warehouse_user_to_restrictions erpnext.patches.4_0.move_warehouse_user_to_restrictions
erpnext.patches.4_0.new_permissions erpnext.patches.4_0.new_permissions
@ -18,4 +19,4 @@ execute:webnotes.reload_doc('selling', 'Print Format', 'Sales Order Modern') # 2
execute:webnotes.reload_doc('selling', 'Print Format', 'Sales Order Spartan') # 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 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 Modern') # 2014-01-03
execute:webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Spartan') # 2014-01-03 execute:webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Spartan') # 2014-01-03

View File

@ -0,0 +1,9 @@
# Copyright (c) 2014, 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("stock", "doctype", "price_list")
webnotes.conn.sql("""update `tabPrice List` set enabled=1""")

View File

@ -270,4 +270,5 @@ patch_list = [
"execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2013-12-26", "execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2013-12-26",
"execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2013-12-26", "execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2013-12-26",
"execute:webnotes.reload_doc('stock', 'doctype', 'delivery_note') # 2013-12-26", "execute:webnotes.reload_doc('stock', 'doctype', 'delivery_note') # 2013-12-26",
"patches.1401.enable_all_price_list",
] ]

View File

@ -18,7 +18,7 @@ cur_frm.cscript.load_defaults = function(doc, dt, dn) {
cur_frm.add_fetch('lead_name', 'company_name', 'customer_name'); cur_frm.add_fetch('lead_name', 'company_name', 'customer_name');
cur_frm.add_fetch('default_sales_partner','commission_rate','default_commission_rate'); cur_frm.add_fetch('default_sales_partner','commission_rate','default_commission_rate');
cur_frm.cscript.refresh = function(doc,dt,dn) { cur_frm.cscript.refresh = function(doc, dt, dn) {
cur_frm.cscript.setup_dashboard(doc); cur_frm.cscript.setup_dashboard(doc);
erpnext.hide_naming_series(); erpnext.hide_naming_series();
@ -107,20 +107,20 @@ cur_frm.cscript.make_contact = function() {
} }
cur_frm.fields_dict['customer_group'].get_query = function(doc,dt,dn) { cur_frm.fields_dict['customer_group'].get_query = function(doc, dt, dn) {
return{ return{
filters:{'is_group': 'No'} filters:{'is_group': 'No'}
} }
} }
cur_frm.fields_dict.lead_name.get_query = function(doc,cdt,cdn) { cur_frm.fields_dict.lead_name.get_query = function(doc, cdt, cdn) {
return{ return{
query: "erpnext.controllers.queries.lead_query" query: "erpnext.controllers.queries.lead_query"
} }
} }
cur_frm.fields_dict['default_price_list'].get_query = function(doc,cdt,cdn) { cur_frm.fields_dict['default_price_list'].get_query = function(doc, cdt, cdn) {
return{ return{
filters:{'selling': 1} filters:{'selling': 1}
} }

View File

@ -150,8 +150,10 @@ def _get_basic_details(args, item_bean, warehouse_fieldname):
return out return out
def _get_price_list_rate(args, item_bean, meta): def _get_price_list_rate(args, item_bean, meta):
ref_rate = webnotes.conn.sql("""select ref_rate from `tabItem Price` ref_rate = webnotes.conn.sql("""select ip.ref_rate from
where price_list=%s and item_code=%s and selling=1""", `tabItem Price` ip, `tabPrice List` pl
where ip.price_list=pl.name and ip.price_list=%s and
ip.item_code=%s and ip.selling=1 and pl.enabled=1""",
(args.selling_price_list, args.item_code), as_dict=1) (args.selling_price_list, args.item_code), as_dict=1)
if not ref_rate: if not ref_rate:

View File

@ -98,6 +98,7 @@ def create_price_lists(args):
{ {
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "Standard " + pl_type, "price_list_name": "Standard " + pl_type,
"enabled": 1,
"buying": 1 if pl_type == "Buying" else 0, "buying": 1 if pl_type == "Buying" else 0,
"selling": 1 if pl_type == "Selling" else 0, "selling": 1 if pl_type == "Selling" else 0,
"currency": args["currency"] "currency": args["currency"]

View File

@ -3,7 +3,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import webnotes import webnotes
from webnotes import _, msgprint from webnotes import _, msgprint, throw
import json import json
def get_company_currency(company): def get_company_currency(company):
@ -11,8 +11,8 @@ def get_company_currency(company):
if not currency: if not currency:
currency = webnotes.conn.get_default("currency") currency = webnotes.conn.get_default("currency")
if not currency: if not currency:
msgprint(_('Please specify Default Currency in Company Master \ throw(_('Please specify Default Currency in Company Master \
and Global Defaults'), raise_exception=True) and Global Defaults'))
return currency return currency
@ -32,5 +32,14 @@ def get_ancestors_of(doctype, name):
@webnotes.whitelist() @webnotes.whitelist()
def get_price_list_currency(price_list): def get_price_list_currency(price_list):
return {"price_list_currency": webnotes.conn.get_value("Price List", price_list, price_list_currency = webnotes.conn.get_value("Price List", {"name": price_list,
"currency")} "enabled": 1}, "currency")
if not price_list_currency:
throw("{message}: {price_list} {disabled}".format(**{
"message": _("Price List"),
"price_list": price_list,
"disabled": _("is disabled.")
}))
else:
return {"price_list_currency": price_list_currency}

View File

@ -3,7 +3,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import webnotes import webnotes
from webnotes import _ from webnotes import throw, _
class ItemPriceDuplicateItem(webnotes.ValidationError): pass class ItemPriceDuplicateItem(webnotes.ValidationError): pass
@ -12,26 +12,36 @@ class DocType:
self.doc, self.doclist = d, dl self.doc, self.doclist = d, dl
def validate(self): def validate(self):
self.validate_price_list()
self.check_duplicate_item() self.check_duplicate_item()
self.update_price_list_details() self.update_price_list_details()
self.update_item_details() self.update_item_details()
def update_price_list_details(self): def validate_price_list(self):
self.doc.buying, self.doc.selling, self.doc.currency = webnotes.conn.get_value("Price List", enabled = webnotes.conn.get_value("Price List", self.doc.price_list, "enabled")
self.doc.price_list, ["buying", "selling", "currency"]) if not enabled:
throw("{message}: {price_list} {disabled}".format(**{
def update_item_details(self): "message": _("Price List"),
self.doc.item_name, self.doc.item_description = webnotes.conn.get_value("Item", "price_list": self.doc.price_list,
self.doc.item_code, ["item_name", "description"]) "disabled": _("is disabled.")
}))
def check_duplicate_item(self): def check_duplicate_item(self):
if webnotes.conn.sql("""select name from `tabItem Price` if webnotes.conn.sql("""select name from `tabItem Price`
where item_code=%s and price_list=%s and name!=%s""", where item_code=%s and price_list=%s and name!=%s""",
(self.doc.item_code, self.doc.price_list, self.doc.name)): (self.doc.item_code, self.doc.price_list, self.doc.name)):
webnotes.throw("{duplicate_item}: {item_code}, {already}: {price_list}".format(**{ throw("{duplicate_item}: {item_code}, {already}: {price_list}".format(**{
"duplicate_item": _("Duplicate Item"), "duplicate_item": _("Duplicate Item"),
"item_code": self.doc.item_code, "item_code": self.doc.item_code,
"already": _("already available in Price List"), "already": _("already available in Price List"),
"price_list": self.doc.price_list "price_list": self.doc.price_list
}), ItemPriceDuplicateItem) }), ItemPriceDuplicateItem)
def update_price_list_details(self):
self.doc.buying, self.doc.selling, self.doc.currency = webnotes.conn.get_value("Price List",
{"name": self.doc.price_list, "enabled": 1}, ["buying", "selling", "currency"])
def update_item_details(self):
self.doc.item_name, self.doc.item_description = webnotes.conn.get_value("Item",
self.doc.item_code, ["item_name", "description"])

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-01-25 11:35:09", "creation": "2013-01-25 11:35:09",
"docstatus": 0, "docstatus": 0,
"modified": "2014-01-20 17:48:59", "modified": "2014-01-20 17:50:00",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -41,6 +41,18 @@
"doctype": "DocType", "doctype": "DocType",
"name": "Price List" "name": "Price List"
}, },
{
"default": "1",
"doctype": "DocField",
"fieldname": "enabled",
"fieldtype": "Check",
"label": "Enabled"
},
{
"doctype": "DocField",
"fieldname": "sb_1",
"fieldtype": "Section Break"
},
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "price_list_name", "fieldname": "price_list_name",

View File

@ -11,6 +11,7 @@ test_records = [
{ {
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "_Test Price List", "price_list_name": "_Test Price List",
"enabled": 1,
"currency": "INR", "currency": "INR",
"selling": 1 "selling": 1
}, },
@ -24,6 +25,7 @@ test_records = [
{ {
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "_Test Price List 2", "price_list_name": "_Test Price List 2",
"enabled": 1,
"currency": "INR", "currency": "INR",
"selling": 1 "selling": 1
}, },
@ -37,6 +39,7 @@ test_records = [
{ {
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "_Test Price List India", "price_list_name": "_Test Price List India",
"enabled": 1,
"currency": "INR", "currency": "INR",
"selling": 1 "selling": 1
}, },
@ -50,6 +53,7 @@ test_records = [
{ {
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "_Test Price List Rest of the World", "price_list_name": "_Test Price List Rest of the World",
"enabled": 1,
"currency": "USD", "currency": "USD",
"selling": 1 "selling": 1
}, },

View File

@ -4,7 +4,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import webnotes import webnotes
from webnotes.utils import cint, validate_email_add from webnotes.utils import cint, validate_email_add
from webnotes import msgprint, _ from webnotes import throw, msgprint, _
class DocType: class DocType:
def __init__(self, doc, doclist=[]): def __init__(self, doc, doclist=[]):
@ -18,7 +18,7 @@ class DocType:
def validate(self): def validate(self):
if self.doc.email_id and not validate_email_add(self.doc.email_id): if self.doc.email_id and not validate_email_add(self.doc.email_id):
msgprint("Please enter valid Email Id", raise_exception=1) throw(_("Please enter valid Email Id"))
self.update_parent_account() self.update_parent_account()
@ -76,8 +76,8 @@ class DocType:
for d in bins: for d in bins:
if d['actual_qty'] or d['reserved_qty'] or d['ordered_qty'] or \ if d['actual_qty'] or d['reserved_qty'] or d['ordered_qty'] or \
d['indented_qty'] or d['projected_qty'] or d['planned_qty']: d['indented_qty'] or d['projected_qty'] or d['planned_qty']:
msgprint("""Warehouse: %s can not be deleted as qty exists for item: %s""" throw("""Warehouse: %s can not be deleted as qty exists for item: %s"""
% (self.doc.name, d['item_code']), raise_exception=1) % (self.doc.name, d['item_code']))
else: else:
webnotes.conn.sql("delete from `tabBin` where name = %s", d['name']) webnotes.conn.sql("delete from `tabBin` where name = %s", d['name'])
@ -88,8 +88,8 @@ class DocType:
if webnotes.conn.sql("""select name from `tabStock Ledger Entry` if webnotes.conn.sql("""select name from `tabStock Ledger Entry`
where warehouse = %s""", self.doc.name): where warehouse = %s""", self.doc.name):
msgprint("""Warehouse can not be deleted as stock ledger entry throw(_("""Warehouse can not be deleted as stock ledger entry
exists for this warehouse.""", raise_exception=1) exists for this warehouse."""))
def before_rename(self, olddn, newdn, merge=False): def before_rename(self, olddn, newdn, merge=False):
# Add company abbr if not provided # Add company abbr if not provided
@ -97,8 +97,8 @@ class DocType:
new_warehouse = get_name_with_abbr(newdn, self.doc.company) new_warehouse = get_name_with_abbr(newdn, self.doc.company)
if merge: if merge:
if not webnotes.conn.exists("Warehouse", newdn): if not webnotes.conn.exists("Warehouse", new_warehouse):
webnotes.throw(_("Warehouse ") + newdn +_(" does not exists")) webnotes.throw(_("Warehouse ") + new_warehouse +_(" does not exists"))
if self.doc.company != webnotes.conn.get_value("Warehouse", new_warehouse, "company"): if self.doc.company != webnotes.conn.get_value("Warehouse", new_warehouse, "company"):
webnotes.throw(_("Both Warehouse must belong to same Company")) webnotes.throw(_("Both Warehouse must belong to same Company"))

View File

@ -15,8 +15,8 @@ def execute(filters=None):
bom_rate = get_item_bom_rate() bom_rate = get_item_bom_rate()
val_rate_map = get_valuation_rate() val_rate_map = get_valuation_rate()
from erpnext.accounts.utils import get_currency_precision
precision = get_currency_precision() or 2 precision = get_currency_precision() or 2
data = [] data = []
for item in sorted(item_map): for item in sorted(item_map):
data.append([item, item_map[item]["item_name"], data.append([item, item_map[item]["item_name"],
@ -30,14 +30,6 @@ def execute(filters=None):
]) ])
return columns, data return columns, data
def get_currency_precision():
company_currency = webnotes.conn.get_value("Company",
webnotes.conn.get_default("company"), "default_currency")
currency_format = webnotes.conn.get_value("Currency", company_currency, "number_format")
from webnotes.utils import get_number_format_info
return get_number_format_info(currency_format)[2]
def get_columns(filters): def get_columns(filters):
"""return columns based on filters""" """return columns based on filters"""
@ -65,9 +57,10 @@ def get_price_list():
rate = {} rate = {}
price_list = webnotes.conn.sql("""select item_code, buying, selling, price_list = webnotes.conn.sql("""select ip.item_code, ip.buying, ip.selling,
concat(price_list, " - ", currency, " ", ref_rate) as price concat(ip.price_list, " - ", ip.currency, " ", ip.ref_rate) as price
from `tabItem Price`""", as_dict=1) from `tabItem Price` ip, `tabPrice List` pl
where ip.price_list=pl.name and pl.enabled=1""", as_dict=1)
for j in price_list: for j in price_list:
if j.price: if j.price: