Merge branch 'master' into edge

This commit is contained in:
Rushabh Mehta 2013-03-28 16:27:33 +05:30
commit 693c4b014d
29 changed files with 497 additions and 477 deletions

View File

@ -18,169 +18,171 @@ from __future__ import unicode_literals
import unittest
import webnotes
from webnotes.model.doc import Document
from webnotes.model.code import get_obj
from webnotes.utils import cstr, flt
sql = webnotes.conn.sql
test_records = []
class TestInternalReco(unittest.TestCase):
def setUp(self):
webnotes.conn.begin()
comp1.save(1)
cust1.save(1)
bank1.save(1)
rv1.save(1)
rv_gle.save(1)
for t in jv1: t.save(1)
for t in jv1[1:]:
sql("update `tabJournal Voucher Detail` set parent = '%s' where name = '%s'" % (jv1[0].name, t.name))
ir[0].save()
for t in ir[1:]:
t.save(1)
sql("update `tabPayment to Invoice Matching Tool Detail` set voucher_no = '%s', voucher_detail_no = '%s' where parent = 'Payment to Invoice Matching Tool'" % (jv1[0].name, jv1[1].name))
sql("update `tabGL Entry` set voucher_no = %s, against_voucher = %s where voucher_no = 'rv1'", (rv1.name, rv1.name))
sql("update `tabSingles` set value = %s where doctype = 'Payment to Invoice Matching Tool' and field = 'voucher_no'", rv1.name)
self.ir = get_obj('Payment to Invoice Matching Tool', with_children=1)
self.ir.reconcile()
#===========================
def test_jv(self):
"""
Test whether JV has benn properly splitted and against doc has been updated
"""
amt_against_doc = [[cstr(d[0]), flt(d[1]), flt(d[2])]for d in sql("select against_invoice, debit, credit from `tabJournal Voucher Detail` where parent = %s and account = 'cust1 - c1'", jv1[0].name)]
self.assertTrue(amt_against_doc == [[rv1.name, 0, 100.0], ['', 0, 400.0]])
#============================
def test_gl_entry(self):
"""
Check proper gl entry has been made
"""
gle = [[cstr(d[0]), flt(d[1])] for d in sql("select against_voucher, sum(credit) - sum(debit) from `tabGL Entry` where voucher_no = %s and account = 'cust1 - c1' and ifnull(is_cancelled, 'No') = 'No' group by against_voucher", jv1[0].name)]
self.assertTrue([rv1.name, 100.0] in gle)
self.assertTrue(['', 400.0] in gle)
#============================
def test_outstanding(self):
"""
Check whether Outstanding amount has been properly updated in RV
"""
amt = sql("select outstanding_amount from `tabSales Invoice` where name = '%s'" % rv1.name)[0][0]
self.assertTrue(amt == 0)
#============================
def tearDown(self):
webnotes.conn.rollback()
# test data
#---------------
rv1 = Document(fielddata={
'doctype':'Sales Invoice',
'docstatus':1,
'debit_to':'cust1 - c1',
'grand_total': 100,
'outstanding_amount': 100,
'name': 'rv1'
})
jv1 = [Document(fielddata={
'doctype':'Journal Voucher',
'docstatus':1,
'cheque_no': '163567',
'docstatus':1,
'company': 'comp1',
'posting_date' : '2011-05-02',
'remark': 'test data',
'fiscal_year': '2011-2012',
'total_debit': 500,
'total_credit': 500
}),
Document(fielddata = {
'parenttype':'Journal Voucher',
'parentfield':'entries',
'doctype':'Journal Voucher Detail',
'account' : 'cust1 - c1',
'credit':500,
'debit' : 0,
'docstatus':1
}),
Document(fielddata = {
'parenttype':'Journal Voucher',
'parentfield':'entries',
'doctype':'Journal Voucher Detail',
'account' : 'bank1 - c1',
'credit':0,
'debit' : 500,
'docstatus':1
})]
ir = [Document(fielddata = {
'doctype':'Payment to Invoice Matching Tool',
'name' : 'Payment to Invoice Matching Tool',
'account':'cust1 - c1',
'voucher_type' : 'Sales Invoice',
'voucher_no': 'rv1'
}),
Document(fielddata = {
'parenttype':'Payment to Invoice Matching Tool',
'parentfield':'ir_payment_details',
'doctype':'Payment to Invoice Matching Tool Detail',
'parent': 'Payment to Invoice Matching Tool',
'voucher_no': 'jv1',
'name' : '123112',
'voucher_detail_no' : 'jvd1',
'selected' : 1,
'amt_due' : 500,
'amt_to_be_reconciled':100
})]
cust1 = Document(fielddata={
'doctype':'Account',
'docstatus':0,
'account_name' : 'cust1',
'debit_or_credit': 'Debit',
'company' : 'comp1',
'lft': 1,
'rgt': 2
})
bank1 = Document(fielddata={
'doctype':'Account',
'docstatus':0,
'account_name' : 'bank1',
'debit_or_credit': 'Debit',
'company' : 'comp1',
'lft': 3,
'rgt': 4
})
comp1 = Document(fielddata={
'doctype':'Company',
'abbr': 'c1',
'company_name' : 'comp1',
'name': 'comp1'
})
rv_gle = Document(fielddata={
'doctype':'GL Entry',
'account': 'cust1 - c1',
'company' : 'comp1',
'voucher_no': 'rv1',
'against_voucher': 'rv1',
'against_voucher_type': 'Sales Invoice',
'voucher_type' : 'Sales Invoice',
'debit': 100,
'credit': 0
})
# from webnotes.model.doc import Document
# from webnotes.model.code import get_obj
# from webnotes.utils import cstr, flt
# sql = webnotes.conn.sql
#
# class TestInternalReco(unittest.TestCase):
# def setUp(self):
# webnotes.conn.begin()
#
# comp1.save(1)
# cust1.save(1)
# bank1.save(1)
# rv1.save(1)
# rv_gle.save(1)
#
#
# for t in jv1: t.save(1)
# for t in jv1[1:]:
# sql("update `tabJournal Voucher Detail` set parent = '%s' where name = '%s'" % (jv1[0].name, t.name))
#
# ir[0].save()
# for t in ir[1:]:
# t.save(1)
# sql("update `tabPayment to Invoice Matching Tool Detail` set voucher_no = '%s', voucher_detail_no = '%s' where parent = 'Payment to Invoice Matching Tool'" % (jv1[0].name, jv1[1].name))
#
#
# sql("update `tabGL Entry` set voucher_no = %s, against_voucher = %s where voucher_no = 'rv1'", (rv1.name, rv1.name))
# sql("update `tabSingles` set value = %s where doctype = 'Payment to Invoice Matching Tool' and field = 'voucher_no'", rv1.name)
#
#
# self.ir = get_obj('Payment to Invoice Matching Tool', with_children=1)
# self.ir.reconcile()
#
# #===========================
# def test_jv(self):
# """
# Test whether JV has benn properly splitted and against doc has been updated
# """
# amt_against_doc = [[cstr(d[0]), flt(d[1]), flt(d[2])]for d in sql("select against_invoice, debit, credit from `tabJournal Voucher Detail` where parent = %s and account = 'cust1 - c1'", jv1[0].name)]
# self.assertTrue(amt_against_doc == [[rv1.name, 0, 100.0], ['', 0, 400.0]])
#
# #============================
# def test_gl_entry(self):
# """
# Check proper gl entry has been made
# """
# gle = [[cstr(d[0]), flt(d[1])] for d in sql("select against_voucher, sum(credit) - sum(debit) from `tabGL Entry` where voucher_no = %s and account = 'cust1 - c1' and ifnull(is_cancelled, 'No') = 'No' group by against_voucher", jv1[0].name)]
#
# self.assertTrue([rv1.name, 100.0] in gle)
# self.assertTrue(['', 400.0] in gle)
#
# #============================
# def test_outstanding(self):
# """
# Check whether Outstanding amount has been properly updated in RV
# """
# amt = sql("select outstanding_amount from `tabSales Invoice` where name = '%s'" % rv1.name)[0][0]
# self.assertTrue(amt == 0)
#
# #============================
# def tearDown(self):
# webnotes.conn.rollback()
#
#
#
#
# # test data
# #---------------
# rv1 = Document(fielddata={
# 'doctype':'Sales Invoice',
# 'docstatus':1,
# 'debit_to':'cust1 - c1',
# 'grand_total': 100,
# 'outstanding_amount': 100,
# 'name': 'rv1'
# })
#
# jv1 = [Document(fielddata={
# 'doctype':'Journal Voucher',
# 'docstatus':1,
# 'cheque_no': '163567',
# 'docstatus':1,
# 'company': 'comp1',
# 'posting_date' : '2011-05-02',
# 'remark': 'test data',
# 'fiscal_year': '2011-2012',
# 'total_debit': 500,
# 'total_credit': 500
# }),
# Document(fielddata = {
# 'parenttype':'Journal Voucher',
# 'parentfield':'entries',
# 'doctype':'Journal Voucher Detail',
# 'account' : 'cust1 - c1',
# 'credit':500,
# 'debit' : 0,
# 'docstatus':1
# }),
# Document(fielddata = {
# 'parenttype':'Journal Voucher',
# 'parentfield':'entries',
# 'doctype':'Journal Voucher Detail',
# 'account' : 'bank1 - c1',
# 'credit':0,
# 'debit' : 500,
# 'docstatus':1
# })]
#
# ir = [Document(fielddata = {
# 'doctype':'Payment to Invoice Matching Tool',
# 'name' : 'Payment to Invoice Matching Tool',
# 'account':'cust1 - c1',
# 'voucher_type' : 'Sales Invoice',
# 'voucher_no': 'rv1'
# }),
# Document(fielddata = {
# 'parenttype':'Payment to Invoice Matching Tool',
# 'parentfield':'ir_payment_details',
# 'doctype':'Payment to Invoice Matching Tool Detail',
# 'parent': 'Payment to Invoice Matching Tool',
# 'voucher_no': 'jv1',
# 'name' : '123112',
# 'voucher_detail_no' : 'jvd1',
# 'selected' : 1,
# 'amt_due' : 500,
# 'amt_to_be_reconciled':100
# })]
#
# cust1 = Document(fielddata={
# 'doctype':'Account',
# 'docstatus':0,
# 'account_name' : 'cust1',
# 'debit_or_credit': 'Debit',
# 'company' : 'comp1',
# 'lft': 1,
# 'rgt': 2
# })
#
# bank1 = Document(fielddata={
# 'doctype':'Account',
# 'docstatus':0,
# 'account_name' : 'bank1',
# 'debit_or_credit': 'Debit',
# 'company' : 'comp1',
# 'lft': 3,
# 'rgt': 4
# })
#
# comp1 = Document(fielddata={
# 'doctype':'Company',
# 'abbr': 'c1',
# 'company_name' : 'comp1',
# 'name': 'comp1'
# })
#
# rv_gle = Document(fielddata={
# 'doctype':'GL Entry',
# 'account': 'cust1 - c1',
# 'company' : 'comp1',
# 'voucher_no': 'rv1',
# 'against_voucher': 'rv1',
# 'against_voucher_type': 'Sales Invoice',
# 'voucher_type' : 'Sales Invoice',
# 'debit': 100,
# 'credit': 0
# })

View File

@ -7,8 +7,10 @@ test_records = [
"price_list_name": "_Test Price List",
"company": "_Test Company",
"warehouse": "_Test Warehouse",
"territory": "_Test Territory",
"cash_bank_account": "_Test Account Bank Account - _TC",
"income_account": "Sales - _TC",
"cost_center": "_Test Cost Center - _TC",
"expense_account": "_Test Account Cost for Goods Sold - _TC",
}]
]

View File

@ -217,21 +217,11 @@ class TestSalesInvoice(unittest.TestCase):
return dn
def _insert_pos_settings(self):
from accounts.doctype.pos_setting.test_pos_setting \
import test_records as pos_setting_test_records
webnotes.conn.sql("""delete from `tabPOS Setting`""")
ps = webnotes.bean([
{
"cash_bank_account": "_Test Account Bank Account - _TC",
"company": "_Test Company",
"conversion_rate": 1.0,
"cost_center": "_Test Cost Center - _TC",
"currency": "INR",
"doctype": "POS Setting",
"income_account": "_Test Account Bank Account - _TC",
"price_list_name": "_Test Price List",
"territory": "_Test Territory",
"warehouse": "_Test Warehouse"
}
])
ps = webnotes.bean(copy=pos_setting_test_records[0])
ps.insert()
def test_sales_invoice_with_advance(self):

View File

@ -12,7 +12,7 @@ def execute(filters=None):
item_sales_bom = get_item_sales_bom()
columns = ["Delivery Note/Sales Invoice::120", "Posting Date:Date", "Posting Time",
columns = ["Delivery Note/Sales Invoice::120", "Link::30", "Posting Date:Date", "Posting Time",
"Item Code:Link/Item", "Item Name", "Description", "Warehouse:Link/Warehouse",
"Qty:Float", "Selling Rate:Currency", "Selling Amount:Currency", "Buying Amount:Currency",
"Gross Profit:Currency", "Gross Profit %:Percent", "Project:Link/Project"]
@ -32,8 +32,9 @@ def execute(filters=None):
else:
gross_profit = gross_profit_percent = 0.0
name = """<a href="%s">%s</a>""" % ("/".join(["#Form", row.parenttype, row.name]), row.name)
data.append([name, row.posting_date, row.posting_time, row.item_code, row.item_name,
icon = """<a href="%s"><i class="icon icon-share" style="cursor: pointer;"></i></a>""" \
% ("/".join(["#Form", row.parenttype, row.name]),)
data.append([row.name, icon, row.posting_date, row.posting_time, row.item_code, row.item_name,
row.description, row.warehouse, row.qty, row.basic_rate, row.amount, buying_amount,
gross_profit, gross_profit_percent, row.project])
@ -57,7 +58,7 @@ def get_item_sales_bom():
item_sales_bom = {}
for d in webnotes.conn.sql("""select parenttype, parent, parent_item,
item_code, warehouse, -1*qty as total_qty
item_code, warehouse, -1*qty as total_qty, parent_detail_docname
from `tabDelivery Note Packing Item` where docstatus=1""", as_dict=True):
item_sales_bom.setdefault(d.parenttype, webnotes._dict()).setdefault(d.parent,
webnotes._dict()).setdefault(d.parent_item, []).append(d)

View File

@ -77,14 +77,10 @@ for r in res:
r.append(net_total)
#Get tax for account heads
acc_head_tax = sql("""select account_head, sum(tax_amount)
from `tabPurchase Taxes and Charges`
where parent = '%s'
and parenttype = 'Purchase Invoice'
and add_deduct_tax = 'Add'
and category in ('Total', 'Valuation and Total')
group by account_head
""" %(r[col_idx['ID']],))
acc_head_tax = sql("""select account_head,
sum(if(add_deduct_tax='Add', tax_amount, -tax_amount))
from `tabPurchase Taxes and Charges` where parent = %s and parenttype = 'Purchase Invoice'
and category in ('Total', 'Valuation and Total') group by account_head""", r[col_idx['ID']])
#Convert the result to dictionary for easy retrieval
acc_head_tax_dict = {}

View File

@ -1,5 +1,7 @@
erpnext.updates = [
["27th March", ["Rename multiple items together. Go to Setup > Rename Tool"]],
["26th March", ["Added project to Stock Ledger and Balance",
"Added Default Cash Account in Company."]],
["19th March", ["Sales and Purchase Return Tool deprecated. Use Stock Entry instead."]],
["12th March", ["Updates to website module. Added more options in Style Settings and Website Settings."]],
["5th March", ["Refactored Upload Attendance Tool"]],

View File

@ -1,3 +1,5 @@
test_ignore = ["Leave Block List"]
test_records = [
[{"doctype":"Department", "department_name":"_Test Department"}],
[{"doctype":"Department", "department_name":"_Test Department 1"}]

View File

@ -29,7 +29,7 @@ class TestLeaveApplication(unittest.TestCase):
application = self.get_application(test_records[1])
self.assertTrue(application.insert())
def test_overlap(self):
application = self.get_application(test_records[1])
self.assertRaises(OverlapError, application.insert)
@ -57,6 +57,7 @@ class TestLeaveApplication(unittest.TestCase):
application.doc.status = "Approved"
self.assertRaises(LeaveDayBlockedError, application.submit)
test_dependencies = ["Leave Block List"]
test_records = [
[{

View File

@ -18,199 +18,201 @@ from __future__ import unicode_literals
import unittest
import webnotes
from webnotes.model.doc import Document
from webnotes.model.code import get_obj
sql = webnotes.conn.sql
test_records = []
class TestSalaryManager(unittest.TestCase):
def setUp(self):
webnotes.conn.begin()
for rec in [des1, dep1, branch1, grade1, comp1, emp1, emp2]:
rec.save(1)
ss1[0].employee = emp1.name
for s in ss1: s.save(1)
for s in ss1[1:]:
sql("update `tabSalary Structure Earning` set parent = '%s' where name = '%s'" % (ss1[0].name, s.name))
sql("update `tabSalary Structure Deduction` set parent = '%s' where name = '%s'" % (ss1[0].name, s.name))
ss2[0].employee = emp2.name
for s in ss2: s.save(1)
for s in ss2[1:]:
sql("update `tabSalary Structure Earning` set parent = '%s' where name = '%s'" % (ss2[0].name, s.name))
sql("update `tabSalary Structure Deduction` set parent = '%s' where name = '%s'" % (ss2[0].name, s.name))
sman.save()
self.sm = get_obj('Salary Manager')
leave.save(1)
self.sm.create_sal_slip()
def test_creation(self):
ssid = sql("""
select name, department
from `tabSalary Slip`
where month = '08' and fiscal_year='2011-2012'""")
self.assertTrue(len(ssid)==1)
self.assertTrue(ssid[0][1] == 'dep1')
def test_lwp_calc(self):
ss = sql("""
select payment_days
from `tabSalary Slip`
where month = '08' and fiscal_year='2011-2012' and employee = '%s'
""" % emp1.name)
self.assertTrue(ss[0][0]==27)
def test_net_pay(self):
ss = webnotes.conn.sql("""
select rounded_total
from `tabSalary Slip`
where month = '08'
and fiscal_year='2011-2012' and employee = '%s'""" % emp1.name)
self.assertTrue(ss[0][0]==67)
def test_submit(self):
self.sm.submit_salary_slip()
ss = webnotes.conn.sql("""
select docstatus
from `tabSalary Slip`
where month = '08'
and fiscal_year='2011-2012' and employee = '%s'""" % emp1.name)
self.assertTrue(ss[0][0]==1)
def tearDown(self):
webnotes.conn.rollback()
#--------------------------------------------
# test data
#--------------------------------------------
des1 = Document(fielddata={
'name':'des1',
'doctype':'Designation',
'designation_name':'des1'
})
dep1 = Document(fielddata={
'name':'dep1',
'doctype':'Department',
'department_name' : 'dep1'
})
branch1 = Document(fielddata={
'name':'branch1',
'doctype':'Branch',
'branch' : 'branch1'
})
comp1 = Document(fielddata={
'name':'comp1',
'doctype':'Company',
'abbr':'c1',
'company_name' : 'comp1'
})
grade1 = Document(fielddata={
'name':'grade1',
'doctype':'Grade',
'grade_name' : 'grade1'
})
emp1 = Document(fielddata={
'doctype':'Employee',
'employee_number':'emp1',
'department':'dep1',
'designation':'des1',
'branch' : 'branch1',
'company':'comp1',
'grade':'grade1',
'naming_series':'EMP/',
'status':'Active',
'docstatus':0,
'employee_name':'emp1'
})
emp2 = Document(fielddata={
'doctype':'Employee',
'employee_number':'emp2',
'department':'dep1',
'designation':'des2',
'branch' : 'branch1',
'company':'comp1',
'naming_series':'EMP/',
'grade':'grade1',
'status':'Active',
})
ss1 = [
Document(fielddata={
'doctype':'Salary Structure',
'docstatus':0,
'employee':'emp1',
'is_active':'Yes',
'department': 'dep1',
'designation' : 'des1',
'employee_name': 'emp1'
}),
Document(fielddata={
'parenttype':'Salary Structure',
'parentfield':'earning_details',
'doctype':'Salary Structure Earning',
'e_type' : 'Basic',
'depend_on_lwp':1,
'modified_value':100
}),
Document(fielddata={
'parenttype':'Salary Structure',
'parentfield':'earning_details',
'doctype':'Salary Structure Deduction',
'd_type':'TDS',
'd_modified_amt':20
})
]
ss2 = [
Document(fielddata={
'doctype':'Salary Structure',
'is_active':'Yes',
'docstatus':0,
}),
Document(fielddata={
'parenttype':'Salary Structure',
'parentfield':'deduction_details',
'doctype':'Salary Structure Earning',
'e_type' : 'Basic',
'modified_value':100
}),
Document(fielddata={
'parenttype':'Salary Structure',
'parentfield':'deduction_details',
'doctype':'Salary Structure Deduction',
'd_type':'TDS',
'd_modified_amt':20
})
]
sman = Document(fielddata={
'name':'Salary Manager',
'doctype':'Salary Manager',
'company': 'comp1',
'department':'dep1',
'designation':'des1',
'month': '08',
'fiscal_year':'2011-2012'
})
leave = Document(fielddata = {
'doctype':'Leave Application',
'employee':'emp1',
'from_date':'2011-08-12',
'to_date':'2011-08-15',
'total_leave_days':'4',
'leave_type':'Leave Without Pay',
'docstatus':1
})
# from webnotes.model.doc import Document
# from webnotes.model.code import get_obj
# sql = webnotes.conn.sql
#
# class TestSalaryManager(unittest.TestCase):
# def setUp(self):
# webnotes.conn.begin()
# for rec in [des1, dep1, branch1, grade1, comp1, emp1, emp2]:
# rec.save(1)
#
# ss1[0].employee = emp1.name
# for s in ss1: s.save(1)
# for s in ss1[1:]:
# sql("update `tabSalary Structure Earning` set parent = '%s' where name = '%s'" % (ss1[0].name, s.name))
# sql("update `tabSalary Structure Deduction` set parent = '%s' where name = '%s'" % (ss1[0].name, s.name))
#
#
# ss2[0].employee = emp2.name
# for s in ss2: s.save(1)
# for s in ss2[1:]:
# sql("update `tabSalary Structure Earning` set parent = '%s' where name = '%s'" % (ss2[0].name, s.name))
# sql("update `tabSalary Structure Deduction` set parent = '%s' where name = '%s'" % (ss2[0].name, s.name))
#
# sman.save()
# self.sm = get_obj('Salary Manager')
# leave.save(1)
# self.sm.create_sal_slip()
#
# def test_creation(self):
# ssid = sql("""
# select name, department
# from `tabSalary Slip`
# where month = '08' and fiscal_year='2011-2012'""")
#
# self.assertTrue(len(ssid)==1)
# self.assertTrue(ssid[0][1] == 'dep1')
#
#
# def test_lwp_calc(self):
# ss = sql("""
# select payment_days
# from `tabSalary Slip`
# where month = '08' and fiscal_year='2011-2012' and employee = '%s'
# """ % emp1.name)
#
# self.assertTrue(ss[0][0]==27)
#
# def test_net_pay(self):
# ss = webnotes.conn.sql("""
# select rounded_total
# from `tabSalary Slip`
# where month = '08'
# and fiscal_year='2011-2012' and employee = '%s'""" % emp1.name)
# self.assertTrue(ss[0][0]==67)
#
# def test_submit(self):
# self.sm.submit_salary_slip()
# ss = webnotes.conn.sql("""
# select docstatus
# from `tabSalary Slip`
# where month = '08'
# and fiscal_year='2011-2012' and employee = '%s'""" % emp1.name)
# self.assertTrue(ss[0][0]==1)
#
# def tearDown(self):
# webnotes.conn.rollback()
#
# #--------------------------------------------
# # test data
# #--------------------------------------------
# des1 = Document(fielddata={
# 'name':'des1',
# 'doctype':'Designation',
# 'designation_name':'des1'
# })
#
# dep1 = Document(fielddata={
# 'name':'dep1',
# 'doctype':'Department',
# 'department_name' : 'dep1'
# })
#
# branch1 = Document(fielddata={
# 'name':'branch1',
# 'doctype':'Branch',
# 'branch' : 'branch1'
# })
#
# comp1 = Document(fielddata={
# 'name':'comp1',
# 'doctype':'Company',
# 'abbr':'c1',
# 'company_name' : 'comp1'
# })
#
# grade1 = Document(fielddata={
# 'name':'grade1',
# 'doctype':'Grade',
# 'grade_name' : 'grade1'
# })
#
# emp1 = Document(fielddata={
# 'doctype':'Employee',
# 'employee_number':'emp1',
# 'department':'dep1',
# 'designation':'des1',
# 'branch' : 'branch1',
# 'company':'comp1',
# 'grade':'grade1',
# 'naming_series':'EMP/',
# 'status':'Active',
# 'docstatus':0,
# 'employee_name':'emp1'
# })
#
# emp2 = Document(fielddata={
# 'doctype':'Employee',
# 'employee_number':'emp2',
# 'department':'dep1',
# 'designation':'des2',
# 'branch' : 'branch1',
# 'company':'comp1',
# 'naming_series':'EMP/',
# 'grade':'grade1',
# 'status':'Active',
#
# })
#
# ss1 = [
# Document(fielddata={
# 'doctype':'Salary Structure',
# 'docstatus':0,
# 'employee':'emp1',
# 'is_active':'Yes',
# 'department': 'dep1',
# 'designation' : 'des1',
# 'employee_name': 'emp1'
# }),
# Document(fielddata={
# 'parenttype':'Salary Structure',
# 'parentfield':'earning_details',
# 'doctype':'Salary Structure Earning',
# 'e_type' : 'Basic',
# 'depend_on_lwp':1,
# 'modified_value':100
# }),
# Document(fielddata={
# 'parenttype':'Salary Structure',
# 'parentfield':'earning_details',
# 'doctype':'Salary Structure Deduction',
# 'd_type':'TDS',
# 'd_modified_amt':20
# })
# ]
#
# ss2 = [
# Document(fielddata={
# 'doctype':'Salary Structure',
# 'is_active':'Yes',
# 'docstatus':0,
# }),
# Document(fielddata={
# 'parenttype':'Salary Structure',
# 'parentfield':'deduction_details',
# 'doctype':'Salary Structure Earning',
# 'e_type' : 'Basic',
# 'modified_value':100
# }),
# Document(fielddata={
# 'parenttype':'Salary Structure',
# 'parentfield':'deduction_details',
# 'doctype':'Salary Structure Deduction',
# 'd_type':'TDS',
# 'd_modified_amt':20
# })
# ]
#
# sman = Document(fielddata={
# 'name':'Salary Manager',
# 'doctype':'Salary Manager',
# 'company': 'comp1',
# 'department':'dep1',
# 'designation':'des1',
# 'month': '08',
# 'fiscal_year':'2011-2012'
# })
#
# leave = Document(fielddata = {
# 'doctype':'Leave Application',
# 'employee':'emp1',
# 'from_date':'2011-08-12',
# 'to_date':'2011-08-15',
# 'total_leave_days':'4',
# 'leave_type':'Leave Without Pay',
# 'docstatus':1
# })

View File

@ -3,8 +3,11 @@ import webnotes, os, sys
def execute():
webnotes.reload_doc("core", "doctype", "doctype")
webnotes.rename_doc("DocType", "Purchase Request Item", "Material Request Item", force=True)
webnotes.rename_doc("DocType", "Purchase Request", "Material Request", force=True)
tables = webnotes.conn.sql_list("show tables")
if not "tabMaterial Request Item" in tables:
webnotes.rename_doc("DocType", "Purchase Request Item", "Material Request Item", force=True)
if not "tabMaterial Request" in tables:
webnotes.rename_doc("DocType", "Purchase Request", "Material Request", force=True)
webnotes.reload_doc("buying", "search_criteria", "pending_po_items_to_bill")
webnotes.reload_doc("buying", "search_criteria", "pending_po_items_to_receive")
@ -19,4 +22,4 @@ def execute():
os.system("rm -rf app/hr/doctype/holiday_block_list")
os.system("rm -rf app/hr/doctype/holiday_block_list_allow")
os.system("rm -rf app/hr/doctype/holiday_block_list_date")

View File

@ -0,0 +1,18 @@
import webnotes
from accounts.utils import get_fiscal_year, FiscalYearError
def execute():
webnotes.reload_doc("stock", "doctype", "stock_entry")
webnotes.reload_doc("stock", "doctype", "stock_reconciliation")
for doctype in ["Stock Entry", "Stock Reconciliation"]:
for name, posting_date in webnotes.conn.sql("""select name, posting_date from `tab%s`
where ifnull(fiscal_year,'')='' and docstatus=1""" % doctype):
try:
fiscal_year = get_fiscal_year(posting_date, 0)[0]
webnotes.conn.sql("""update `tab%s` set fiscal_year=%s where name=%s""" % \
(doctype, "%s", "%s"), (fiscal_year, name))
except FiscalYearError:
pass

View File

@ -0,0 +1,16 @@
import webnotes
def execute():
for f in webnotes.conn.sql("""select parent, fieldname
from tabDocField where options="attach_files:" """, as_dict=1):
if webnotes.conn.get_value("DocType", f.parent, "issingle"):
fname = webnotes.conn.get_value(f.parent, None, f.fieldname)
if fname:
if not (fname.startswith("http") or fname.startswith("files")):
webnotes.conn.set_value(f.parent, None, f.fieldname, "files/" + fname)
else:
webnotes.conn.sql("""update `tab%(parent)s`
set %(fieldname)s =
if(substr(%(fieldname)s,0,4)='http' or substr(%(fieldname)s, 0, 5)='files',
%(fieldname)s,
concat('files/', %(fieldname)s))""" % f)

View File

@ -216,7 +216,13 @@ patch_list = [
"patches.march_2013.p06_remove_sales_purchase_return_tool",
"execute:webnotes.bean('Global Defaults').save()",
"patches.march_2013.p07_update_project_in_stock_ledger",
"execute:webnotes.reload_doc('stock', 'doctype', 'item') #2013-03-25",
"execute:webnotes.reload_doc('setup', 'doctype', 'item_group') #2013-03-25",
"execute:webnotes.reload_doc('website', 'doctype', 'blog_post') #2013-03-25",
"execute:webnotes.reload_doc('website', 'doctype', 'web_page') #2013-03-25",
"execute:webnotes.bean('Style Settings').save() #2013-03-25",
"execute:webnotes.conn.set_value('Email Settings', None, 'send_print_in_body_and_attachment', 1)",
"patches.march_2013.p09_unset_user_type_partner",
"patches.march_2013.p10_set_fiscal_year_for_stock",
"patches.march_2013.p11_update_attach_files",
]

View File

@ -1,8 +1,8 @@
[
{
"creation": "2013-03-05 12:53:23",
"creation": "2013-03-05 10:14:59",
"docstatus": 0,
"modified": "2013-03-05 12:54:22",
"modified": "2013-03-28 07:18:24",
"modified_by": "Administrator",
"owner": "Administrator"
},
@ -10,7 +10,7 @@
"autoname": "field:activity_type",
"doctype": "DocType",
"document_type": "Master",
"in_dialog": 1,
"in_dialog": 0,
"module": "Projects",
"name": "__common__"
},

View File

@ -9,6 +9,7 @@ class TestTimeLog(unittest.TestCase):
self.assertRaises(OverlapError, ts.insert)
test_records = [[{
"doctype": "Time Log",
"from_time": "2013-01-01 10:00:00",
"to_time": "2013-01-01 11:00:00",
"activity_type": "_Test Activity Type",

View File

@ -1,74 +1,74 @@
[
{
"owner": "Administrator",
"creation": "2013-02-22 01:27:54",
"docstatus": 0,
"creation": "2012-07-03 13:30:03",
"modified": "2013-03-28 07:18:30",
"modified_by": "Administrator",
"modified": "2012-12-25 13:20:51"
"owner": "Administrator"
},
{
"name": "__common__",
"autoname": "field:brand",
"module": "Setup",
"doctype": "DocType",
"in_dialog": 1,
"document_type": "Master"
"document_type": "Master",
"in_dialog": 0,
"module": "Setup",
"name": "__common__"
},
{
"read_only": 0,
"doctype": "DocField",
"name": "__common__",
"parent": "Brand",
"doctype": "DocField",
"parentfield": "fields",
"parenttype": "DocType",
"permlevel": 0,
"parentfield": "fields"
"read_only": 0
},
{
"name": "__common__",
"parent": "Brand",
"read": 1,
"doctype": "DocPerm",
"name": "__common__",
"parent": "Brand",
"parentfield": "permissions",
"parenttype": "DocType",
"report": 1,
"permlevel": 0,
"parentfield": "permissions"
"read": 1,
"report": 1
},
{
"name": "Brand",
"doctype": "DocType"
"doctype": "DocType",
"name": "Brand"
},
{
"oldfieldtype": "Data",
"doctype": "DocField",
"label": "Brand Name",
"oldfieldname": "brand",
"fieldname": "brand",
"fieldtype": "Data",
"label": "Brand Name",
"oldfieldname": "brand",
"oldfieldtype": "Data",
"reqd": 1
},
{
"oldfieldtype": "Text",
"doctype": "DocField",
"fieldname": "description",
"fieldtype": "Text",
"label": "Description",
"oldfieldname": "description",
"width": "300px",
"fieldname": "description",
"fieldtype": "Text"
"oldfieldtype": "Text",
"width": "300px"
},
{
"cancel": 1,
"create": 1,
"doctype": "DocPerm",
"write": 1,
"role": "Material Master Manager",
"cancel": 1
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 0,
"doctype": "DocPerm",
"submit": 0,
"write": 0,
"role": "Material User",
"cancel": 0
"submit": 0,
"write": 0
}
]

View File

@ -235,9 +235,8 @@ class DocType(DocListController):
clear_cache(self.doc.page_name)
def prepare_template_args(self):
from website.helpers.product import get_parent_item_groups, url_for_website
from website.helpers.product import get_parent_item_groups
self.parent_groups = get_parent_item_groups(self.doc.item_group) + [{"name":self.doc.name}]
self.doc.website_image = url_for_website(self.doc.website_image)
self.doc.title = self.doc.item_name
if self.doc.slideshow:

View File

@ -24,7 +24,8 @@ class TestMaterialRequest(unittest.TestCase):
"doctype": "Stock Entry",
"posting_date": "2013-03-01",
"posting_time": "00:00:00",
"purpose": "Material Receipt"
"purpose": "Material Receipt",
"fiscal_year": "_Test Fiscal Year 2013",
},
{
"conversion_factor": 1.0,
@ -125,7 +126,8 @@ class TestMaterialRequest(unittest.TestCase):
["Material Request Item", "Stock Entry Detail"]], mr.doc.name)
se_doclist[0].fields.update({
"posting_date": "2013-03-01",
"posting_time": "01:00"
"posting_time": "01:00",
"fiscal_year": "_Test Fiscal Year 2013",
})
se_doclist[1].fields.update({
"qty": 27.0,
@ -186,7 +188,8 @@ class TestMaterialRequest(unittest.TestCase):
["Material Request Item", "Stock Entry Detail"]], mr.doc.name)
se_doclist[0].fields.update({
"posting_date": "2013-03-01",
"posting_time": "00:00"
"posting_time": "00:00",
"fiscal_year": "_Test Fiscal Year 2013",
})
se_doclist[1].fields.update({
"qty": 60.0,
@ -239,7 +242,8 @@ class TestMaterialRequest(unittest.TestCase):
["Material Request Item", "Stock Entry Detail"]], mr.doc.name)
se_doclist[0].fields.update({
"posting_date": "2013-03-01",
"posting_time": "00:00"
"posting_time": "00:00",
"fiscal_year": "_Test Fiscal Year 2013",
})
se_doclist[1].fields.update({
"qty": 60.0,

View File

@ -170,9 +170,10 @@ def get_buying_amount(item_code, warehouse, qty, voucher_type, voucher_no, vouch
# sales bom item
buying_amount = 0.0
for bom_item in item_sales_bom[item_code]:
buying_amount += _get_buying_amount(voucher_type, voucher_no, "[** No Item Row **]",
bom_item.item_code, bom_item.warehouse or warehouse,
bom_item.total_qty or (bom_item.qty * qty), stock_ledger_entries)
if bom_item.get("parent_detail_docname")==voucher_detail_no:
buying_amount += _get_buying_amount(voucher_type, voucher_no, "[** No Item Row **]",
bom_item.item_code, bom_item.warehouse or warehouse,
bom_item.total_qty or (bom_item.qty * qty), stock_ledger_entries)
return buying_amount
else:
# doesn't have sales bom
@ -181,13 +182,16 @@ def get_buying_amount(item_code, warehouse, qty, voucher_type, voucher_no, vouch
def _get_buying_amount(voucher_type, voucher_no, item_row, item_code, warehouse, qty,
stock_ledger_entries):
for i, sle in enumerate(stock_ledger_entries):
relevant_stock_ledger_entries = [sle for sle in stock_ledger_entries
if sle.item_code == item_code and sle.warehouse == warehouse]
for i, sle in enumerate(relevant_stock_ledger_entries):
if sle.voucher_type == voucher_type and sle.voucher_no == voucher_no and \
(sle.voucher_detail_no == item_row or (sle.voucher_type != "Stock Reconciliation"
and sle.item_code == item_code and sle.warehouse == warehouse and flt(sle.qty) == qty)):
previous_stock_value = len(stock_ledger_entries) > i+1 and \
flt(stock_ledger_entries[i+1].stock_value) or 0.0
((sle.voucher_detail_no == item_row) or (sle.voucher_type != "Stock Reconciliation"
and flt(sle.qty) == qty)):
previous_stock_value = len(relevant_stock_ledger_entries) > i+1 and \
flt(relevant_stock_ledger_entries[i+1].stock_value) or 0.0
buying_amount = previous_stock_value - flt(sle.stock_value)
return buying_amount

View File

@ -38,18 +38,21 @@ test_dependencies = ["Lead", "Contact"]
test_records =[
[{
"doctype": "Newsletter",
"subject": "_Test Newsletter to Lead",
"send_to_type": "Lead",
"lead_source": "All",
"message": "This is a test newsletter"
}],
[{
"doctype": "Newsletter",
"subject": "_Test Newsletter to Contact",
"send_to_type": "Contact",
"contact_type": "Customer",
"message": "This is a test newsletter"
}],
[{
"doctype": "Newsletter",
"subject": "_Test Newsletter to Custom",
"send_to_type": "Custom",
"email_list": "test_custom@example.com, test_custom1@example.com, test_custom2@example.com",

View File

@ -2,7 +2,6 @@
from __future__ import unicode_literals
import webnotes
from website.utils import url_for_website
class DocType:
def __init__(self, d, dl):
@ -14,9 +13,6 @@ class DocType:
def get_args():
obj = webnotes.get_obj("About Us Settings")
for d in obj.doclist.get({"doctype":"About Us Team Member"}):
if not "/" in d.image_link:
d.image_link = "files/" + d.image_link
return {
"obj": obj
}

View File

@ -78,8 +78,6 @@ class DocType:
self.doc.content_html = self.doc.content
if self.doc.blogger:
self.doc.blogger_info = webnotes.doc("Blogger", self.doc.blogger).fields
if self.doc.blogger_info.avatar and not "/" in self.doc.blogger_info.avatar:
self.doc.blogger_info.avatar = "files/" + self.doc.blogger_info.avatar
self.doc.description = self.doc.blog_intro or self.doc.content[:140]

View File

@ -4,7 +4,7 @@
body {
{% if doc.background_image %}
background: url("../files/{{ doc.background_image }}") repeat;
background: url("../{{ doc.background_image }}") repeat;
{% elif doc.background_color %}
background-color: #{{ doc.background_color }};
background-image: none;
@ -67,16 +67,10 @@ div.web-footer, div.web-footer a {
/* Bootstrap Navbar */
.navbar-inverse .navbar-inner {
box-shadow: none;
background-color: #{{ doc.top_bar_background or "444444"}};
background-repeat: repeat-x;
background-image: none;
}
.navbar-inner {
box-shadow: none;
}
.navbar-inner {
border-bottom: 1px solid {% if doc.top_bar_background == doc.page_background -%}
#{{ get_hex_shade(doc.page_background or "ffffff", 15) }};
{%- else -%}

View File

@ -48,7 +48,6 @@ cur_frm.cscript.set_banner_from_image = function(doc) {
msgprint(wn._("Select a Banner Image first."));
}
var src = doc.banner_image;
if(src.indexOf("/")==-1) src = "files/" + src;
cur_frm.set_value("banner_html", "<a href='/'><img src='"+ src
+"' style='max-width: 200px;'></a>");
}

View File

@ -46,8 +46,6 @@ def get_blog_list(start=0, by=None, category=None):
if not res['content']:
res['content'] = website.utils.get_html(res['page_name'])
res['content'] = res['content'][:140]
if res.avatar and not "/" in res.avatar:
res.avatar = "files/" + res.avatar
return result
@ -133,9 +131,6 @@ def get_blog_template_args():
def get_writers_args():
bloggers = webnotes.conn.sql("""select * from `tabBlogger`
order by posts desc""", as_dict=1)
for blogger in bloggers:
if blogger.avatar and not "/" in blogger.avatar:
blogger.avatar = "files/" + blogger.avatar
args = {
"bloggers": bloggers,

View File

@ -5,7 +5,7 @@ from __future__ import unicode_literals
import webnotes
from webnotes.utils import cstr
from website.utils import build_html, url_for_website, delete_page_cache
from website.utils import build_html, delete_page_cache
@webnotes.whitelist(allow_guest=True)
@ -90,7 +90,6 @@ def scrub_item_for_list(r):
r.website_description = "No description given"
if len(r.website_description.split(" ")) > 24:
r.website_description = " ".join(r.website_description.split(" ")[:24]) + "..."
r.website_image = url_for_website(r.website_image)
def get_parent_item_groups(item_group_name):
item_group = webnotes.doc("Item Group", item_group_name)

View File

@ -20,7 +20,4 @@ def get_slideshow(obj):
slideshow = webnotes.bean("Website Slideshow", obj.doc.slideshow)
obj.slides = slideshow.doclist.get({"doctype":"Website Slideshow Item"})
obj.doc.slideshow_header = slideshow.doc.header or ""
for s in obj.slides:
if s.image and not s.image.lower().startswith("http"):
s.image = "files/" + s.image

View File

@ -10,13 +10,8 @@
<script type="text/javascript" src="js/wn-web.js"></script>
<link type="text/css" rel="stylesheet" href="css/all-web.css">
<link type="text/css" rel="stylesheet" href="css/wn-web.css">
{%- if favicon %}
<link rel="shortcut icon" href="files/{{ favicon }}" type="image/x-icon">
<link rel="icon" href="files/{{ favicon }}" type="image/x-icon">
{% else %}
<link rel="shortcut icon" href="app/images/favicon.ico" type="image/x-icon">
<link rel="icon" href="app/images/favicon.ico" type="image/x-icon">
{% endif -%}
<link rel="shortcut icon" href="{{ favicon }}" type="image/x-icon">
<link rel="icon" href="{{ favicon }}" type="image/x-icon">
{% if description -%}
<meta name="description" content="{{ description }}">
{%- endif %}

View File

@ -192,6 +192,7 @@ def get_source_doc(page_name):
return None, None
def get_outer_env(page_name, args):
from webnotes.utils import get_request_site_address
from urllib import quote
@ -238,7 +239,7 @@ def get_outer_env(page_name, args):
args.update(ret)
settings = webnotes.doc("Website Settings", "Website Settings")
for k in ["banner_html", "brand_html", "copyright", "address", "twitter_share_via"
for k in ["banner_html", "brand_html", "copyright", "address", "twitter_share_via",
"favicon", "facebook_share", "google_plus_one", "twitter_share", "linked_in_share"]:
if k in settings.fields:
args[k] = settings.fields.get(k)
@ -280,13 +281,7 @@ def get_all_pages():
def delete_page_cache(page_name):
if page_name:
webnotes.cache().delete_value("page:" + page_name)
def url_for_website(url):
if url and not url.lower().startswith("http"):
return "files/" + url
else:
return url
def get_hex_shade(color, percent):
def p(c):