[enhance] demo for expense claim #5731

This commit is contained in:
Saurabh
2016-07-15 18:28:05 +05:30
parent 771773240b
commit f589c82d68
5 changed files with 117 additions and 34 deletions

View File

@@ -3,7 +3,8 @@ from __future__ import unicode_literals
import random, json import random, json
from erpnext.demo.domains import data from erpnext.demo.domains import data
import frappe, erpnext import frappe, erpnext
from frappe.utils import cint, flt from frappe.utils import cint, flt, now_datetime, cstr
from frappe import _
def setup_data(): def setup_data():
domain = frappe.flags.domain domain = frappe.flags.domain
@@ -28,6 +29,7 @@ def setup_data():
setup_employee() setup_employee()
setup_salary_structure() setup_salary_structure()
setup_salary_structure_for_timesheet() setup_salary_structure_for_timesheet()
setup_account_to_expense_type()
setup_user_roles() setup_user_roles()
frappe.db.commit() frappe.db.commit()
frappe.clear_cache() frappe.clear_cache()
@@ -64,11 +66,11 @@ def setup_demo_page():
def setup_fiscal_year(): def setup_fiscal_year():
fiscal_year = None fiscal_year = None
for year in xrange(2014, frappe.utils.now_datetime().year + 1, 1): for year in xrange(2014, now_datetime().year + 1, 1):
try: try:
fiscal_year = frappe.get_doc({ fiscal_year = frappe.get_doc({
"doctype": "Fiscal Year", "doctype": "Fiscal Year",
"year": frappe.utils.cstr(year), "year": cstr(year),
"year_start_date": "{0}-01-01".format(year), "year_start_date": "{0}-01-01".format(year),
"year_end_date": "{0}-12-31".format(year) "year_end_date": "{0}-12-31".format(year)
}).insert() }).insert()
@@ -80,7 +82,7 @@ def setup_fiscal_year():
def setup_holiday_list(): def setup_holiday_list():
"""Setup Holiday List for the current year""" """Setup Holiday List for the current year"""
year = frappe.utils.now_datetime().year year = now_datetime().year
holiday_list = frappe.get_doc({ holiday_list = frappe.get_doc({
"doctype": "Holiday List", "doctype": "Holiday List",
"holiday_list_name": str(year), "holiday_list_name": str(year),
@@ -306,6 +308,18 @@ def setup_account():
doc.parent_account = frappe.db.get_value('Account', {'account_name': doc.parent_account}) doc.parent_account = frappe.db.get_value('Account', {'account_name': doc.parent_account})
doc.insert() doc.insert()
def setup_account_to_expense_type():
expense_types = [{'name': _('Calls'), "account": "Sales Expenses - WPL"},
{'name': _('Food'), "account": "Entertainment Expenses - WPL"},
{'name': _('Medical'), "account": "Utility Expenses - WPL"},
{'name': _('Others'), "account": "Miscellaneous Expenses - WPL"},
{'name': _('Travel'), "account": "Travel Expenses - WPL"}]
for expense_type in expense_types:
doc = frappe.get_doc("Expense Claim Type", expense_type["name"])
doc.default_account = expense_type["account"]
doc.save(ignore_permissions=True)
def setup_user_roles(): def setup_user_roles():
if not frappe.db.get_global('demo_hr_user'): if not frappe.db.get_global('demo_hr_user'):
user = frappe.get_doc('User', 'CharmaineGaudreau@example.com') user = frappe.get_doc('User', 'CharmaineGaudreau@example.com')

View File

@@ -5,6 +5,7 @@ from frappe.utils import random_string
from erpnext.projects.doctype.timesheet.test_timesheet import make_timesheet from erpnext.projects.doctype.timesheet.test_timesheet import make_timesheet
from erpnext.projects.doctype.timesheet.timesheet import make_salary_slip, make_sales_invoice from erpnext.projects.doctype.timesheet.timesheet import make_salary_slip, make_sales_invoice
from frappe.utils.make_random import how_many, get_random from frappe.utils.make_random import how_many, get_random
from erpnext.hr.doctype.expense_claim.expense_claim import get_expense_approver, make_bank_entry
def work(): def work():
frappe.set_user(frappe.db.get_global('demo_hr_user')) frappe.set_user(frappe.db.get_global('demo_hr_user'))
@@ -31,6 +32,59 @@ def work():
if frappe.db.get_global('demo_hr_user'): if frappe.db.get_global('demo_hr_user'):
make_timesheet_records() make_timesheet_records()
#expense claim
expense_claim = frappe.new_doc("Expense Claim")
expense_claim.extend('expenses', get_expenses())
expense_claim.employee = get_random("Employee")
expense_claim.company = frappe.flags.company
expense_claim.posting_date = frappe.flags.current_date
expense_claim.exp_approver = filter((lambda x: x[0] != 'Administrator'), get_expense_approver(None, '', None, 0, 20, None))[0][0]
expense_claim.insert()
rand = random.random()
if rand >= 0.3 and rand <= 0.6 :
expense_claim.approval_status = "Approved"
update_sanctioned_amount(expense_claim)
expense_claim.submit()
if random.randint(0, 1):
#make journal entry against expense claim
je = frappe.get_doc(make_bank_entry(expense_claim.name))
je.posting_date = frappe.flags.current_date
je.cheque_no = random_string(10)
je.cheque_date = frappe.flags.current_date
je.flags.ignore_permissions = 1
je.submit()
if rand < 0.3:
expense_claim.approval_status = "Rejected"
expense_claim.submit()
def get_expenses():
expenses = []
expese_types = frappe.db.sql("select name, default_account from `tabExpense Claim Type`",as_dict=1)
for expense_type in expese_types[:random.randint(1,4)]:
claim_amount = random.randint(1,20)*10
expenses.append({
"expense_date": frappe.flags.current_date,
"expense_type": expense_type.name,
"default_account": expense_type.default_account or "Miscellaneous Expenses - WPL",
"claim_amount": claim_amount,
"sanctioned_amount": claim_amount
})
return expenses
def update_sanctioned_amount(expense_claim):
for expense in expense_claim.expenses:
sanctioned_amount = random.randint(1,20)*10
if sanctioned_amount < expense.claim_amount:
expense.sanctioned_amount = sanctioned_amount
def get_timesheet_based_salary_slip_employee(): def get_timesheet_based_salary_slip_employee():
return frappe.get_all('Salary Structure', fields = ["distinct employee as name"], return frappe.get_all('Salary Structure', fields = ["distinct employee as name"],
filters = {'salary_slip_based_on_timesheet': 1}) filters = {'salary_slip_based_on_timesheet': 1})

View File

@@ -7,39 +7,13 @@ erpnext.hr.ExpenseClaimController = frappe.ui.form.Controller.extend({
make_bank_entry: function() { make_bank_entry: function() {
var me = this; var me = this;
return frappe.call({ return frappe.call({
method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_default_bank_cash_account", method: "erpnext.hr.doctype.expense_claim.expense_claim.make_bank_entry",
args: { args: {
"company": cur_frm.doc.company, "docname": cur_frm.doc.name,
"account_type": "Bank"
}, },
callback: function(r) { callback: function(r) {
var jv = frappe.model.make_new_doc_and_get_name('Journal Entry'); var doc = frappe.model.sync(r.message);
jv = locals['Journal Entry'][jv]; frappe.set_route('Form', 'Journal Entry', r.message.name);
jv.voucher_type = 'Bank Entry';
jv.company = cur_frm.doc.company;
jv.remark = 'Payment against Expense Claim: ' + cur_frm.doc.name;
var expense = cur_frm.doc.expenses || [];
for(var i = 0; i < expense.length; i++){
var d1 = frappe.model.add_child(jv, 'Journal Entry Account', 'accounts');
d1.account = expense[i].default_account;
d1.debit_in_account_currency = expense[i].sanctioned_amount;
d1.reference_type = cur_frm.doc.doctype;
d1.reference_name = cur_frm.doc.name;
}
// credit to bank
var d1 = frappe.model.add_child(jv, 'Journal Entry Account', 'accounts');
d1.credit_in_account_currency = cur_frm.doc.total_sanctioned_amount;
d1.reference_type = cur_frm.doc.doctype;
d1.reference_name = cur_frm.doc.name;
if(r.message) {
d1.account = r.message.account;
d1.balance = r.message.balance;
d1.account_currency = r.message.account_currency;
d1.account_type = r.message.account_type;
}
frappe.set_route('Form', 'Journal Entry', jv.name);
} }
}); });
} }

View File

@@ -68,3 +68,35 @@ def get_expense_approver(doctype, txt, searchfield, start, page_len, filters):
where u.name = r.parent and r.role = 'Expense Approver' where u.name = r.parent and r.role = 'Expense Approver'
and u.enabled = 1 and u.name like %s and u.enabled = 1 and u.name like %s
""", ("%" + txt + "%")) """, ("%" + txt + "%"))
@frappe.whitelist()
def make_bank_entry(docname):
from erpnext.accounts.doctype.journal_entry.journal_entry import get_default_bank_cash_account
expense_claim = frappe.get_doc("Expense Claim", docname)
default_bank_cash_account = get_default_bank_cash_account(expense_claim.company, "Bank")
je = frappe.new_doc("Journal Entry")
je.voucher_type = 'Bank Entry'
je.company = expense_claim.company
je.remark = 'Payment against Expense Claim: ' + docname;
for expense in expense_claim.expenses:
je.append("accounts", {
"account": expense.default_account,
"debit_in_account_currency": expense.sanctioned_amount,
"reference_type": "Expense Claim",
"reference_name": expense_claim.name
})
je.append("accounts", {
"account": default_bank_cash_account.account,
"credit_in_account_currency": expense_claim.total_sanctioned_amount,
"reference_type": "Expense Claim",
"reference_name": expense_claim.name,
"balance": default_bank_cash_account.balance,
"account_currency": default_bank_cash_account.account_currency,
"account_type": default_bank_cash_account.account_type
})
return je.as_dict()

View File

@@ -0,0 +1,9 @@
frappe.ui.form.on("Expense Claim Type", "onload", function(frm, dt, dn){
frm.fields_dict["default_account"].get_query = function(doc) {
return {
filters:{
"is_group": 0
}
}
}
})