Merge branch 'edge' of github.com:webnotes/erpnext into edge

This commit is contained in:
Rushabh Mehta 2013-02-08 09:43:01 +01:00
commit ce6d54869d
39 changed files with 599 additions and 162 deletions

View File

@ -116,19 +116,18 @@ cur_frm.cscript.convert_to_group = function(doc, cdt, cdn) {
});
}
// Master name get query
// -----------------------------------------
cur_frm.fields_dict['master_name'].get_query=function(doc){
if (doc.master_type){
return 'SELECT `tab'+doc.master_type+'`.name FROM `tab'+doc.master_type+'` WHERE `tab'+doc.master_type+'`.name LIKE "%s" and `tab'+doc.master_type+'`.docstatus != 2 ORDER BY `tab'+doc.master_type+'`.name LIMIT 50';
}
cur_frm.fields_dict['master_name'].get_query = function(doc) {
if (doc.master_type) {
return {
query: "accounts.doctype.account.account.get_master_name",
args: { "master_type": doc.master_type }
}
}
}
// parent account get query
// -----------------------------------------
cur_frm.fields_dict['parent_account'].get_query = function(doc){
return 'SELECT DISTINCT `tabAccount`.name FROM `tabAccount` WHERE \
`tabAccount`.group_or_ledger="Group" AND `tabAccount`.docstatus != 2 AND \
`tabAccount`.company="'+ doc.company+'" AND `tabAccount`.company is not NULL AND \
`tabAccount`.name LIKE "%s" ORDER BY `tabAccount`.name LIMIT 50';
cur_frm.fields_dict['parent_account'].get_query = function(doc) {
return {
query: "accounts.doctype.account.account.get_parent_account",
args: { "company": doc.company}
}
}

View File

@ -18,15 +18,11 @@ from __future__ import unicode_literals
import webnotes
from webnotes.utils import flt, fmt_money
from webnotes.model import db_exists
from webnotes.model.wrapper import copy_doclist
from webnotes import msgprint
sql = webnotes.conn.sql
get_value = webnotes.conn.get_value
test_records = []
class DocType:
def __init__(self,d,dl):
self.doc, self.doclist = d,dl
@ -201,3 +197,40 @@ class DocType:
(account_name, old))
return " - ".join(parts)
def get_master_name(doctype, txt, searchfield, start, page_len, args):
return webnotes.conn.sql("""select name from `tab%s` where name like '%%%s%%'""" %
(args["master_type"], txt), as_list=1)
def get_parent_account(doctype, txt, searchfield, start, page_len, args):
return webnotes.conn.sql("""select name from tabAccount
where group_or_ledger = 'Group' and docstatus != 2 and company = '%s'
and name like '%%%s%%'""" % (args["company"], txt))
def make_test_records(verbose):
from webnotes.test_runner import load_module_and_make_records, make_test_objects
load_module_and_make_records("Company", verbose)
accounts = [
# [account_name, parent_account, group_or_ledger]
["_Test Account Stock Expenses", "Direct Expenses - _TC", "Group"],
["_Test Account Shipping Charges", "_Test Account Stock Expenses - _TC", "Ledger"],
["_Test Account Customs Duty", "_Test Account Stock Expenses - _TC", "Ledger"],
["_Test Account Tax Assets", "Current Assets - _TC", "Group"],
["_Test Account VAT", "_Test Account Tax Assets - _TC", "Ledger"],
["_Test Account Cost for Goods Sold", "Expenses - _TC", "Ledger"],
["_Test Account Excise Duty", "_Test Account Tax Assets - _TC", "Ledger"],
["_Test Account Education Cess", "_Test Account Tax Assets - _TC", "Ledger"],
["_Test Account S&H Education Cess", "_Test Account Tax Assets - _TC", "Ledger"],
["_Test Account CST", "Direct Expenses - _TC", "Ledger"],
["_Test Account Discount", "Direct Expenses - _TC", "Ledger"]
]
return make_test_objects([[{
"doctype": "Account",
"account_name": account_name,
"parent_account": parent_account,
"company": "_Test Company",
"group_or_ledger": group_or_ledger
}] for account_name, parent_account, group_or_ledger in accounts])

View File

@ -98,3 +98,13 @@ class DocType(DocTypeNestedSet):
(cost_center_name, old))
return " - ".join(parts)
test_records = [
[{
"doctype": "Cost Center",
"cost_center_name": "_Test Cost Center",
"parent_cost_center": "Root - _TC",
"company_name": "_Test Company",
"group_or_ledger": "Ledger"
}],
]

View File

@ -32,5 +32,10 @@ class DocType:
msgprint(self.doc.name + _(""" is now the default Fiscal Year. \
Please refresh your browser for the change to take effect."""))
test_records = [[{"doctype":"Fiscal Year", "year":"_Test Fiscal Year",
"year_start_date":"2013-01-01"}]]
test_records = [
[{
"doctype": "Fiscal Year",
"year": "_Test Fiscal Year",
"year_start_date": "2013-01-01"
}]
]

View File

@ -152,6 +152,8 @@ class DocType(AccountsController):
if r:
self.doc.remark = ("\n").join(r)
else:
webnotes.msgprint("Remarks is mandatory", raise_exception=1)
def set_aging_date(self):
if self.doc.is_opening != 'Yes':

View File

@ -34,15 +34,15 @@ def load_data():
"group_or_ledger": "Ledger"})
webnotes.insert({"doctype": "Account", "account_name": "Excise Duty",
"parent_account": "Tax Assets - %s" % abbr, "company": company,
"parent_account": "_Test Tax Assets - %s" % abbr, "company": company,
"group_or_ledger": "Ledger"})
webnotes.insert({"doctype": "Account", "account_name": "Education Cess",
"parent_account": "Tax Assets - %s" % abbr, "company": company,
"parent_account": "_Test Tax Assets - %s" % abbr, "company": company,
"group_or_ledger": "Ledger"})
webnotes.insert({"doctype": "Account", "account_name": "S&H Education Cess",
"parent_account": "Tax Assets - %s" % abbr, "company": company,
"parent_account": "_Test Tax Assets - %s" % abbr, "company": company,
"group_or_ledger": "Ledger"})
webnotes.insert({"doctype": "Account", "account_name": "CST",
@ -94,61 +94,68 @@ purchase_invoice_doclist = [
{
"doctype": "Purchase Taxes and Charges", "charge_type": "Actual",
"account_head": "Shipping Charges - %s" % abbr, "rate": 100, "tax_amount": 100,
"category": "Valuation and Total", "parentfield": "other_charges",
"cost_center": "Default Cost Center - %s" % abbr
"category": "Valuation and Total", "parentfield": "purchase_tax_details",
"cost_center": "Default Cost Center - %s" % abbr, "add_deduct_tax": "Add"
},
{
"doctype": "Purchase Taxes and Charges", "charge_type": "On Net Total",
"account_head": "Customs Duty - %s" % abbr, "rate": 10, "tax_amount": 125.00,
"category": "Valuation", "parentfield": "other_charges",
"cost_center": "Default Cost Center - %s" % abbr
"category": "Valuation", "parentfield": "purchase_tax_details",
"cost_center": "Default Cost Center - %s" % abbr, "add_deduct_tax": "Add"
},
{
"doctype": "Purchase Taxes and Charges", "charge_type": "On Net Total",
"account_head": "Excise Duty - %s" % abbr, "rate": 12, "tax_amount": 140.00,
"category": "Total", "parentfield": "other_charges"
"category": "Total", "parentfield": "purchase_tax_details", "add_deduct_tax": "Add"
},
{
"doctype": "Purchase Taxes and Charges", "charge_type": "On Previous Row Amount",
"account_head": "Education Cess - %s" % abbr, "rate": 2, "row_id": 3, "tax_amount": 2.80,
"category": "Total", "parentfield": "other_charges"
"category": "Total", "parentfield": "purchase_tax_details", "add_deduct_tax": "Add"
},
{
"doctype": "Purchase Taxes and Charges", "charge_type": "On Previous Row Amount",
"account_head": "S&H Education Cess - %s" % abbr, "rate": 1, "row_id": 3,
"tax_amount": 1.4, "category": "Total", "parentfield": "other_charges"
"tax_amount": 1.4, "category": "Total", "parentfield": "purchase_tax_details",
"add_deduct_tax": "Add"
},
{
"doctype": "Purchase Taxes and Charges", "charge_type": "On Previous Row Total",
"account_head": "CST - %s" % abbr, "rate": 2, "row_id": 5, "tax_amount": 29.88,
"category": "Total", "parentfield": "other_charges",
"cost_center": "Default Cost Center - %s" % abbr
"category": "Total", "parentfield": "purchase_tax_details",
"cost_center": "Default Cost Center - %s" % abbr, "add_deduct_tax": "Add"
},
{
"doctype": "Purchase Taxes and Charges", "charge_type": "On Net Total",
"account_head": "VAT - Test - %s" % abbr, "rate": 12.5, "tax_amount": 156.25,
"category": "Total", "parentfield": "other_charges"
"category": "Total", "parentfield": "purchase_tax_details", "add_deduct_tax": "Add"
},
{
"doctype": "Purchase Taxes and Charges", "charge_type": "On Previous Row Total",
"account_head": "Discount - %s" % abbr, "rate": -10, "row_id": 7, "tax_amount": -168.03,
"category": "Total", "parentfield": "other_charges",
"cost_center": "Default Cost Center - %s" % abbr
"account_head": "Discount - %s" % abbr, "rate": 10, "row_id": 7, "tax_amount": 168.03,
"category": "Total", "parentfield": "purchase_tax_details",
"cost_center": "Default Cost Center - %s" % abbr, "add_deduct_tax": "Deduct"
},
]
class TestPurchaseReceipt(unittest.TestCase):
class TestPurchaseInvoice(unittest.TestCase):
def setUp(self):
webnotes.conn.begin()
load_data()
# webnotes.conn.set_value("Global Defaults", None, "automatic_inventory_accounting", 1)
self.load_test_data()
def test_gl_entries(self):
from webnotes.model.doclist import DocList
controller = webnotes.insert(DocList(purchase_invoice_doclist))
controller.submit()
controller.load_from_db()
dl = controller.doclist
def load_test_data(self):
from webnotes.test_runner import make_test_records
make_test_records("Cost Center", verbose=0)
make_test_records("Item", verbose=0)
make_test_records("Purchase Invoice", verbose=0)
def atest_gl_entries(self):
wrapper = webnotes.model_wrapper(purchase_invoice_doclist).insert()
wrapper.submit()
wrapper.load_from_db()
dl = wrapper.doclist
expected_gl_entries = {
"East Wind Inc. - %s" % abbr : [0, 1512.30],
@ -166,5 +173,177 @@ class TestPurchaseReceipt(unittest.TestCase):
for d in gl_entries:
self.assertEqual([d.debit, d.credit], expected_gl_entries.get(d.account))
def test_purchase_invoice_calculation(self):
test_doclist = [
# parent
{
"doctype": "Purchase Invoice",
"naming_series": "BILL",
"supplier_name": "_Test Supplier",
"credit_to": "_Test Supplier - _TC",
"bill_no": "NA",
"posting_date": "2013-02-03",
"fiscal_year": "_Test Fiscal Year",
"company": "_Test Company",
"currency": "INR",
"conversion_rate": 1,
"grand_total_import": 0 # for feed
},
# items
{
"doctype": "Purchase Invoice Item",
"parentfield": "entries",
"item_code": "_Test Item Home Desktop 100",
"item_name": "_Test Item Home Desktop 100",
"qty": 10,
"import_rate": 50,
"import_amount": 500,
"rate": 50,
"amount": 50,
"uom": "_Test UOM",
"item_tax_rate": json.dumps({"_Test Account Excise Duty - _TC": 10}),
"expense_head": "_Test Account Cost for Goods Sold - _TC",
"cost_center": "_Test Cost Center - _TC"
},
{
"doctype": "Purchase Invoice Item",
"parentfield": "entries",
"item_code": "_Test Item Home Desktop 200",
"item_name": "_Test Item Home Desktop 200",
"qty": 5,
"import_rate": 150,
"import_amount": 750,
"rate": 150,
"amount": 750,
"uom": "_Test UOM",
"expense_head": "_Test Account Cost for Goods Sold - _TC",
"cost_center": "_Test Cost Center - _TC"
},
# taxes
{
"doctype": "Purchase Taxes and Charges",
"parentfield": "purchase_tax_details",
"charge_type": "Actual",
"account_head": "_Test Account Shipping Charges - _TC",
"cost_center": "_Test Cost Center - _TC",
"description": "Shipping Charges",
"category": "Valuation and Total",
"add_deduct_tax": "Add",
"rate": 100
},
{
"doctype": "Purchase Taxes and Charges",
"parentfield": "purchase_tax_details",
"charge_type": "On Net Total",
"account_head": "_Test Account Customs Duty - _TC",
"cost_center": "_Test Cost Center - _TC",
"description": "Customs Duty",
"category": "Valuation",
"add_deduct_tax": "Add",
"rate": 10
},
{
"doctype": "Purchase Taxes and Charges",
"parentfield": "purchase_tax_details",
"charge_type": "On Net Total",
"account_head": "_Test Account Excise Duty - _TC",
"cost_center": "_Test Cost Center - _TC",
"description": "Excise Duty",
"category": "Total",
"add_deduct_tax": "Add",
"rate": 12
},
{
"doctype": "Purchase Taxes and Charges",
"parentfield": "purchase_tax_details",
"charge_type": "On Previous Row Amount",
"account_head": "_Test Account Education Cess - _TC",
"cost_center": "_Test Cost Center - _TC",
"description": "Education Cess",
"category": "Total",
"add_deduct_tax": "Add",
"rate": 2,
"row_id": 3
},
{
"doctype": "Purchase Taxes and Charges",
"parentfield": "purchase_tax_details",
"charge_type": "On Previous Row Amount",
"account_head": "_Test Account S&H Education Cess - _TC",
"cost_center": "_Test Cost Center - _TC",
"description": "S&H Education Cess",
"category": "Total",
"add_deduct_tax": "Add",
"rate": 1,
"row_id": 3
},
{
"doctype": "Purchase Taxes and Charges",
"parentfield": "purchase_tax_details",
"charge_type": "On Previous Row Total",
"account_head": "_Test Account CST - _TC",
"cost_center": "_Test Cost Center - _TC",
"description": "CST",
"category": "Total",
"add_deduct_tax": "Add",
"rate": 2,
"row_id": 5
},
{
"doctype": "Purchase Taxes and Charges",
"parentfield": "purchase_tax_details",
"charge_type": "On Net Total",
"account_head": "_Test Account VAT - _TC",
"cost_center": "_Test Cost Center - _TC",
"description": "VAT",
"category": "Total",
"add_deduct_tax": "Add",
"rate": 12.5
},
{
"doctype": "Purchase Taxes and Charges",
"parentfield": "purchase_tax_details",
"charge_type": "On Previous Row Total",
"account_head": "_Test Account Discount - _TC",
"cost_center": "_Test Cost Center - _TC",
"description": "Discount",
"category": "Total",
"add_deduct_tax": "Deduct",
"rate": 10,
"row_id": 7
},
]
wrapper = webnotes.model_wrapper(test_doclist).insert()
wrapper.load_from_db()
# tax amounts
expected_values = [
["_Test Account Shipping Charges - _TC", 100, 1350],
["_Test Account Customs Duty - _TC", 125, 1350],
["_Test Account Excise Duty - _TC", 140, 1490],
["_Test Account Education Cess - _TC", 2.8, 1492.8],
["_Test Account S&H Education Cess - _TC", 1.4, 1494.2],
["_Test Account CST - _TC", 29.88, 1524.08],
["_Test Account VAT - _TC", 156.25, 1680.33],
["_Test Account Discount - _TC", 168.03, 1512.30],
]
for i, tax in enumerate(wrapper.doclist.get({"parentfield": "purchase_tax_details"})):
self.assertEqual(tax.account_head, expected_values[i][0])
self.assertEqual(tax.tax_amount, expected_values[i][1])
self.assertEqual(tax.total, expected_values[i][2])
expected_values = [
["_Test Item Home Desktop 100", 90],
["_Test Item Home Desktop 200", 135]
]
for i, item in enumerate(wrapper.doclist.get({"parentfield": "entries"})):
self.assertEqual(item.item_code, expected_values[i][0])
self.assertEqual(item.item_tax_amount, expected_values[i][1])
# self.assertEqual(dl[0].net_total, 1250)
def tearDown(self):
webnotes.conn.rollback()

View File

@ -32,16 +32,16 @@ def load_data():
# create customer group
webnotes.insert({"doctype": "Customer Group",
"customer_group_name": "Default Customer Group",
"customer_group_name": "_Test Customer Group",
"parent_customer_group": "All Customer Groups", "is_group": "No"})
# create customer
webnotes.insert({"doctype": "Customer", "customer_name": "West Wind Inc.",
"customer_type": "Company", "territory": "Default",
"customer_group": "Default Customer Group", "company": company,
"customer_group": "_Test Customer Group", "company": company,
"credit_days": 50, "credit_limit": 0})
webnotes.insert({"doctype": "Account", "account_name": "Sales",
webnotes.insert({"doctype": "Account", "account_name": "_Test Account Sales",
"parent_account": "Income - %s" % abbr, "company": company,
"group_or_ledger": "Ledger"})
@ -93,15 +93,15 @@ sales_invoice_doclist = [
"doctype": "Sales Invoice Item", "warehouse": "Default Warehouse",
"item_code": "Home Desktop 100", "qty": 10, "basic_rate": 50, "amount": 500,
"parentfield": "entries", "so_detail": None, "dn_detail": None,
"uom": "Nos", "item_tax_rate": json.dumps({"Excise Duty - %s" % abbr: 10}),
"income_account": "Sales - %s" % abbr,
"stock_uom": "Nos", "item_tax_rate": json.dumps({"Excise Duty - %s" % abbr: 10}),
"income_account": "_Test Account Sales - %s" % abbr,
"cost_center": "Default Cost Center - %s" % abbr
},
{
"doctype": "Sales Invoice Item", "warehouse": "Default Warehouse",
"item_code": "Home Desktop 200", "qty": 5, "basic_rate": 150, "amount": 750,
"so_detail": None, "dn_detail": None,
"parentfield": "entries", "uom": "Nos", "income_account": "Sales - %s" % abbr,
"parentfield": "entries", "stock_uom": "Nos", "income_account": "_Test Account Sales - %s" % abbr,
"cost_center": "Default Cost Center - %s" % abbr
},
# taxes
@ -211,7 +211,7 @@ class TestSalesInvoice(unittest.TestCase):
expected_gl_entries = {
"West Wind Inc. - %s" % abbr : [1627.05, 0.0],
"Sales - %s" % abbr: [0.0, 1250.00],
"_Test Account Sales - %s" % abbr: [0.0, 1250.00],
"Shipping Charges - %s" % abbr: [0.0, 100],
"Customs Duty - %s" % abbr: [0, 125.0],
"Excise Duty - %s" % abbr: [0, 140],

View File

@ -168,7 +168,7 @@ def import_vouchers(common_values, data, start_idx, import_type):
webnotes.conn.commit()
except Exception, e:
webnotes.conn.rollback()
err_msg = webnotes.message_log and webnotes.message_log[0] or unicode(e)
err_msg = webnotes.message_log and "<br>".join(webnotes.message_log) or unicode(e)
messages.append("""<p style='color: red'>[row #%s] %s failed: %s</p>"""
% ((start_idx + 1) + i, jv.name or "", err_msg or "No message"))
messages.append("<p style='color: red'>All transactions rolled back</p>")

View File

@ -1,8 +1,8 @@
[
{
"creation": "2013-01-28 10:05:59",
"creation": "2013-01-30 12:49:48",
"docstatus": 0,
"modified": "2013-01-29 16:28:05",
"modified": "2013-02-07 10:49:35",
"modified_by": "Administrator",
"owner": "Administrator"
},
@ -344,7 +344,7 @@
"oldfieldtype": "Currency",
"print_hide": 1,
"print_width": "100px",
"read_only": 1,
"read_only": 0,
"width": "100px"
},
{

View File

@ -182,3 +182,12 @@ class DocType(TransactionBase):
#update master_name in doctype account
webnotes.conn.sql("""update `tabAccount` set master_name = %s,
master_type = 'Supplier' where master_name = %s""" , (new,old))
test_records = [
[{
"doctype": "Supplier",
"supplier_name": "_Test Supplier",
"supplier_type": "_Test Supplier Type",
"company": "_Test Company"
}]
]

View File

@ -17,7 +17,6 @@
from __future__ import unicode_literals
import webnotes
from webnotes.utils import flt
from webnotes.model.doc import addchild
from utilities.transaction_base import TransactionBase
class AccountsController(TransactionBase):
@ -47,15 +46,13 @@ class AccountsController(TransactionBase):
return stock_in_hand
def clear_unallocated_advances(self, parenttype, parentfield):
for d in self.doclist:
if d.parentfield == parentfield and flt(d.allocated_amount) == 0:
self.doclist.remove(d)
def clear_unallocated_advances(self, childtype, parentfield):
self.doclist.remove_items({"parentfield": parentfield, "allocated_amount": ["in", [0, None, ""]]})
webnotes.conn.sql("""delete from `tab%s` where parent = %s
and ifnull(allocated_amount, 0) = 0""" % (parenttype, '%s'), self.doc.name)
webnotes.conn.sql("""delete from `tab%s` where parentfield=%s and parent = %s
and ifnull(allocated_amount, 0) = 0""" % (childtype, '%s', '%s'), (parentfield, self.doc.name))
def get_advances(self, account_head, parenttype, parentfield, dr_or_cr):
def get_advances(self, account_head, child_doctype, parentfield, dr_or_cr):
res = webnotes.conn.sql("""select t1.name as jv_no, t1.remark,
t2.%s as amount, t2.name as jv_detail_no
from `tabJournal Voucher` t1, `tabJournal Voucher Detail` t2
@ -68,9 +65,12 @@ class AccountsController(TransactionBase):
self.doclist = self.doc.clear_table(self.doclist, parentfield)
for d in res:
add = addchild(self.doc, parentfield, parenttype, self.doclist)
add.journal_voucher = d.jv_no
add.jv_detail_no = d.jv_detail_no
add.remarks = d.remark
add.advance_amount = flt(d.amount)
add.allocate_amount = 0
self.doclist.append({
"doctype": child_doctype,
"parentfield": parentfield,
"journal_voucher": d.jv_no,
"jv_detail_no": d.jv_detail_no,
"remarks": d.remark,
"advance_amount": flt(d.amount),
"allocate_amount": 0
})

View File

@ -84,3 +84,14 @@ class BuyingController(AccountsController):
if self.meta.get_field("in_words_import"):
self.doc.in_words_import = money_in_words(self.doc.grand_total_import,
self.doc.currency)
def calculate_taxes_and_totals(self):
self.doc.conversion_rate = flt(self.doc.conversion_rate)
# self.calculate_item_values()
# self.initialize_taxes()
# self.calculate_net_total()
# self.calculate_taxes()
# self.calculate_totals()
# self.set_total_in_words()

View File

@ -77,10 +77,9 @@ class DocType:
msgprint("Total weightage assigned should be 100%. It is :" + str(total_w) + "%",
raise_exception=1)
if webnotes.conn.get_default("employee", webnotes.session.user) != self.doc.employee:
if total==0:
msgprint("Total can't be zero. You must atleast give some points!", raise_exception=1)
if webnotes.conn.get_value("Employee", self.doc.employee, "user_id") != \
webnotes.session.user and total == 0:
msgprint("Total can't be zero. You must atleast give some points!", raise_exception=1)
self.doc.total_score = total

View File

@ -2,7 +2,7 @@
{
"creation": "2013-01-23 19:57:17",
"docstatus": 0,
"modified": "2013-01-29 17:47:25",
"modified": "2013-02-08 13:07:25",
"modified_by": "Administrator",
"owner": "Administrator"
},
@ -543,14 +543,6 @@
"fieldtype": "Date",
"label": "Valid Upto"
},
{
"doctype": "DocField",
"fieldname": "salary_structure",
"fieldtype": "Button",
"hidden": 1,
"label": "Salary Structure",
"oldfieldtype": "Button"
},
{
"doctype": "DocField",
"fieldname": "place_of_issue",

View File

@ -23,7 +23,8 @@ class DocType:
test_records = [[{
"doctype":"Holiday Block List",
"holiday_block_list_name": "_Test Holiday Block List",
"year": "_Test Fiscal Year"
"year": "_Test Fiscal Year",
"company": "_Test Company"
}, {
"doctype": "Holiday Block List Date",
"parent": "_Test Holiday Block List",

View File

@ -2,7 +2,7 @@
{
"creation": "2013-02-04 15:31:29",
"docstatus": 0,
"modified": "2013-02-06 14:39:09",
"modified": "2013-02-07 08:47:25",
"modified_by": "Administrator",
"owner": "Administrator"
},
@ -53,6 +53,21 @@
"options": "Fiscal Year",
"reqd": 1
},
{
"doctype": "DocField",
"fieldname": "company",
"fieldtype": "Link",
"label": "Company",
"options": "Company",
"reqd": 1
},
{
"description": "If not checked, the list will have to be added to each Department where it has to be applied.",
"doctype": "DocField",
"fieldname": "applies_to_all_departments",
"fieldtype": "Check",
"label": "Applies to all Departments"
},
{
"description": "Stop users from making Leave Applications on following days.",
"doctype": "DocField",

View File

@ -46,22 +46,39 @@ class DocType:
raise_exception=True)
def validate_block_days(self):
from_date = getdate(self.doc.from_date)
to_date = getdate(self.doc.to_date)
for block_list in self.get_applicable_block_lists():
self.check_block_dates(block_list)
def get_applicable_block_lists(self):
block_lists = []
def add_block_list(block_list):
if block_list:
if not self.is_user_in_allow_list(block_list):
block_lists.append(block_list)
# per department
department = webnotes.conn.get_value("Employee", self.doc.employee, "department")
if department:
block_list = webnotes.conn.get_value("Department", department, "holiday_block_list")
if block_list:
if self.is_user_in_allow_list(block_list):
return
for d in webnotes.conn.sql("""select block_date, reason from
`tabHoliday Block List Date` where parent=%s""", block_list, as_dict=1):
block_date = getdate(d.block_date)
if block_date > from_date and block_date < to_date:
webnotes.msgprint(_("You cannot apply for a leave on the following date because it is blocked")
+ ": " + formatdate(d.block_date) + _(" Reason: ") + d.reason)
raise LeaveDayBlockedError
add_block_list(block_list)
# global
for block_list in webnotes.conn.sql_list("""select name from `tabHoliday Block List`
where ifnull(applies_to_all_departments,0)=1 and company=%s""", self.doc.company):
add_block_list(block_list)
return block_lists
def check_block_dates(self, block_list):
from_date = getdate(self.doc.from_date)
to_date = getdate(self.doc.to_date)
for d in webnotes.conn.sql("""select block_date, reason from
`tabHoliday Block List Date` where parent=%s""", block_list, as_dict=1):
block_date = getdate(d.block_date)
if block_date > from_date and block_date < to_date:
webnotes.msgprint(_("You cannot apply for a leave on the following date because it is blocked")
+ ": " + formatdate(d.block_date) + _(" Reason: ") + d.reason)
raise LeaveDayBlockedError
def is_user_in_allow_list(self, block_list):
return webnotes.session.user in webnotes.conn.sql_list("""select allow_user

View File

@ -1,8 +1,8 @@
[
{
"creation": "2013-01-10 16:34:14",
"creation": "2013-02-02 14:40:08",
"docstatus": 0,
"modified": "2013-02-01 10:34:14",
"modified": "2013-02-08 11:27:22",
"modified_by": "Administrator",
"owner": "Administrator"
},
@ -165,7 +165,7 @@
"fieldtype": "Date",
"label": "Posting Date",
"no_copy": 1,
"permlevel": 2,
"permlevel": 0,
"reqd": 1
},
{
@ -175,18 +175,27 @@
"in_filter": 1,
"label": "Fiscal Year",
"options": "link:Fiscal Year",
"permlevel": 2,
"permlevel": 0,
"read_only": 0,
"reqd": 1,
"search_index": 0
},
{
"doctype": "DocField",
"fieldname": "company",
"fieldtype": "Link",
"label": "Company",
"options": "Company",
"permlevel": 0,
"reqd": 1
},
{
"doctype": "DocField",
"fieldname": "letter_head",
"fieldtype": "Link",
"label": "Letter Head",
"options": "Letter Head",
"permlevel": 2,
"permlevel": 0,
"print_hide": 1,
"read_only": 0
},

View File

@ -1,23 +1,39 @@
import sys
import unittest
if __name__=="__main__":
sys.path.extend([".", "app", "lib"])
from hr.doctype.leave_application.leave_application import LeaveDayBlockedError
class TestLeaveApplication(unittest.TestCase):
def get_application(self):
application = webnotes.model_wrapper(test_records[1])
application.doc.from_date = "2013-01-01"
application.doc.to_date = "2013-01-05"
return application
def test_block_list(self):
import webnotes
webnotes.conn.set_value("Employee", "_T-Employee-0001", "department",
"_Test Department with Block List")
application = webnotes.model_wrapper(test_records[1])
application.doc.from_date = "2013-01-01"
application.doc.to_date = "2013-01-05"
application = self.get_application()
self.assertRaises(LeaveDayBlockedError, application.insert)
webnotes.session.user = "test1@erpnext.com"
webnotes.get_obj("Profile", "test1@erpnext.com").add_role("HR User")
self.assertTrue(application.insert())
def test_global_block_list(self):
application = self.get_application()
webnotes.conn.set_value("Holiday Block List", "_Test Holiday Block List",
"applies_to_all_departments", 1)
webnotes.conn.set_value("Employee", "_T-Employee-0001", "department",
"_Test Department")
webnotes.session.user = "test@erpnext.com"
self.assertRaises(LeaveDayBlockedError, application.insert)
test_records = [
[{
@ -35,11 +51,11 @@ test_records = [
"to_date": "2013-05-05",
"posting_date": "2013-01-02",
"fiscal_year": "_Test Fiscal Year",
"employee": "_T-Employee-0001"
"employee": "_T-Employee-0001",
"company": "_Test Company"
}]]
if __name__=="__main__":
sys.path.extend(["app", "lib"])
import webnotes
webnotes.connect()

View File

@ -0,0 +1,12 @@
def execute():
import webnotes
webnotes.reload_doc("hr", "doctype", "leave_application")
webnotes.conn.sql("""update `tabLeave Application`, `tabEmployee` set
`tabLeave Application`.company = `tabEmployee`.company where
`tabLeave Application`.employee = `tabEmployee`.name""")
company = webnotes.conn.get_default("company")
if company:
webnotes.conn.sql("""update `tabLeave Application`
set company = %s where ifnull(company,'')=''""", company)

View File

@ -166,4 +166,5 @@ patch_list = [
"patches.february_2013.remove_sales_order_pending_items",
"patches.february_2013.account_negative_balance",
"patches.february_2013.remove_account_utils_folder",
"patches.february_2013.update_company_in_leave_application"
]

View File

@ -249,3 +249,14 @@ class DocType(TransactionBase):
#update master_name in doctype account
webnotes.conn.sql("""update `tabAccount` set master_name = %s,
master_type = 'Customer' where master_name = %s""", (new,old))
test_records = [
[{
"doctype": "Customer",
"customer_name": "_Test Customer",
"customer_type": "Individual",
"customer_group": "_Test Customer Group",
"territory": "_Test Territory",
"company": "_Test Company"
}]
]

View File

@ -20,3 +20,10 @@ import webnotes
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
test_records = [
[{
"doctype": "Brand",
"brand": "_Test Brand"
}]
]

View File

@ -258,9 +258,9 @@ class DocType:
test_records = [
[{
"doctype": "Company",
"company_name": "_Test Company",
"abbr": "TC",
"abbr": "_TC",
"default_currency": "INR",
"doctype": "Company"
}]
}],
]

View File

@ -20,3 +20,10 @@ import webnotes
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
test_records = [
[{
"doctype": "Country",
"country_name": "_Test Country"
}]
]

View File

@ -20,5 +20,3 @@ import webnotes
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
test_records = []

View File

@ -16,9 +16,6 @@
from __future__ import unicode_literals
import webnotes
from webnotes.model import db_exists
from webnotes.model.wrapper import copy_doclist
from webnotes import msgprint
sql = webnotes.conn.sql
@ -64,3 +61,12 @@ class DocType(DocTypeNestedSet):
# rebuild tree
super(DocType, self).on_trash()
test_records = [
[{
"doctype": "Customer Group",
"customer_group_name": "_Test Customer Group",
"parent_customer_group": "All Customer Groups",
"is_group": "No"
}]
]

View File

@ -68,3 +68,18 @@ class DocType(DocTypeNestedSet):
if self.doc.slideshow:
from website.helpers.slideshow import get_slideshow
get_slideshow(self)
test_records = [
[{
"doctype": "Item Group",
"item_group_name": "_Test Item Group",
"parent_item_group": "All Item Groups",
"is_group": "No"
}],
[{
"doctype": "Item Group",
"item_group_name": "_Test Item Group Desktops",
"parent_item_group": "All Item Groups",
"is_group": "No"
}],
]

View File

@ -20,3 +20,11 @@ import webnotes
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
test_records = [
[{
"doctype": "Supplier Type",
"supplier_type": "_Test Supplier Type",
}]
]

View File

@ -33,3 +33,12 @@ class DocType(DocTypeNestedSet):
if not flt(d.target_qty) and not flt(d.target_amount):
msgprint("Either target qty or target amount is mandatory.")
raise Exception
test_records = [
[{
"doctype": "Territory",
"territory_name": "_Test Territory",
"parent_territory": "All Territories",
"is_group": "No",
}]
]

View File

@ -20,3 +20,10 @@ import webnotes
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
test_records = [
[{
"doctype": "UOM",
"uom_name": "_Test UOM"
}]
]

View File

@ -20,3 +20,10 @@ import webnotes
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
test_records = [
[{
"doctype": "Warehouse Type",
"warehouse_type": "_Test Warehouse Type"
}]
]

View File

@ -47,7 +47,7 @@ data_map = {
"order_by": "lft"
},
"GL Entry": {
"columns": ["account", "posting_date", "cost_center", "debit", "credit", "is_opening",
"columns": ["name", "account", "posting_date", "cost_center", "debit", "credit", "is_opening",
"company", "voucher_type", "voucher_no", "remarks"],
"conditions": ["ifnull(is_cancelled, 'No')='No'"],
"order_by": "posting_date, account",
@ -86,7 +86,7 @@ data_map = {
"order_by": "name"
},
"Stock Ledger Entry": {
"columns": ["posting_date", "posting_time", "item_code", "warehouse", "actual_qty as qty",
"columns": ["name", "posting_date", "posting_time", "item_code", "warehouse", "actual_qty as qty",
"voucher_type", "voucher_no", "ifnull(incoming_rate,0) as incoming_rate"],
"conditions": ["ifnull(is_cancelled, 'No')='No'"],
"order_by": "posting_date, posting_time, name",
@ -102,7 +102,7 @@ data_map = {
"order_by": "posting_date, posting_time, name",
},
"Production Order": {
"columns": ["production_item as item_code",
"columns": ["name", "production_item as item_code",
"(ifnull(qty, 0) - ifnull(produced_qty, 0)) as qty",
"fg_warehouse as warehouse"],
"conditions": ["docstatus=1", "status != 'Stopped'", "ifnull(fg_warehouse, '')!=''",
@ -113,7 +113,7 @@ data_map = {
},
},
"Purchase Request Item": {
"columns": ["item_code", "warehouse",
"columns": ["name", "item_code", "warehouse",
"(ifnull(qty, 0) - ifnull(ordered_qty, 0)) as qty"],
"from": "`tabPurchase Request Item` item, `tabPurchase Request` main",
"conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'",
@ -124,7 +124,7 @@ data_map = {
},
},
"Purchase Order Item": {
"columns": ["item_code", "warehouse",
"columns": ["name", "item_code", "warehouse",
"(ifnull(qty, 0) - ifnull(received_qty, 0)) as qty"],
"from": "`tabPurchase Order Item` item, `tabPurchase Order` main",
"conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'",
@ -136,7 +136,7 @@ data_map = {
},
"Sales Order Item": {
"columns": ["item_code", "(ifnull(qty, 0) - ifnull(delivered_qty, 0)) as qty",
"columns": ["name", "item_code", "(ifnull(qty, 0) - ifnull(delivered_qty, 0)) as qty",
"reserved_warehouse as warehouse"],
"from": "`tabSales Order Item` item, `tabSales Order` main",
"conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'",
@ -178,7 +178,7 @@ data_map = {
}
},
"Sales Invoice Item": {
"columns": ["parent", "item_code", "qty", "amount"],
"columns": ["name", "parent", "item_code", "qty", "amount"],
"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
"order_by": "parent",
"links": {
@ -196,7 +196,7 @@ data_map = {
}
},
"Sales Order Item[Sales Analytics]": {
"columns": ["parent", "item_code", "qty", "amount"],
"columns": ["name", "parent", "item_code", "qty", "amount"],
"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
"order_by": "parent",
"links": {
@ -214,7 +214,7 @@ data_map = {
}
},
"Delivery Note Item[Sales Analytics]": {
"columns": ["parent", "item_code", "qty", "amount"],
"columns": ["name", "parent", "item_code", "qty", "amount"],
"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
"order_by": "parent",
"links": {
@ -246,7 +246,7 @@ data_map = {
}
},
"Purchase Invoice Item": {
"columns": ["parent", "item_code", "qty", "amount"],
"columns": ["name", "parent", "item_code", "qty", "amount"],
"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
"order_by": "parent",
"links": {
@ -264,7 +264,7 @@ data_map = {
}
},
"Purchase Order Item[Purchase Analytics]": {
"columns": ["parent", "item_code", "qty", "amount"],
"columns": ["name", "parent", "item_code", "qty", "amount"],
"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
"order_by": "parent",
"links": {
@ -282,7 +282,7 @@ data_map = {
}
},
"Purchase Receipt Item[Purchase Analytics]": {
"columns": ["parent", "item_code", "qty", "amount"],
"columns": ["name", "parent", "item_code", "qty", "amount"],
"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
"order_by": "parent",
"links": {

View File

@ -122,21 +122,20 @@ class DocType:
cust_code.append(d.ref_code)
self.doc.customer_code=','.join(cust_code)
# Check whether Tax Rate is not entered twice for same Tax Type
def check_item_tax(self):
"""Check whether Tax Rate is not entered twice for same Tax Type"""
check_list=[]
for d in getlist(self.doclist,'item_tax'):
account_type = sql("select account_type from tabAccount where name = %s",d.tax_type)
account_type = account_type and account_type[0][0] or ''
if account_type not in ['Tax', 'Chargeable']:
msgprint("'%s' is not Tax / Chargeable Account"%(d.tax_type))
raise Exception, "Tax Account validation"
else:
if d.tax_type in check_list:
msgprint("Rate is entered twice for Tax : '%s'." % (d.tax_type))
raise Exception
if d.tax_type:
account_type = webnotes.conn.get_value("Account", d.tax_type, "account_type")
if account_type not in ['Tax', 'Chargeable']:
msgprint("'%s' is not Tax / Chargeable Account" % d.tax_type, raise_exception=1)
else:
check_list.append(d.tax_type)
if d.tax_type in check_list:
msgprint("Rate is entered twice for: '%s'" % d.tax_type, raise_exception=1)
else:
check_list.append(d.tax_type)
def check_for_active_boms(self, field_label):
if field_label in ['Is Active', 'Is Purchase Item']:
@ -222,3 +221,49 @@ class DocType:
if self.doc.slideshow:
from website.helpers.slideshow import get_slideshow
get_slideshow(self)
test_records = [
[{
"doctype": "Item",
"item_code": "_Test Item Home Desktop 100",
"item_name": "_Test Item Home Desktop 100",
"description": "_Test Item Home Desktop 100",
"item_group": "_Test Item Group Desktops",
"is_stock_item": "Yes",
"is_asset_item": "No",
"has_batch_no": "No",
"has_serial_no": "No",
"is_purchase_item": "Yes",
"is_sales_item": "Yes",
"is_service_item": "No",
"is_sample_item": "No",
"inspection_required": "No",
"is_pro_applicable": "No",
"is_sub_contracted_item": "No",
"stock_uom": "_Test UOM"
},
{
"doctype": "Item Tax",
"tax_type": "_Test Account Excise Duty - _TC",
"tax_rate": 10
}],
[{
"doctype": "Item",
"item_code": "_Test Item Home Desktop 200",
"item_name": "_Test Item Home Desktop 200",
"description": "_Test Item Home Desktop 200",
"item_group": "_Test Item Group Desktops",
"is_stock_item": "Yes",
"is_asset_item": "No",
"has_batch_no": "No",
"has_serial_no": "No",
"is_purchase_item": "Yes",
"is_sales_item": "Yes",
"is_service_item": "No",
"is_sample_item": "No",
"inspection_required": "No",
"is_pro_applicable": "No",
"is_sub_contracted_item": "No",
"stock_uom": "_Test UOM"
}],
]

View File

@ -56,7 +56,7 @@ def load_data():
webnotes.insert({"doctype": "Cost Center", "group_or_ledger": "Ledger",
"cost_center_name": "Default Cost Center",
"parent_cost_center": "Root - %s" % abbr,
"company_name": company, "company_abbr": abbr})
"company_name": company})
# create account heads for taxes
@ -67,11 +67,11 @@ def load_data():
webnotes.insert({"doctype": "Account", "account_name": "Customs Duty",
"parent_account": "Stock Expenses - %s" % abbr, "company": company,
"group_or_ledger": "Ledger"})
webnotes.insert({"doctype": "Account", "account_name": "Tax Assets",
webnotes.insert({"doctype": "Account", "account_name": "_Test Tax Assets",
"parent_account": "Current Assets - %s" % abbr, "company": company,
"group_or_ledger": "Group"})
webnotes.insert({"doctype": "Account", "account_name": "VAT - Test",
"parent_account": "Tax Assets - %s" % abbr, "company": company,
"parent_account": "_Test Tax Assets - %s" % abbr, "company": company,
"group_or_ledger": "Ledger"})
# create BOM

View File

@ -1,8 +1,8 @@
[
{
"creation": "2013-01-28 10:06:02",
"creation": "2013-01-30 12:49:56",
"docstatus": 0,
"modified": "2013-01-29 16:28:06",
"modified": "2013-02-07 10:50:00",
"modified_by": "Administrator",
"owner": "Administrator"
},

View File

@ -18,7 +18,6 @@ from __future__ import unicode_literals
import webnotes
from webnotes.utils import cstr, flt, validate_email_add
from webnotes.model.doc import Document
from webnotes.model.code import get_obj
from webnotes import msgprint
@ -204,7 +203,15 @@ class DocType:
# delete cancelled sle
if sql("""select name from `tabStock Ledger Entry`
where warehouse = %s and ifnull('is_cancelled', '') = 'No'""", self.doc.name):
mdgprint("""Warehosue can not be deleted as stock ledger entry
exists for this warehosue.""", raise_exception=1)
msgprint("""Warehosue can not be deleted as stock ledger entry
exists for this warehouse.""", raise_exception=1)
else:
sql("delete from `tabStock Ledger Entry` where warehouse = %s", self.doc.name)
test_records = [
[{
"doctype": "Warehouse",
"warehouse_name": "_Test Warehouse",
"warehouse_type": "_Test Warehouse Type"
}]
]

View File

@ -148,7 +148,7 @@ def get_valid_serial_nos(sr_nos, qty=0, item_code=''):
return valid_serial_nos
def get_warehouse_list(doctype, txt, searchfield, start, page_len):
def get_warehouse_list(doctype, txt, searchfield, start, page_len, args):
"""used in search queries"""
wlist = []
for w in webnotes.conn.sql_list("""select name from tabWarehouse