Merge pull request #1290 from akhileshdarjee/price-list

Price List and Item Price : Valid for Buying and Selling as separate check box
This commit is contained in:
Nabin Hait 2014-01-07 21:49:52 -08:00
commit dbf5e54eab
27 changed files with 202 additions and 157 deletions

View File

@ -2,14 +2,14 @@
{ {
"creation": "2011-12-21 11:08:55", "creation": "2011-12-21 11:08:55",
"docstatus": 0, "docstatus": 0,
"modified": "2013-09-13 17:17:47", "modified": "2014-01-07 19:44:47",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
{ {
"doc_type": "Sales Invoice", "doc_type": "Sales Invoice",
"doctype": "Print Format", "doctype": "Print Format",
"html": "<html>\n<head>\n<!--Item Table, Totals and Other Charges-->\n<script>\nfunction get_print_format() {\n var oc = getchildren('Sales Invoice Item', doc.name, 'entries');\n\tvar rows = '<table width=\"100%\" cellpadding=\"0\" class=\"cart\">\\\n <tr>\\\n <td colspan=\"3\"><hr></td>\\\n </tr>\\\n <tr>\\\n <td width=\"60%\" align=\"left\">ITEM NAME.</td>\\\n <td width=\"10%\" align=\"right\">QTY</td>\\\n <td width=\"30%\" align=\"right\">AMOUNT</td>\\\n </tr>\\\n <tr>\\\n <td colspan=\"3\"><hr></td>\\\n </tr>';\n\tfor (var x=0; x<oc.length; x++) {\n console.log(oc[x].item_code!=oc[x].item_name);\n\t\trows += '<tr>\\\n <td align=\"left\">' + oc[x].item_code + \n (oc[x].item_code!=oc[x].item_name ? ('<br>' + oc[x].item_name) : '') + '</td>\\\n <td align=\"right\" style=\"vertical-align:top;\">' + oc[x].qty + '</td>\\\n <td align=\"right\" valign=\"top\">' + format_currency(oc[x].export_amount, doc.currency) + '</td>\\\n </tr>';\n\t}\n rows += '<tr>\\\n <td colspan=\"3\"><hr></td>\\\n </tr>\\\n <tr>\\\n <td colspan=\"2\" align=\"right\">Net Total</td>\\\n <td align=\"right\">' + format_currency(doc.net_total_export, doc.currency) + '</td>\\\n </tr>';\n if (doc.other_charges_total_export != 0) {\n var taxes = wn.model.get_children(\"Sales Taxes and Charges\", doc.name, \"other_charges\", \"Sales Invoice\");\n\t\t$.each(taxes, function(i, d) {\n\t\t\trows += '<tr>\\\n \t\t\t\t<td colspan=\"2\" align=\"right\">' + d.description + '</td>\\\n \t\t\t\t<td style=\"text-align: right;\">' + format_currency(d.tax_amount / doc.conversion_rate, doc.currency) + '</td>\\\n \t\t\t<tr>';\n\t\t});\n }\n rows += '<tr>\\\n <td colspan=\"2\" align=\"right\" style=\"vertical-align:middle;\">Grand Total</td>\\\n <td align=\"right\"><hr width=\"90%\" align=\"right\">' + format_currency(doc.grand_total_export, doc.currency) + '<br>\\\n <hr width=\"90%\" align=\"right\"></td>\\\n </tr>\\\n <tr>\\\n <td align=\"center\" colspan=\"3\">Thank You. Please visit again.</td>\\\n </tr>\\\n </table>';\n\treturn rows;\n}\n</script>\n<style>\n table, tr, td, div, p {\n font-family: Monospace;\n line-height: 200%;\n }\n h1, h2, h3, h4, h5, h6 {\n text-align: center;\n }\n\t@media screen {\n\t\tbody {\n\t\t\twidth: 4in;\n\t\t}\n\t}\n</style>\n</head>\n\n<body>\n<table width=\"100%\" cellpadding=\"4\">\n <tr>\n <td align=\"left\">RECEIPT NO: <script>doc.name</script></td>\n <td align=\"right\">DATE: <script>date.str_to_user(doc.posting_date)</script></td>\n </tr>\n <tr>\n <td>M/s <script>doc.customer</script></td>\n </tr>\n</table>\n<!--Item Table & Totals-->\n<div><script>get_print_format();</script></div>\n</body>\n</html>\n", "html": "<html>\n<head>\n<!--Item Table, Totals and Other Charges-->\n<script>\nfunction get_print_format() {\n\tvar rows = '<table width=\"100%\" cellpadding=\"0\" class=\"cart\">\\\n\t\t<tr>\\\n\t\t\t<td colspan=\"3\"><hr></td>\\\n\t\t</tr>\\\n\t\t<tr>\\\n\t\t\t<td width=\"60%\" align=\"left\">ITEM CODE/DESC.</td>\\\n\t\t\t<td width=\"10%\" align=\"right\">QTY</td>\\\n\t\t\t<td width=\"30%\" align=\"right\">RATE</td>\\\n\t\t</tr>\\\n\t\t<tr>\\\n\t\t\t<td colspan=\"3\"><hr></td>\\\n\t\t</tr>';\n\n\t// print items\n\tvar oc = getchildren('Sales Invoice Item', doc.name, 'entries');\n\tfor (var x=0; x<oc.length; x++) {\n\t\trows += '<tr>\\\n\t\t\t<td align=\"left\">' + oc[x].item_code + '<br>' + oc[x].item_name + '</td>\\\n\t\t\t<td align=\"right\" style=\"vertical-align:top;\">' + oc[x].qty + '</td>\\\n\t\t\t<td align=\"right\" valign=\"top\">' + format_currency(oc[x].export_amount) + '</td>\\\n\t\t</tr>';\n\t}\n\t\n\t// print net total\n\trows += '<tr>\\\n\t\t<td colspan=\"3\"><hr></td>\\\n\t</tr>\\\n\t<tr>\\\n\t\t<td colspan=\"2\" align=\"right\">Net Total</td>\\\n\t\t<td align=\"right\">' + format_currency(doc.net_total_export) + '</td>\\\n\t</tr>';\n\t\n\t// print taxes\n\tvar taxes = wn.model.get_children(\"Sales Taxes and Charges\", doc.name, \"other_charges\", \"Sales Invoice\");\n\tif (taxes) {\n\t\t$.each(taxes, function(i, d) {\n\t\t\tif (d.tax_amount) {\n\t\t\t\trows += '<tr>\\\n\t\t\t\t\t<td colspan=\"2\" align=\"right\">' + d.description + '</td>\\\n\t\t\t\t\t<td style=\"text-align: right;\">' + format_currency(d.tax_amount) + '</td>\\\n\t\t\t\t<tr>';\n\t\t\t}\n\t\t});\n\t}\n\t\n\t// print grand total\n\trows += '<tr>\\\n\t\t<td colspan=\"2\" align=\"right\" style=\"vertical-align:middle;\">Grand Total</td>\\\n\t\t<td align=\"right\"><hr width=\"90%\" align=\"right\">' + format_currency(doc.grand_total_export) + '<br>\\\n\t\t<hr width=\"90%\" align=\"right\"></td>\\\n\t\t</tr>\\\n\t\t<tr>\\\n\t\t\t<td align=\"center\" colspan=\"3\">Thank You. Please visit again.</td>\\\n\t\t</tr>\\\n\t</table>';\n\t\n\treturn rows;\n}\n</script>\n<style>\n\ttable, tr, td, div, p {\n\t\tfont-family: Monospace;\n\t\tline-height: 200%;\n\t}\n\th1, h2, h3, h4, h5, h6 {\n\t\ttext-align: center;\n\t}\n\t@media screen {\n\t\tbody {\n\t\t\twidth: 4in;\n\t\t}\n\t}\n</style>\n</head>\n\n<body>\n\t<table width=\"100%\" cellpadding=\"4\">\n\t\t<tr>\n\t\t\t<td align=\"left\">RECEIPT NO: <script>doc.name</script></td>\n\t\t\t<td align=\"right\">DATE: <script>date.str_to_user(doc.posting_date)</script></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>M/s <script>doc.customer</script></td>\n\t\t</tr>\n\t</table>\n\t<!--Item Table & Totals-->\n\t<div><script>get_print_format();</script></div>\n</body>\n</html>",
"module": "Accounts", "module": "Accounts",
"name": "__common__", "name": "__common__",
"print_format_type": "Client", "print_format_type": "Client",

View File

@ -7,7 +7,7 @@ cur_frm.cscript.onload = function(doc,cdt,cdn){
}); });
cur_frm.set_query("selling_price_list", function() { cur_frm.set_query("selling_price_list", function() {
return { filters: { buying_or_selling: "Selling" } }; return { filters: { selling: 1 } };
}); });
} }

View File

@ -22,7 +22,7 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
if(this.frm.fields_dict.buying_price_list) { if(this.frm.fields_dict.buying_price_list) {
this.frm.set_query("buying_price_list", function() { this.frm.set_query("buying_price_list", function() {
return{ return{
filters: { 'buying_or_selling': "Buying" } filters: { 'buying': 1 }
} }
}); });
} }

View File

@ -95,6 +95,6 @@ cur_frm.cscript.make_contact = function() {
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_or_selling': "Buying"} filters:{'buying': 1}
} }
} }

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
from webnotes.utils import getdate, flt, add_days, cstr from webnotes.utils import getdate, flt, add_days, cstr
import json import json
@ -90,7 +90,7 @@ 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 ref_rate from `tabItem Price`
where price_list=%s and item_code=%s and buying_or_selling='Buying'""", where price_list=%s and item_code=%s and buying=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:
@ -122,14 +122,12 @@ def _validate_item_details(args, item):
# validate if purchase item or subcontracted item # validate if purchase item or subcontracted item
if item.is_purchase_item != "Yes": if item.is_purchase_item != "Yes":
msgprint(_("Item") + (" %s: " % item.name) + _("not a purchase item"), throw(_("Item") + (" %s: " % item.name) + _("not a purchase item"))
raise_exception=True)
if args.is_subcontracted == "Yes" and item.is_sub_contracted_item != "Yes": if args.is_subcontracted == "Yes" and item.is_sub_contracted_item != "Yes":
msgprint(_("Item") + (" %s: " % item.name) + throw(_("Item") + (" %s: " % item.name) +
_("not a sub-contracted item.") + _("not a sub-contracted item.") +
_("Please select a sub-contracted item or do not sub-contract the transaction."), _("Please select a sub-contracted item or do not sub-contract the transaction."))
raise_exception=True)
def get_last_purchase_details(item_code, doc_name=None, conversion_rate=1.0): def get_last_purchase_details(item_code, doc_name=None, conversion_rate=1.0):
"""returns last purchase details in stock uom""" """returns last purchase details in stock uom"""

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
from webnotes.utils import flt, cint, today, cstr from webnotes.utils import flt, cint, today, cstr
from webnotes.model.code import get_obj from webnotes.model.code import get_obj
from setup.utils import get_company_currency from setup.utils import get_company_currency
@ -50,8 +50,8 @@ class AccountsController(TransactionBase):
if accounts: if accounts:
if not filter(lambda x: cstr(x.freeze_account) in ["", "No"], accounts): if not filter(lambda x: cstr(x.freeze_account) in ["", "No"], accounts):
msgprint(_("Account for this ") + fieldname + _(" has been freezed. ") + throw(_("Account for this ") + fieldname + _(" has been freezed. ") +
self.doc.doctype + _(" can not be made."), raise_exception=1) self.doc.doctype + _(" can not be made."))
def set_price_list_currency(self, buying_or_selling): def set_price_list_currency(self, buying_or_selling):
if self.meta.get_field("currency"): if self.meta.get_field("currency"):
@ -179,17 +179,17 @@ class AccountsController(TransactionBase):
""" """
if tax.charge_type in ["On Previous Row Amount", "On Previous Row Total"] and \ if tax.charge_type in ["On Previous Row Amount", "On Previous Row Total"] and \
(not tax.row_id or cint(tax.row_id) >= tax.idx): (not tax.row_id or cint(tax.row_id) >= tax.idx):
msgprint((_("Row") + " # %(idx)s [%(taxes_doctype)s]: " + \ throw((_("Row") + " # %(idx)s [%(taxes_doctype)s]: " + \
_("Please specify a valid") + " %(row_id_label)s") % { _("Please specify a valid") + " %(row_id_label)s") % {
"idx": tax.idx, "idx": tax.idx,
"taxes_doctype": tax.doctype, "taxes_doctype": tax.doctype,
"row_id_label": self.meta.get_label("row_id", "row_id_label": self.meta.get_label("row_id",
parentfield=self.other_fname) parentfield=self.other_fname)
}, raise_exception=True) })
def validate_inclusive_tax(self, tax): def validate_inclusive_tax(self, tax):
def _on_previous_row_error(row_range): def _on_previous_row_error(row_range):
msgprint((_("Row") + " # %(idx)s [%(doctype)s]: " + throw((_("Row") + " # %(idx)s [%(doctype)s]: " +
_("to be included in Item's rate, it is required that: ") + _("to be included in Item's rate, it is required that: ") +
" [" + _("Row") + " # %(row_range)s] " + _("also be included in Item's rate")) % { " [" + _("Row") + " # %(row_range)s] " + _("also be included in Item's rate")) % {
"idx": tax.idx, "idx": tax.idx,
@ -200,12 +200,12 @@ class AccountsController(TransactionBase):
parentfield=self.other_fname), parentfield=self.other_fname),
"charge_type": tax.charge_type, "charge_type": tax.charge_type,
"row_range": row_range "row_range": row_range
}, raise_exception=True) })
if cint(tax.included_in_print_rate): if cint(tax.included_in_print_rate):
if tax.charge_type == "Actual": if tax.charge_type == "Actual":
# inclusive tax cannot be of type Actual # inclusive tax cannot be of type Actual
msgprint((_("Row") throw((_("Row")
+ " # %(idx)s [%(doctype)s]: %(charge_type_label)s = \"%(charge_type)s\" " + " # %(idx)s [%(doctype)s]: %(charge_type_label)s = \"%(charge_type)s\" "
+ "cannot be included in Item's rate") % { + "cannot be included in Item's rate") % {
"idx": tax.idx, "idx": tax.idx,
@ -213,7 +213,7 @@ class AccountsController(TransactionBase):
"charge_type_label": self.meta.get_label("charge_type", "charge_type_label": self.meta.get_label("charge_type",
parentfield=self.other_fname), parentfield=self.other_fname),
"charge_type": tax.charge_type, "charge_type": tax.charge_type,
}, raise_exception=True) })
elif tax.charge_type == "On Previous Row Amount" and \ elif tax.charge_type == "On Previous Row Amount" and \
not cint(self.tax_doclist[tax.row_id - 1].included_in_print_rate): not cint(self.tax_doclist[tax.row_id - 1].included_in_print_rate):
# referred row should also be inclusive # referred row should also be inclusive

0
patches/1401/__init__.py Normal file
View File

View File

@ -0,0 +1,29 @@
# 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.reload_doc("stock", "doctype", "item_price")
if "buying_or_selling" in webnotes.conn.get_table_columns("Price List"):
webnotes.conn.sql("""update `tabPrice List` set
selling =
case
when buying_or_selling='Selling'
then 1
end,
buying =
case
when buying_or_selling='Buying'
then 1
end
""")
webnotes.conn.sql("""update `tabItem Price` ip, `tabPrice List` pl
set ip.buying=pl.buying, ip.selling=pl.selling
where ip.price_list=pl.name""")
webnotes.conn.sql("""udpate `tabItem Price` set selling=1 where ifnull(selling, 0)=0 and
ifnull(buying, 0)=0""")

View File

@ -9,19 +9,6 @@ def execute():
webnotes.reload_doc("stock", "doctype", "price_list") webnotes.reload_doc("stock", "doctype", "price_list")
webnotes.reload_doc("stock", "doctype", "item_price") webnotes.reload_doc("stock", "doctype", "item_price")
try: webnotes.conn.sql("""update `tabPrice List` pl, `tabItem Price` ip
for price_list in webnotes.conn.sql_list("""select name from `tabPrice List`"""): set pl.selling=ip.selling, pl.buying=ip.buying
buying, selling = False, False where pl.name=ip.price_list_name""")
for b, s in webnotes.conn.sql("""select distinct buying, selling
from `tabItem Price` where price_list_name=%s""", price_list):
buying = buying or cint(b)
selling = selling or cint(s)
buying_or_selling = "Selling" if selling else "Buying"
webnotes.conn.set_value("Price List", price_list, "buying_or_selling", buying_or_selling)
except webnotes.SQLError, e:
if e.args[0] == 1054:
webnotes.conn.sql("""update `tabPrice List` set buying_or_selling='Selling'
where ifnull(buying_or_selling, '')='' """)
else:
raise

View File

@ -12,9 +12,7 @@ def execute():
where ip.item_code=i.name""") where ip.item_code=i.name""")
webnotes.conn.sql("""update `tabItem Price` ip, `tabPrice List` pl webnotes.conn.sql("""update `tabItem Price` ip, `tabPrice List` pl
set ip.price_list=pl.name, ip.currency=pl.currency, set ip.price_list=pl.name, ip.currency=pl.currency where ip.parent=pl.name""")
ip.buying_or_selling=pl.buying_or_selling
where ip.parent=pl.name""")
webnotes.conn.sql("""update `tabItem Price` webnotes.conn.sql("""update `tabItem Price`
set parent=null, parenttype=null, parentfield=null, idx=null""") set parent=null, parenttype=null, parentfield=null, idx=null""")

View File

@ -263,4 +263,5 @@ patch_list = [
"patches.1311.p08_email_digest_recipients", "patches.1311.p08_email_digest_recipients",
"execute:webnotes.delete_doc('DocType', 'Warehouse Type')", "execute:webnotes.delete_doc('DocType', 'Warehouse Type')",
"patches.1312.p02_update_item_details_in_item_price", "patches.1312.p02_update_item_details_in_item_price",
"patches.1401.p01_make_buying_selling_as_check_box_in_price_list",
] ]

View File

@ -330,8 +330,7 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({
doctype: tax.doctype, doctype: tax.doctype,
row_id_label: wn.meta.get_label(tax.doctype, "row_id", tax.name) row_id_label: wn.meta.get_label(tax.doctype, "row_id", tax.name)
}); });
msgprint(msg); wn.throw(msg);
throw msg;
} }
}, },
@ -347,8 +346,7 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({
charge_type_label: wn.meta.get_label(tax.doctype, "charge_type", tax.name), charge_type_label: wn.meta.get_label(tax.doctype, "charge_type", tax.name),
charge_type: tax.charge_type charge_type: tax.charge_type
}); });
msgprint(msg); wn.throw(msg);
throw msg;
}; };
var on_previous_row_error = function(row_range) { var on_previous_row_error = function(row_range) {
@ -363,8 +361,7 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({
row_range: row_range, row_range: row_range,
}); });
msgprint(msg); wn.throw(msg);
throw msg;
}; };
if(cint(tax.included_in_print_rate)) { if(cint(tax.included_in_print_rate)) {

View File

@ -122,6 +122,6 @@ cur_frm.fields_dict.lead_name.get_query = function(doc,cdt,cdn) {
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_or_selling': "Selling"} filters:{'selling': 1}
} }
} }

View File

@ -48,7 +48,7 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
if(this.frm.fields_dict.selling_price_list) { if(this.frm.fields_dict.selling_price_list) {
this.frm.set_query("selling_price_list", function() { this.frm.set_query("selling_price_list", function() {
return { filters: { buying_or_selling: "Selling" } }; return { filters: { selling: 1 } };
}); });
} }

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
from webnotes.utils import flt, cint, comma_and from webnotes.utils import flt, cint, comma_and
import json import json
@ -100,7 +100,7 @@ def _get_item_code(barcode=None, serial_no=None):
where name=%s""", serial_no) where name=%s""", serial_no)
if not item_code: if not item_code:
msgprint(_("No Item found with ") + input_type + ": %s" % (barcode or serial_no), raise_exception=True) throw(_("No Item found with ") + input_type + ": %s" % (barcode or serial_no))
return item_code[0] return item_code[0]
@ -111,14 +111,12 @@ def _validate_item_details(args, item):
# validate if sales item or service item # validate if sales item or service item
if args.order_type == "Maintenance": if args.order_type == "Maintenance":
if item.is_service_item != "Yes": if item.is_service_item != "Yes":
msgprint(_("Item") + (" %s: " % item.name) + throw(_("Item") + (" %s: " % item.name) +
_("not a service item.") + _("not a service item.") +
_("Please select a service item or change the order type to Sales."), _("Please select a service item or change the order type to Sales."))
raise_exception=True)
elif item.is_sales_item != "Yes": elif item.is_sales_item != "Yes":
msgprint(_("Item") + (" %s: " % item.name) + _("not a sales item"), throw(_("Item") + (" %s: " % item.name) + _("not a sales item"))
raise_exception=True)
def _get_basic_details(args, item_bean, warehouse_fieldname): def _get_basic_details(args, item_bean, warehouse_fieldname):
item = item_bean.doc item = item_bean.doc
@ -147,7 +145,7 @@ def _get_basic_details(args, item_bean, warehouse_fieldname):
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 ref_rate from `tabItem Price`
where price_list=%s and item_code=%s and buying_or_selling='Selling'""", where price_list=%s and item_code=%s and selling=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,7 +98,8 @@ def create_price_lists(args):
{ {
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "Standard " + pl_type, "price_list_name": "Standard " + pl_type,
"buying_or_selling": pl_type, "buying": 1 if pl_type == "Buying" else 0,
"selling": 1 if pl_type == "Selling" else 0,
"currency": args["currency"] "currency": args["currency"]
}, },
{ {

View File

@ -2,11 +2,10 @@
// License: GNU General Public License v3. See license.txt // License: GNU General Public License v3. See license.txt
$.extend(cur_frm.cscript, { $.extend(cur_frm.cscript, {
onload: function () { onload: function () {
// Fetch price list details // Fetch price list details
cur_frm.add_fetch("price_list", "buying_or_selling", "buying_or_selling"); cur_frm.add_fetch("price_list", "buying", "buying");
cur_frm.add_fetch("price_list", "selling", "selling");
cur_frm.add_fetch("price_list", "currency", "currency"); cur_frm.add_fetch("price_list", "currency", "currency");
// Fetch item details // Fetch item details

View File

@ -1,7 +1,5 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt # License: GNU General Public License v3. See license.txt
# For license information, please see license.txt
from __future__ import unicode_literals from __future__ import unicode_literals
import webnotes import webnotes
@ -19,8 +17,8 @@ class DocType:
self.update_item_details() self.update_item_details()
def update_price_list_details(self): def update_price_list_details(self):
self.doc.buying_or_selling, self.doc.currency = webnotes.conn.get_value("Price List", self.doc.buying, self.doc.selling, self.doc.currency = webnotes.conn.get_value("Price List",
self.doc.price_list, ["buying_or_selling", "currency"]) self.doc.price_list, ["buying", "selling", "currency"])
def update_item_details(self): def update_item_details(self):
self.doc.item_name, self.doc.item_description = webnotes.conn.get_value("Item", self.doc.item_name, self.doc.item_description = webnotes.conn.get_value("Item",

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-05-02 16:29:48", "creation": "2013-05-02 16:29:48",
"docstatus": 0, "docstatus": 0,
"modified": "2013-10-31 12:59:02", "modified": "2014-01-07 19:16:49",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -43,6 +43,13 @@
"doctype": "DocType", "doctype": "DocType",
"name": "Item Price" "name": "Item Price"
}, },
{
"doctype": "DocField",
"fieldname": "price_list_details",
"fieldtype": "Section Break",
"label": "Price List",
"options": "icon-tags"
},
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "price_list", "fieldname": "price_list",
@ -52,6 +59,29 @@
"options": "Price List", "options": "Price List",
"reqd": 1 "reqd": 1
}, },
{
"doctype": "DocField",
"fieldname": "buying",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Buying",
"read_only": 1
},
{
"doctype": "DocField",
"fieldname": "selling",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Selling",
"read_only": 1
},
{
"doctype": "DocField",
"fieldname": "item_details",
"fieldtype": "Section Break",
"label": "Item",
"options": "icon-tag"
},
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "item_code", "fieldname": "item_code",
@ -83,16 +113,6 @@
"fieldname": "col_br_1", "fieldname": "col_br_1",
"fieldtype": "Column Break" "fieldtype": "Column Break"
}, },
{
"doctype": "DocField",
"fieldname": "buying_or_selling",
"fieldtype": "Select",
"in_filter": 1,
"in_list_view": 1,
"label": "Valid for Buying or Selling?",
"options": "Selling\nBuying",
"reqd": 0
},
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "item_name", "fieldname": "item_name",

View File

@ -1,7 +0,0 @@
.table-grid tbody tr {
cursor: pointer;
}
.table-grid thead tr {
height: 50px;
}

View File

@ -3,16 +3,15 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import webnotes import webnotes
from webnotes import msgprint, _ from webnotes import msgprint, _, throw
from webnotes.utils import comma_or, cint from webnotes.utils import cint
from webnotes.model.controller import DocListController from webnotes.model.controller import DocListController
import webnotes.defaults import webnotes.defaults
class DocType(DocListController): class DocType(DocListController):
def validate(self): def validate(self):
if self.doc.buying_or_selling not in ["Buying", "Selling"]: if not cint(self.doc.buying) and not cint(self.doc.selling):
msgprint(_(self.meta.get_label("buying_or_selling")) + " " + _("must be one of") + " " + throw(_("Price List must be applicable for Buying or Selling"))
comma_or(["Buying", "Selling"]), raise_exception=True)
if not self.doclist.get({"parentfield": "valid_for_territories"}): if not self.doclist.get({"parentfield": "valid_for_territories"}):
# if no territory, set default territory # if no territory, set default territory
@ -34,15 +33,15 @@ class DocType(DocListController):
cart_settings.validate_price_lists() cart_settings.validate_price_lists()
def set_default_if_missing(self): def set_default_if_missing(self):
if self.doc.buying_or_selling=="Selling": if cint(self.doc.selling):
if not webnotes.conn.get_value("Selling Settings", None, "selling_price_list"): if not webnotes.conn.get_value("Selling Settings", None, "selling_price_list"):
webnotes.set_value("Selling Settings", "Selling Settings", "selling_price_list", self.doc.name) webnotes.set_value("Selling Settings", "Selling Settings", "selling_price_list", self.doc.name)
elif self.doc.buying_or_selling=="Buying": elif cint(self.doc.buying):
if not webnotes.conn.get_value("Buying Settings", None, "buying_price_list"): if not webnotes.conn.get_value("Buying Settings", None, "buying_price_list"):
webnotes.set_value("Buying Settings", "Buying Settings", "buying_price_list", self.doc.name) webnotes.set_value("Buying Settings", "Buying Settings", "buying_price_list", self.doc.name)
def update_item_price(self): def update_item_price(self):
webnotes.conn.sql("""update `tabItem Price` set currency=%s, webnotes.conn.sql("""update `tabItem Price` set currency=%s,
buying_or_selling=%s, modified=NOW() where price_list=%s""", buying=%s, selling=%s, modified=NOW() where price_list=%s""",
(self.doc.currency, self.doc.buying_or_selling, self.doc.name)) (self.doc.currency, cint(self.doc.buying), cint(self.doc.selling), self.doc.name))

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": "2013-10-31 19:24:33", "modified": "2014-01-06 18:28:23",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -61,14 +61,19 @@
"reqd": 1 "reqd": 1
}, },
{ {
"default": "Selling",
"doctype": "DocField", "doctype": "DocField",
"fieldname": "buying_or_selling", "fieldname": "buying",
"fieldtype": "Select", "fieldtype": "Check",
"in_list_view": 1, "in_list_view": 1,
"label": "Valid for Buying or Selling?", "label": "Buying"
"options": "Buying\nSelling", },
"reqd": 1 {
"doctype": "DocField",
"fieldname": "selling",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Selling",
"reqd": 0
}, },
{ {
"doctype": "DocField", "doctype": "DocField",

View File

@ -12,7 +12,7 @@ test_records = [
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "_Test Price List", "price_list_name": "_Test Price List",
"currency": "INR", "currency": "INR",
"buying_or_selling": "Selling" "selling": 1
}, },
{ {
"doctype": "Applicable Territory", "doctype": "Applicable Territory",
@ -25,7 +25,7 @@ test_records = [
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "_Test Price List 2", "price_list_name": "_Test Price List 2",
"currency": "INR", "currency": "INR",
"buying_or_selling": "Selling" "selling": 1
}, },
{ {
"doctype": "Applicable Territory", "doctype": "Applicable Territory",
@ -38,7 +38,7 @@ test_records = [
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "_Test Price List India", "price_list_name": "_Test Price List India",
"currency": "INR", "currency": "INR",
"buying_or_selling": "Selling" "selling": 1
}, },
{ {
"doctype": "Applicable Territory", "doctype": "Applicable Territory",
@ -51,7 +51,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",
"currency": "USD", "currency": "USD",
"buying_or_selling": "Selling" "selling": 1
}, },
{ {
"doctype": "Applicable Territory", "doctype": "Applicable Territory",

View File

@ -65,13 +65,13 @@ def get_price_list():
rate = {} rate = {}
price_list = webnotes.conn.sql("""select item_code, buying_or_selling, price_list = webnotes.conn.sql("""select item_code, buying, selling,
concat(price_list, " - ", currency, " ", ref_rate) as price concat(price_list, " - ", currency, " ", ref_rate) as price
from `tabItem Price`""", as_dict=1) from `tabItem Price`""", as_dict=1)
for j in price_list: for j in price_list:
if j.price: if j.price:
rate.setdefault(j.item_code, {}).setdefault(j.buying_or_selling, []).append(j.price) rate.setdefault(j.item_code, {}).setdefault("Buying" if j.buying else "Selling", []).append(j.price)
item_rate_map = {} item_rate_map = {}
for item in rate: for item in rate:

View File

@ -0,0 +1,22 @@
[
{
"creation": "2013-09-25 10:21:15",
"docstatus": 0,
"modified": "2014-01-07 18:35:22",
"modified_by": "Administrator",
"owner": "Administrator"
},
{
"doctype": "Report",
"is_standard": "Yes",
"json": "{\"filters\":[[\"Item Price\",\"price_list\",\"like\",\"%\"],[\"Item Price\",\"item_code\",\"like\",\"%\"]],\"columns\":[[\"name\",\"Item Price\"],[\"price_list\",\"Item Price\"],[\"item_code\",\"Item Price\"],[\"item_name\",\"Item Price\"],[\"item_description\",\"Item Price\"],[\"ref_rate\",\"Item Price\"],[\"buying\",\"Item Price\"],[\"selling\",\"Item Price\"],[\"currency\",\"Item Price\"]],\"sort_by\":\"Item Price.modified\",\"sort_order\":\"desc\",\"sort_by_next\":\"\",\"sort_order_next\":\"desc\"}",
"name": "__common__",
"ref_doctype": "Price List",
"report_name": "Item-wise Price List Rate",
"report_type": "Report Builder"
},
{
"doctype": "Report",
"name": "Item-wise Price List Rate"
}
]

View File

@ -1,49 +1,49 @@
Data Import Template,,,,,,, Data Import Template,,,,,,,,
Table:,Item Price,,,,,, Table:,Item Price,,,,,,,
,,,,,,, ,,,,,,,,
,,,,,,, ,,,,,,,,
Notes:,,,,,,, Notes:,,,,,,,,
Please do not change the template headings.,,,,,,, Please do not change the template headings.,,,,,,,,
First data column must be blank.,,,,,,, First data column must be blank.,,,,,,,,
"If you are uploading new records, leave the ""name"""" (ID) column blank.""",,,,,,, "If you are uploading new records, leave the ""name"" (ID) column blank.",,,,,,,,
"If you are uploading new records, ""Naming Series"""" becomes mandatory"," if present.""",,,,,, "If you are uploading new records, ""Naming Series"" becomes mandatory, if present.",,,,,,,,
Only mandatory fields are necessary for new records. You can delete non-mandatory columns if you wish.,,,,,,, Only mandatory fields are necessary for new records. You can delete non-mandatory columns if you wish.,,,,,,,,
"For updating, you can update only selective columns.",,,,,,, "For updating, you can update only selective columns.",,,,,,,,
You can only upload upto 5000 records in one go. (may be less in some cases),,,,,,, You can only upload upto 5000 records in one go. (may be less in some cases),,,,,,,,
,,,,,,, ,,,,,,,,
DocType:,Item Price,,,,,, DocType:,Item Price,,,,,,,
Column Labels:,ID,Price List,Item Code,Rate,Valid for Buying or Selling?,Item Name,Item Description Column Labels:,ID,Price List,Item Code,Rate,Buying,Selling,Item Name,Item Description
Column Name:,name,price_list,item_code,ref_rate,buying_or_selling,item_name,item_description Column Name:,name,price_list,item_code,ref_rate,buying,selling,item_name,item_description
Mandatory:,Yes,Yes,Yes,Yes,No,No,No Mandatory:,Yes,Yes,Yes,Yes,No,No,No,No
Type:,Data (text),Link,Link,Currency,Select,Data,Text Type:,Data (text),Link,Link,Currency,Check,Check,Data,Text
Info:,,Valid Price List,Valid Item,,"One of: Selling, Buying",, Info:,,Valid Price List,Valid Item,,0 or 1,0 or 1,,
Start entering data below this line,,,,,,, Start entering data below this line,,,,,,,,
,,Standard Buying,Base Bearing Plate,15,Buying,, ,,Standard Buying,Base Bearing Plate,15,1,,,
,,Standard Buying,Base Plate,20,Buying,, ,,Standard Buying,Base Plate,20,1,,,
,,Standard Buying,Bearing Block,10,Buying,, ,,Standard Buying,Bearing Block,10,1,,,
,,Standard Buying,Bearing Collar,20,Buying,, ,,Standard Buying,Bearing Collar,20,1,,,
,,Standard Buying,Bearing Pipe,15,Buying,, ,,Standard Buying,Bearing Pipe,15,1,,,
,,Standard Buying,Blade Rib,10,Buying,, ,,Standard Buying,Blade Rib,10,1,,,
,,Standard Buying,Disc Collars,74,Buying,, ,,Standard Buying,Disc Collars,74,1,,,
,,Standard Buying,External Disc,45,Buying,, ,,Standard Buying,External Disc,45,1,,,
,,Standard Buying,Internal Disc,33,Buying,, ,,Standard Buying,Internal Disc,33,1,,,
,,Standard Buying,Shaft,30,Buying,, ,,Standard Buying,Shaft,30,1,,,
,,Standard Buying,Stand,40,Buying,, ,,Standard Buying,Stand,40,1,,,
,,Standard Buying,Upper Bearing Plate,50,Buying,, ,,Standard Buying,Upper Bearing Plate,50,1,,,
,,Standard Buying,Wing Sheet,22,Buying,, ,,Standard Buying,Wing Sheet,22,1,,,
,,Standard Selling,Wind Turbine,21,Selling,, ,,Standard Selling,Wind Turbine,21,,1,,
,,Standard Selling,Wind Mill A Series,28,Selling,, ,,Standard Selling,Wind Mill A Series,28,,1,,
,,Standard Selling,Wind MIll C Series,14,Selling,, ,,Standard Selling,Wind MIll C Series,14,,1,,
,,Standard Selling,Base Bearing Plate,28,Selling,, ,,Standard Selling,Base Bearing Plate,28,,1,,
,,Standard Selling,Base Plate,21,Selling,, ,,Standard Selling,Base Plate,21,,1,,
,,Standard Selling,Bearing Block,14,Selling,, ,,Standard Selling,Bearing Block,14,,1,,
,,Standard Selling,Bearing Collar,103.6,Selling,, ,,Standard Selling,Bearing Collar,103.6,,1,,
,,Standard Selling,Bearing Pipe,63,Selling,, ,,Standard Selling,Bearing Pipe,63,,1,,
,,Standard Selling,Blade Rib,46.2,Selling,, ,,Standard Selling,Blade Rib,46.2,,1,,
,,Standard Selling,Disc Collars,42,Selling,, ,,Standard Selling,Disc Collars,42,,1,,
,,Standard Selling,External Disc,56,Selling,, ,,Standard Selling,External Disc,56,,1,,
,,Standard Selling,Internal Disc,70,Selling,, ,,Standard Selling,Internal Disc,70,,1,,
,,Standard Selling,Shaft,340,Selling,, ,,Standard Selling,Shaft,340,,1,,
,,Standard Selling,Stand,400,Selling,, ,,Standard Selling,Stand,400,,1,,
,,Standard Selling,Upper Bearing Plate,300,Selling,, ,,Standard Selling,Upper Bearing Plate,300,,1,,
,,Standard Selling,Wing Sheet,30.8,Selling,, ,,Standard Selling,Wing Sheet,30.8,,1,,

1 Data Import Template
2 Table: Item Price
3
4
5 Notes:
6 Please do not change the template headings.
7 First data column must be blank.
8 If you are uploading new records, leave the "name"" (ID) column blank." If you are uploading new records, leave the "name" (ID) column blank.
9 If you are uploading new records, "Naming Series"" becomes mandatory If you are uploading new records, "Naming Series" becomes mandatory, if present. if present."
10 Only mandatory fields are necessary for new records. You can delete non-mandatory columns if you wish.
11 For updating, you can update only selective columns.
12 You can only upload upto 5000 records in one go. (may be less in some cases)
13
14 DocType: Item Price
15 Column Labels: ID Price List Item Code Rate Valid for Buying or Selling? Buying Item Name Selling Item Description Item Name Item Description
16 Column Name: name price_list item_code ref_rate buying_or_selling buying item_name selling item_description item_name item_description
17 Mandatory: Yes Yes Yes Yes No No No No
18 Type: Data (text) Link Link Currency Select Check Data Check Text Data Text
19 Info: Valid Price List Valid Item One of: Selling, Buying 0 or 1 0 or 1
20 Start entering data below this line
21 Standard Buying Base Bearing Plate 15 Buying 1
22 Standard Buying Base Plate 20 Buying 1
23 Standard Buying Bearing Block 10 Buying 1
24 Standard Buying Bearing Collar 20 Buying 1
25 Standard Buying Bearing Pipe 15 Buying 1
26 Standard Buying Blade Rib 10 Buying 1
27 Standard Buying Disc Collars 74 Buying 1
28 Standard Buying External Disc 45 Buying 1
29 Standard Buying Internal Disc 33 Buying 1
30 Standard Buying Shaft 30 Buying 1
31 Standard Buying Stand 40 Buying 1
32 Standard Buying Upper Bearing Plate 50 Buying 1
33 Standard Buying Wing Sheet 22 Buying 1
34 Standard Selling Wind Turbine 21 Selling 1
35 Standard Selling Wind Mill A Series 28 Selling 1
36 Standard Selling Wind MIll C Series 14 Selling 1
37 Standard Selling Base Bearing Plate 28 Selling 1
38 Standard Selling Base Plate 21 Selling 1
39 Standard Selling Bearing Block 14 Selling 1
40 Standard Selling Bearing Collar 103.6 Selling 1
41 Standard Selling Bearing Pipe 63 Selling 1
42 Standard Selling Blade Rib 46.2 Selling 1
43 Standard Selling Disc Collars 42 Selling 1
44 Standard Selling External Disc 56 Selling 1
45 Standard Selling Internal Disc 70 Selling 1
46 Standard Selling Shaft 340 Selling 1
47 Standard Selling Stand 400 Selling 1
48 Standard Selling Upper Bearing Plate 300 Selling 1
49 Standard Selling Wing Sheet 30.8 Selling 1