Compare commits

...

46 Commits

Author SHA1 Message Date
Pratik Vyas
7349c191ab Merge branch 'develop' 2014-01-27 17:49:50 +05:30
Pratik Vyas
dc540dda4d bumped to version 3.7.1 2014-01-27 18:19:50 +06:00
Nabin Hait
5c494f79f3 Merge pull request #1360 from nabinhait/hotfix
Planned qty patch: auto commit on many writes
2014-01-27 04:07:43 -08:00
Nabin Hait
191935bbf5 Planned qty patch: auto commit on many writes 2014-01-27 17:37:06 +05:30
Pratik Vyas
8c78a1abb7 Merge branch 'develop' 2014-01-27 17:19:45 +05:30
Pratik Vyas
8821541f33 bumped to version 3.7.0 2014-01-27 17:49:45 +06:00
Nabin Hait
5cec7ec84a Merge pull request #1355 from akhileshdarjee/hotfix
Allow rename for price list
2014-01-27 02:40:08 -08:00
Nabin Hait
9536f112b5 Merge pull request #1358 from nabinhait/hotfix
Serial no and planned qty
2014-01-27 01:33:56 -08:00
Nabin Hait
44a40b860e Fixed planned qty bug and patch to recalculate planned qty 2014-01-27 15:02:30 +05:30
Nabin Hait
b3d26c08f6 Fixed planned qty bug and patch to recalculate planned qty 2014-01-27 14:58:55 +05:30
Nabin Hait
fa9fabaa49 Serial no status fix: patch to set status not available where no sle exists 2014-01-27 12:46:18 +05:30
Akhilesh Darjee
49e8e783e3 webnotes/erpnext#1353 allow rename for price list 2014-01-27 11:12:24 +05:30
Anand Doshi
c4ee74857d BugFix: Production Planning Tool - get_raw_materials 2014-01-24 21:53:11 +05:30
Anand Doshi
fc13b87fd5 Fixes in Make Demo 2014-01-24 18:54:50 +05:30
Anand Doshi
d9ba544e09 Fix in Item Test Case 2014-01-24 15:59:05 +05:30
Nabin Hait
af21479665 Merge pull request #1342 from akhileshdarjee/hotfix
Item List refresh when price list changed in POS
2014-01-23 05:14:16 -08:00
Nabin Hait
eec59ae7c4 Merge pull request #1345 from nabinhait/hotfix
Order preview through customer login
2014-01-23 01:48:28 -08:00
Nabin Hait
efa9a7ed5b Merge branch 'develop' of github.com:webnotes/erpnext into hotfix 2014-01-23 13:25:39 +05:30
Nabin Hait
557abdebe0 order preview through customer login 2014-01-23 13:25:26 +05:30
Akhilesh Darjee
8589b1db22 Use model set_value for updating values from POS 2014-01-22 19:25:51 +05:30
Akhilesh Darjee
82a21beba0 Item List refresh when price list changed in POS 2014-01-22 16:55:32 +05:30
Pratik Vyas
256c4da0a5 Merge branch 'develop' 2014-01-22 16:03:07 +05:30
Pratik Vyas
7395dc9969 bumped to version 3.6.6 2014-01-22 16:33:07 +06:00
Nabin Hait
d39bc09e62 Merge pull request #1341 from nabinhait/hotfix
Small fix
2014-01-22 02:21:17 -08:00
Nabin Hait
c7676797e1 Dont display old fraction outstanding in AR report 2014-01-22 15:36:44 +05:30
Nabin Hait
423932fab2 Fixes in general ledger opening 2014-01-22 11:53:44 +05:30
Nabin Hait
efda5b0d36 Merge branch 'develop' of github.com:webnotes/erpnext into hotfix 2014-01-21 20:58:10 +05:30
Nabin Hait
13a9e27320 Fixes in warehouse merge function 2014-01-21 20:57:39 +05:30
Pratik Vyas
b0433d96a3 Merge branch 'develop' 2014-01-21 12:09:31 +05:30
Pratik Vyas
f3aba2e536 bumped to version 3.6.5 2014-01-21 12:39:31 +06:00
Nabin Hait
1594f102fd Merge pull request #1340 from nabinhait/hotfix
General ledger
2014-01-20 22:29:33 -08:00
Nabin Hait
b2f2df4c64 General ledger: opening balance issue fixed 2014-01-21 11:58:17 +05:30
Nabin Hait
9f6c48d82e Merge branch 'develop' of github.com:webnotes/erpnext into hotfix 2014-01-21 10:44:16 +05:30
Pratik Vyas
f0307dc75e Merge branch 'develop' 2014-01-20 19:21:25 +05:30
Pratik Vyas
872e4d1f3d bumped to version 3.6.4 2014-01-20 19:51:25 +06:00
Nabin Hait
b164e606f9 Merge pull request #1337 from nabinhait/hotfix
Hotfix
2014-01-20 05:00:43 -08:00
Nabin Hait
806343395a Merge branch 'develop' of github.com:webnotes/erpnext into hotfix 2014-01-20 18:29:48 +05:30
Nabin Hait
afe93d633c Increased remarks width in general ledger 2014-01-20 18:28:48 +05:30
Nabin Hait
cd20717c3d Merge pull request #1336 from akhileshdarjee/disable-price-list
Enabled feature for Price List
2014-01-20 04:47:10 -08:00
Akhilesh Darjee
529709e08b patch for enabling all price list 2014-01-20 16:39:03 +05:30
Akhilesh Darjee
e82eee512b Enabled feature in Price List 2014-01-20 16:09:45 +05:30
Nabin Hait
ee0c623760 Merge branch 'develop' of github.com:webnotes/erpnext into hotfix 2014-01-20 10:57:12 +05:30
Nabin Hait
dbb4955483 Merge pull request #1332 from akhileshdarjee/hotfix
decimal places fix in item prices report
2014-01-17 20:18:30 -08:00
Akhilesh Darjee
ed87335513 decimal places fix in item prices report 2014-01-17 18:57:21 +05:30
Akhilesh Darjee
8a4111fe0e decimal places fixed in item prices report 2014-01-17 18:50:44 +05:30
Nabin Hait
a37ffe162b Merge branch 'develop' of github.com:webnotes/erpnext into hotfix 2014-01-17 12:05:06 +05:30
33 changed files with 235 additions and 125 deletions

View File

@@ -109,6 +109,7 @@ erpnext.POS = Class.extend({
this.party = party;
this.price_list = (party == "Customer" ?
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.net_total = "net_total_" + export_or_import;
this.grand_total = "grand_total_" + export_or_import;
@@ -269,22 +270,17 @@ erpnext.POS = Class.extend({
this.frm.cscript.fname, this.frm.doctype), function(i, d) {
if (d.item_code == item_code) {
caught = true;
if (serial_no) {
d.serial_no += '\n' + serial_no;
me.frm.script_manager.trigger("serial_no", d.doctype, d.name);
}
else {
d.qty += 1;
me.frm.script_manager.trigger("qty", d.doctype, d.name);
}
if (serial_no)
wn.model.set_value(d.doctype, d.name, "serial_no", d.serial_no + '\n' + serial_no);
else
wn.model.set_value(d.doctype, d.name, "qty", d.qty + 1);
}
});
}
// if item not found then add new item
if (!caught) {
if (!caught)
this.add_new_item_to_grid(item_code, serial_no);
}
this.refresh();
this.refresh_search_box();
@@ -319,15 +315,16 @@ erpnext.POS = Class.extend({
wn.model.clear_doc(d.doctype, d.name);
me.refresh_grid();
} else {
d.qty = qty;
me.frm.script_manager.trigger("qty", d.doctype, d.name);
wn.model.set_value(d.doctype, d.name, "qty", qty);
}
}
});
me.refresh();
this.refresh();
},
refresh: function() {
var me = this;
this.refresh_item_list();
this.party_field.set_input(this.frm.doc[this.party.toLowerCase()]);
this.barcode.set_input("");
@@ -350,6 +347,14 @@ erpnext.POS = Class.extend({
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() {
var me = this;
var $items = this.wrapper.find("#cart tbody").empty();
@@ -383,9 +388,8 @@ erpnext.POS = Class.extend({
)).appendTo($items);
});
this.wrapper.find(".increase-qty, .decrease-qty").on("click", function() {
var item_code = $(this).closest("tr").attr("id");
me.selected_item_qty_operation(item_code, $(this).attr("class"));
this.wrapper.find("input.qty").on("focus", function() {
$(this).select();
});
},
show_taxes: function() {
@@ -422,10 +426,16 @@ erpnext.POS = Class.extend({
// append quantity to the respective item after change from input box
$(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());
});
// 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
$(this.wrapper).find("#cart tbody tr td").on("click", function() {
var row = $(this).closest("tr");
@@ -443,6 +453,15 @@ erpnext.POS = Class.extend({
me.refresh_delete_btn();
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() {
var me = this;
// if form is submitted & cancelled then disable all input box & buttons
@@ -514,26 +533,11 @@ erpnext.POS = Class.extend({
this.refresh_grid();
},
refresh_grid: function() {
this.frm.dirty();
this.frm.fields_dict[this.frm.cscript.fname].grid.refresh();
this.frm.script_manager.trigger("calculate_taxes_and_totals");
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() {
var me = this;
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)
acc = webnotes.conn.sql("select account_type from `tabAccount` where name = '%s' and docstatus != 2" % d.income_account)
if not acc:
msgprint("Account: "+d.income_account+" does not exist in the system")
raise Exception
msgprint("Account: "+d.income_account+" does not exist in the system", raise_exception=True)
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)
raise Exception
msgprint("Please select income head with account type 'Fixed Asset Account' as Item %s is an asset item" % d.item_code, raise_exception=True)
def validate_with_previous_doc(self):
super(DocType, self).validate_with_previous_doc(self.tname, {

View File

@@ -37,12 +37,15 @@ class AccountsReceivableReport(object):
return columns
def get_data(self, customer_naming_by):
from accounts.utils import get_currency_precision
currency_precision = get_currency_precision() or 2
data = []
future_vouchers = self.get_entries_after(self.filters.report_date)
for gle in self.get_entries_till(self.filters.report_date):
if self.is_receivable(gle, future_vouchers):
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)
invoiced_amount = gle.debit if (gle.debit > 0) else 0
payment_received = invoiced_amount - outstanding_amount

View File

@@ -34,7 +34,7 @@ def validate_filters(filters, account_details):
def get_columns():
return ["Posting Date:Date:100", "Account:Link/Account:200", "Debit:Float:100",
"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):
gl_entries = get_gl_entries(filters)
@@ -51,7 +51,7 @@ def get_gl_entries(filters):
gl_entries = webnotes.conn.sql("""select posting_date, account,
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`
where company=%(company)s {conditions}
{group_by_condition}
@@ -138,7 +138,7 @@ def get_accountwise_gle(filters, gl_entries, gle_map):
for gle in gl_entries:
amount = flt(gle.debit) - flt(gle.credit)
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
opening += amount
elif gle.posting_date <= filters.to_date:

View File

@@ -378,4 +378,13 @@ def get_account_for(account_for_doctype, account_for):
account_for_field = "account_type"
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 @@
wn.require('app/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);
erpnext.hide_naming_series();
@@ -93,7 +93,7 @@ cur_frm.cscript.make_contact = function() {
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{
filters:{'buying': 1}
}

View File

@@ -2,7 +2,7 @@
{
"creation": "2013-05-13 16:10:02",
"docstatus": 0,
"modified": "2013-05-13 16:21:07",
"modified": "2014-01-24 18:19:11",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -11,7 +11,7 @@
"doctype": "Report",
"is_standard": "Yes",
"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",
"report_name": "Requested Items To Be Ordered",
"report_type": "Query Report"

View File

@@ -89,8 +89,10 @@ def _get_price_list_rate(args, item_bean, meta):
# try fetching from price list
if args.buying_price_list and args.price_list_currency:
price_list_rate = webnotes.conn.sql("""select ref_rate from `tabItem Price`
where price_list=%s and item_code=%s and buying=1""",
price_list_rate = webnotes.conn.sql("""select ip.ref_rate from
`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)
if price_list_rate:

View File

@@ -1,6 +1,6 @@
{
"app_name": "ERPNext",
"app_version": "3.6.3",
"app_version": "3.7.1",
"base_template": "app/portal/templates/base.html",
"modules": {
"Accounts": {
@@ -74,5 +74,5 @@
"type": "module"
}
},
"requires_framework_version": "==3.7.3"
"requires_framework_version": "==3.8.0"
}

View File

@@ -243,10 +243,10 @@ class DocType:
"item_code": [qty_required, description, stock_uom, min_order_qty]
}
"""
bom_wise_item_details = {}
item_list = []
for bom, so_wise_qty in bom_dict.items():
bom_wise_item_details = {}
if self.doc.use_multi_level_bom:
# get all raw materials with sub assembly childs
for d in webnotes.conn.sql("""select fb.item_code,

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

@@ -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

View File

@@ -0,0 +1,17 @@
# 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:
sr_bean = webnotes.bean("Serial No", sr[0])
sr_bean.make_controller().via_stock_ledger = True
sr_bean.save()
webnotes.conn.commit()
except:
pass

View File

@@ -266,4 +266,7 @@ patch_list = [
"patches.1401.p01_move_related_property_setters_to_custom_field",
"patches.1401.p01_make_buying_selling_as_check_box_in_price_list",
"patches.1401.update_billing_status_for_zero_value_order",
"patches.1401.enable_all_price_list",
"patches.1401.fix_serial_no_status_and_warehouse",
"patches.1401.fix_planned_qty",
]

View File

@@ -10,9 +10,9 @@
<li class="active"><i class="icon-file icon-fixed-width"></i> {{ doc.name }}</li>
</ul>
<h3><i class="icon-file icon-fixed-width"></i> {{ doc.name }}</h3>
{% if doc.name == "Not Allowed" -%}
{% if session_user == "Guest" -%}
<script>ask_to_login();</script>
{% else %}
{% elif doc.name != "Not Allowed"%}
<hr>
<div>
<div class="row">

View File

@@ -41,21 +41,23 @@ def get_currency_context():
}
def get_transaction_context(doctype, name):
context = {"session_user": webnotes.session.user}
customer = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user},
"customer")
bean = webnotes.bean(doctype, name)
if bean.doc.customer != customer:
return {
"doc": {"name": "Not Allowed"}
}
context.update({"doc": {"name": "Not Allowed"}})
else:
return {
context.update({
"doc": bean.doc,
"doclist": bean.doclist,
"webnotes": webnotes,
"utils": webnotes.utils
}
})
return context
@webnotes.whitelist(allow_guest=True)
def send_message(subject="Website Query", message="", sender="", status="Open"):

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('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);
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{
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{
query:"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{
filters:{'selling': 1}
}

View File

@@ -10,11 +10,12 @@ no_cache = True
def get_context():
from portal.utils import get_transaction_context
context = get_transaction_context("Sales Order", webnotes.form_dict.name)
modify_status(context.get("doc"))
context.update({
"parent_link": "orders",
"parent_title": "My Orders"
})
if context.get("doc").get("name") != "Not Allowed":
modify_status(context.get("doc"))
context.update({
"parent_link": "orders",
"parent_title": "My Orders"
})
return context
def modify_status(doc):

View File

@@ -150,8 +150,10 @@ def _get_basic_details(args, item_bean, warehouse_fieldname):
return out
def _get_price_list_rate(args, item_bean, meta):
ref_rate = webnotes.conn.sql("""select ref_rate from `tabItem Price`
where price_list=%s and item_code=%s and selling=1""",
ref_rate = webnotes.conn.sql("""select ip.ref_rate from
`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)
if not ref_rate:

View File

@@ -282,7 +282,7 @@ def apply_cart_settings(party=None, quotation=None):
party = get_lead_or_customer()
if not quotation:
quotation = _get_cart_quotation(party)
cart_settings = webnotes.get_obj("Shopping Cart Settings")
billing_territory = get_address_territory(quotation.doc.customer_address) or \
@@ -310,7 +310,8 @@ def set_price_list_and_rate(quotation, cart_settings, billing_territory):
quotation.run_method("set_price_list_and_item_details")
# set it in cookies for using in product page
webnotes.local._response.set_cookie("selling_price_list", quotation.doc.selling_price_list)
if quotation.doc.selling_price_list:
webnotes.local._response.set_cookie("selling_price_list", quotation.doc.selling_price_list)
def set_taxes(quotation, cart_settings, billing_territory):
"""set taxes based on billing territory"""

View File

@@ -27,8 +27,9 @@ def get_product_info(item_code):
else:
in_stock = -1
price = price_list and webnotes.conn.sql("""select ref_rate, currency from
`tabItem Price` where item_code=%s and price_list=%s""",
price = price_list and webnotes.conn.sql("""select ip.ref_rate, ip.currency from
`tabItem Price` ip, `tabPrice List` pl where ip.price_list=pl.name and
ip.item_code=%s and ip.price_list=%s and pl.enabled=1""",
(item_code, price_list), as_dict=1) or []
price = price and price[0] or None

View File

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

View File

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

@@ -36,6 +36,7 @@ test_records = [
"stock_uom": "_Test UOM",
"default_income_account": "Sales - _TC",
"default_warehouse": "_Test Warehouse - _TC",
"purchase_account": "_Test Account Cost for Goods Sold - _TC"
}, {
"doctype": "Item Reorder",
"parentfield": "item_reorder",
@@ -64,6 +65,7 @@ test_records = [
"stock_uom": "_Test UOM",
"default_income_account": "Sales - _TC",
"default_warehouse": "_Test Warehouse - _TC",
"purchase_account": "_Test Account Cost for Goods Sold - _TC"
}],
[{
"doctype": "Item",
@@ -73,6 +75,7 @@ test_records = [
"item_group": "_Test Item Group Desktops",
"default_warehouse": "_Test Warehouse - _TC",
"default_income_account": "Sales - _TC",
"purchase_account": "_Test Account Cost for Goods Sold - _TC",
"is_stock_item": "Yes",
"is_asset_item": "No",
"has_batch_no": "No",
@@ -99,6 +102,7 @@ test_records = [
"item_group": "_Test Item Group Desktops",
"default_warehouse": "_Test Warehouse - _TC",
"default_income_account": "Sales - _TC",
"purchase_account": "_Test Account Cost for Goods Sold - _TC",
"is_stock_item": "Yes",
"is_asset_item": "No",
"has_batch_no": "No",
@@ -119,6 +123,7 @@ test_records = [
"description": "_Test Sales BOM Item",
"item_group": "_Test Item Group Desktops",
"default_income_account": "Sales - _TC",
"purchase_account": "_Test Account Cost for Goods Sold - _TC",
"is_stock_item": "No",
"is_asset_item": "No",
"has_batch_no": "No",
@@ -140,6 +145,7 @@ test_records = [
"is_stock_item": "Yes",
"default_warehouse": "_Test Warehouse - _TC",
"default_income_account": "Sales - _TC",
"purchase_account": "_Test Account Cost for Goods Sold - _TC",
"is_asset_item": "No",
"has_batch_no": "No",
"has_serial_no": "No",
@@ -216,6 +222,7 @@ test_records = [
"item_group": "_Test Item Group Desktops",
"default_warehouse": "_Test Warehouse - _TC",
"default_income_account": "Sales - _TC",
"purchase_account": "_Test Account Cost for Goods Sold - _TC",
"is_stock_item": "Yes",
"is_asset_item": "No",
"has_batch_no": "No",
@@ -238,6 +245,7 @@ test_records = [
"is_stock_item": "Yes",
"default_warehouse": "_Test Warehouse - _TC",
"default_income_account": "Sales - _TC",
"purchase_account": "_Test Account Cost for Goods Sold - _TC",
"is_asset_item": "No",
"has_batch_no": "No",
"has_serial_no": "No",

View File

@@ -3,7 +3,7 @@
from __future__ import unicode_literals
import webnotes
from webnotes import _
from webnotes import throw, _
class ItemPriceDuplicateItem(webnotes.ValidationError): pass
@@ -12,26 +12,36 @@ class DocType:
self.doc, self.doclist = d, dl
def validate(self):
self.validate_price_list()
self.check_duplicate_item()
self.update_price_list_details()
self.update_item_details()
def update_price_list_details(self):
self.doc.buying, self.doc.selling, self.doc.currency = webnotes.conn.get_value("Price List",
self.doc.price_list, ["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"])
def validate_price_list(self):
enabled = webnotes.conn.get_value("Price List", self.doc.price_list, "enabled")
if not enabled:
throw("{message}: {price_list} {disabled}".format(**{
"message": _("Price List"),
"price_list": self.doc.price_list,
"disabled": _("is disabled.")
}))
def check_duplicate_item(self):
if webnotes.conn.sql("""select name from `tabItem Price`
where item_code=%s and price_list=%s and name!=%s""",
(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"),
"item_code": self.doc.item_code,
"already": _("already available in Price List"),
"price_list": self.doc.price_list
}), 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",
"docstatus": 0,
"modified": "2014-01-06 18:28:23",
"modified": "2014-01-27 11:11:08",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -11,6 +11,7 @@
"allow_copy": 0,
"allow_email": 1,
"allow_print": 1,
"allow_rename": 1,
"autoname": "field:price_list_name",
"description": "Price List Master",
"doctype": "DocType",
@@ -42,6 +43,18 @@
"doctype": "DocType",
"name": "Price List"
},
{
"default": "1",
"doctype": "DocField",
"fieldname": "enabled",
"fieldtype": "Check",
"label": "Enabled"
},
{
"doctype": "DocField",
"fieldname": "sb_1",
"fieldtype": "Section Break"
},
{
"doctype": "DocField",
"fieldname": "price_list_name",

View File

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

View File

@@ -87,6 +87,8 @@ class DocType(StockController):
self.doc.status = "Sales Returned"
else:
self.doc.status = "Available"
if not self.doc.warehouse:
self.doc.warehouse = last_sle.warehouse
else:
if document_type == "Purchase Return":
self.doc.status = "Purchase Returned"
@@ -94,6 +96,8 @@ class DocType(StockController):
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 +189,9 @@ class DocType(StockController):
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

View File

@@ -346,7 +346,8 @@ class DocType(StockController):
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":

View File

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

View File

@@ -15,8 +15,8 @@ def execute(filters=None):
bom_rate = get_item_bom_rate()
val_rate_map = get_valuation_rate()
precision = get_currency_precision or 2
from accounts.utils import get_currency_precision
precision = get_currency_precision() or 2
data = []
for item in sorted(item_map):
data.append([item, item_map[item]["item_name"],
@@ -30,14 +30,6 @@ def execute(filters=None):
])
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):
"""return columns based on filters"""
@@ -65,9 +57,10 @@ def get_price_list():
rate = {}
price_list = webnotes.conn.sql("""select item_code, buying, selling,
concat(price_list, " - ", currency, " ", ref_rate) as price
from `tabItem Price`""", as_dict=1)
price_list = webnotes.conn.sql("""select ip.item_code, ip.buying, ip.selling,
concat(ip.price_list, " - ", ip.currency, " ", ip.ref_rate) as price
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:
if j.price:

View File

@@ -20,4 +20,5 @@ Info:,,,,,"One of: No, Yes"
Start entering data below this line,,,,
,,2009,01-01-2009,31-12-2009,No
,,2010,01-01-2010,31-12-2010,No
,,2011,01-01-2011,31-12-2011,No
,,2011,01-01-2011,31-12-2011,No
,,2012,01-01-2012,31-12-2012,No
Can't render this file because it has a wrong number of fields in line 16.

View File

@@ -19,7 +19,7 @@ company_abbr = "WP"
country = "United States"
currency = "USD"
time_zone = "America/New_York"
start_date = '2013-01-01'
start_date = '2014-01-01'
bank_name = "Citibank"
runs_for = None
prob = {
@@ -105,6 +105,10 @@ def run_accounts(current_date):
for so in list(set([r[0] for r in query_report.run(report)["result"] if r[0]!="Total"]))[:how_many("Sales Invoice")]:
si = webnotes.bean(make_sales_invoice(so))
si.doc.posting_date = current_date
for d in si.doclist.get({"parentfield": "entries"}):
if not d.income_account:
d.income_account = "Sales - {}".format(company_abbr)
si.insert()
si.submit()
webnotes.conn.commit()
@@ -170,6 +174,9 @@ def run_stock(current_date):
dn = webnotes.bean(make_delivery_note(so))
dn.doc.posting_date = current_date
dn.doc.fiscal_year = current_date.year
for d in dn.doclist.get({"parentfield": "delivery_note_details"}):
d.expense_account = "Cost of Goods Sold - {}".format(company_abbr)
dn.insert()
try:
dn.submit()
@@ -236,7 +243,7 @@ def run_manufacturing(current_date):
ppt = webnotes.bean("Production Planning Tool", "Production Planning Tool")
ppt.doc.company = company
ppt.doc.use_multi_level_bom = 1
ppt.doc.purchase_request_for_warehouse = "Stores - WP"
ppt.doc.purchase_request_for_warehouse = "Stores - {}".format(company_abbr)
ppt.run_method("get_open_sales_orders")
ppt.run_method("get_items_from_so")
ppt.run_method("raise_production_order")
@@ -380,8 +387,8 @@ def complete_setup():
setup_account({
"first_name": "Test",
"last_name": "User",
"fy_start_date": "2013-01-01",
"fy_end_date": "2013-12-31",
"fy_start_date": "2014-01-01",
"fy_end_date": "2014-12-31",
"industry": "Manufacturing",
"company_name": company,
"company_abbr": company_abbr,