diff --git a/controllers/accounts_controller.py b/controllers/accounts_controller.py index 42e99958c0..3676510500 100644 --- a/controllers/accounts_controller.py +++ b/controllers/accounts_controller.py @@ -388,7 +388,7 @@ class AccountsController(TransactionBase): total_billed_amt = flt(flt(already_billed) + flt(item.fields[based_on]), self.precision(based_on, item)) - + if max_allowed_amt and total_billed_amt - max_allowed_amt > 0.02: webnotes.msgprint(_("Row ")+ cstr(item.idx) + ": " + cstr(item.item_code) + _(" will be over-billed against mentioned ") + cstr(ref_dt) + diff --git a/selling/utils.py b/selling/utils.py index 2d4fcc4795..858312a3da 100644 --- a/selling/utils.py +++ b/selling/utils.py @@ -59,7 +59,7 @@ def get_item_details(args): if args.price_list_name and args.price_list_currency: out.update(_get_price_list_rate(args, item_bean, meta)) - + out.update(_get_item_discount(out.item_group, args.customer)) if out.get(warehouse_fieldname): @@ -70,7 +70,7 @@ def get_item_details(args): if cint(args.is_pos): pos_settings = get_pos_settings(args.company) out.update(apply_pos_settings(pos_settings, out)) - + return out def _get_item_code(barcode): @@ -132,7 +132,7 @@ def _get_price_list_rate(args, item_bean, meta): "price_list_name": args.price_list_name, "ref_currency": args.price_list_currency, "buying_or_selling": "Selling"}) - + if not base_ref_rate: return {} diff --git a/stock/doctype/delivery_note/test_delivery_note.py b/stock/doctype/delivery_note/test_delivery_note.py index 641a564cbe..505cad312e 100644 --- a/stock/doctype/delivery_note/test_delivery_note.py +++ b/stock/doctype/delivery_note/test_delivery_note.py @@ -17,6 +17,8 @@ class TestDeliveryNote(unittest.TestCase): pr.submit() def test_over_billing_against_dn(self): + self._insert_purchase_receipt() + from stock.doctype.delivery_note.delivery_note import make_sales_invoice dn = webnotes.bean(copy=test_records[0]).insert() @@ -31,8 +33,8 @@ class TestDeliveryNote(unittest.TestCase): self.assertEquals(len(si), len(dn.doclist)) # modify export_amount - si[1].export_rate = 200 - self.assertRaises(webnotes.ValidationError, webnotes.bean(si).submit) + si[1].ref_rate = 200 + self.assertRaises(webnotes.ValidationError, webnotes.bean(si).insert) def test_delivery_note_no_gl_entry(self): diff --git a/utilities/demo_docs/Fiscal_Year.csv b/utilities/demo_docs/Fiscal_Year.csv new file mode 100644 index 0000000000..09e8252cb5 --- /dev/null +++ b/utilities/demo_docs/Fiscal_Year.csv @@ -0,0 +1,23 @@ +Data Import Template,,,, +Table:,Fiscal Year,,, +,,,, +,,,, +Notes:,,,, +Please do not change the template headings.,,,, +First data column must be 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.",,,, +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.",,,, +You can only upload upto 5000 records in one go. (may be less in some cases),,,, +,,,, +DocType:,Fiscal Year,,, +Column Labels:,ID,Year Name,Year Start Date,Year Closed +Column Name:,name,year,year_start_date,is_fiscal_year_closed +Mandatory:,Yes,Yes,Yes,No +Type:,Data (text),Data,Date,Select +Info:,,,,"One of: No, Yes" +Start entering data below this line,,,, +,,2009,01-Jan-2009,No +,,2010,01-Jan-2010,No +,,2011,01-Jan-2011,No \ No newline at end of file diff --git a/utilities/demo_docs/Item_Price.csv b/utilities/demo_docs/Item_Price.csv index f0f657e2fe..b181fb8bfc 100644 --- a/utilities/demo_docs/Item_Price.csv +++ b/utilities/demo_docs/Item_Price.csv @@ -31,4 +31,20 @@ Start entering data below this line,,,,, ,Shaft,Standard Buying,Buying,30,USD ,Stand,Standard Buying,Buying,40,USD ,Upper Bearing Plate,Standard Buying,Buying,50,USD -,Wing Sheet,Standard Buying,Buying,22,USD \ No newline at end of file +,Wing Sheet,Standard Buying,Buying,22,USD +,Wind Turbine,Standard Selling,Selling,300,USD +,Wind Mill A Series,Standard Selling,Selling,340,USD +,Wind MIll C Series,Standard Selling,Selling,400,USD +,Base Bearing Plate,Standard Selling,Selling,21,USD +,Base Plate,Standard Selling,Selling,28,USD +,Bearing Block,Standard Selling,Selling,14,USD +,Bearing Collar,Standard Selling,Selling,28,USD +,Bearing Pipe,Standard Selling,Selling,21,USD +,Blade Rib,Standard Selling,Selling,14,USD +,Disc Collars,Standard Selling,Selling,103.6,USD +,External Disc,Standard Selling,Selling,63,USD +,Internal Disc,Standard Selling,Selling,46.2,USD +,Shaft,Standard Selling,Selling,42,USD +,Stand,Standard Selling,Selling,56,USD +,Upper Bearing Plate,Standard Selling,Selling,70,USD +,Wing Sheet,Standard Selling,Selling,30.8,USD \ No newline at end of file diff --git a/utilities/make_demo.py b/utilities/make_demo.py index 951aded84c..61a971bdbd 100644 --- a/utilities/make_demo.py +++ b/utilities/make_demo.py @@ -1,14 +1,30 @@ # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. # License: GNU General Public License v3. See license.txt -import webnotes, os +import webnotes, os, datetime +import webnotes.utils +import random + webnotes.session = webnotes._dict({"user":"Administrator"}) from core.page.data_import_tool.data_import_tool import upload +start_date = '2010-01-01' +runs_for = 100 +prob = { + "Quotation": 0.5 +} + def make(): webnotes.connect() webnotes.print_messages = True webnotes.mute_emails = True + + # setup() + # simulate() + make_quotation("2010-01-01") + webnotes.conn.commit() + +def setup(): install() complete_setup() make_items() @@ -17,6 +33,81 @@ def make(): # make_bom() # make_opening_stock() # make_opening_accounts() + +def simulate(): + current_date = None + for i in xrange(runs_for): + if not current_date: + current_date = webnotes.utils.getdate(start_date) + else: + current_date = webnotes.utils.add_days(current_date, 1) + + if current_date.weekday() in (5, 6): + continue + + run_sales(current_date) + + webnotes.conn.commit() + + +def run_sales(current_date): + if random.random() < prob["Quotation"]: + make_quotation(current_date) + +def make_quotation(current_date): + b = webnotes.bean([{ + "creation": current_date, + "doctype": "Quotation", + "quotation_to": "Customer", + "customer": get_random("Customer"), + "order_type": "Sales", + "price_list_name": "Standard Selling", + "transaction_date": current_date, + "fiscal_year": "2010" + }]) + + add_random_children(b, { + "doctype": "Quotation Item", + "parentfield": "quotation_details", + }, rows=3, randomize = { + "qty": (1, 5), + "item_code": ("Item", {"is_sales_item": "Yes"}) + }, unique="item_code") + + b.insert() + print b.doc.name + +def add_random_children(bean, template, rows, randomize, unique=None): + for i in xrange(random.randrange(1, rows)): + d = template.copy() + for key, val in randomize.items(): + if isinstance(val[0], basestring): + d[key] = get_random(*val) + else: + d[key] = random.randrange(*val) + + if unique: + if not bean.doclist.get({"doctype": d["doctype"], unique:d[unique]}): + bean.doclist.append(d) + else: + bean.doclist.append(d) + + + +def get_random(doctype, filters=None): + condition = [] + if filters: + for key, val in filters.items(): + condition.append("%s='%s'" % (key, val)) + if condition: + condition = " where " + " and ".join(condition) + else: + condition = "" + + out = webnotes.conn.sql("""select name from `tab%s` %s + order by RAND() limit 0,1""" % (doctype, condition))[0][0] + + return out def install(): print "Creating Fresh Database..." @@ -37,6 +128,11 @@ def complete_setup(): "timezone": "America/New York", "country": "United States" }) + + print "Importing Fiscal Years..." + webnotes.uploaded_file = os.path.join(os.path.dirname(__file__), "demo_docs", "Fiscal_Year.csv") + upload() + def make_items(): print "Importing Items..." @@ -75,7 +171,7 @@ def make_users_and_employees(): upload() print "Importing Salary Structure..." - webnotes.uploaded_file = os.path.join(os.path.dirname(__file__), "demo_docs", "Salary Structure.csv") + webnotes.uploaded_file = os.path.join(os.path.dirname(__file__), "demo_docs", "Salary_Structure.csv") upload() if __name__=="__main__":