blob: 3d5ac83b91c354b56619034f293cec75280af639 [file] [log] [blame]
Rushabh Mehtadc8067e2016-06-29 18:38:32 +05301from __future__ import unicode_literals
2import frappe
Rohit Waghchaure8002d472016-07-13 16:03:05 +05303import random
Kanchan Chauhandb0e57c2016-07-29 15:59:39 +05304from frappe.utils import random_string, add_days
Rohit Waghchaure8002d472016-07-13 16:03:05 +05305from erpnext.projects.doctype.timesheet.test_timesheet import make_timesheet
6from erpnext.projects.doctype.timesheet.timesheet import make_salary_slip, make_sales_invoice
7from frappe.utils.make_random import how_many, get_random
Saurabhf589c822016-07-15 18:28:05 +05308from erpnext.hr.doctype.expense_claim.expense_claim import get_expense_approver, make_bank_entry
Kanchan Chauhandb0e57c2016-07-29 15:59:39 +05309from erpnext.hr.doctype.leave_application.leave_application import get_leave_balance_on, OverlapError
Rushabh Mehtadc8067e2016-06-29 18:38:32 +053010
11def work():
12 frappe.set_user(frappe.db.get_global('demo_hr_user'))
Rushabh Mehtadc8067e2016-06-29 18:38:32 +053013 year, month = frappe.flags.current_date.strftime("%Y-%m").split("-")
Kanchan Chauhandb0e57c2016-07-29 15:59:39 +053014
15 mark_attendance()
16 make_leave_application()
Rushabh Mehtadc8067e2016-06-29 18:38:32 +053017
18 # process payroll
19 if not frappe.db.get_value("Salary Slip", {"month": month, "fiscal_year": year}):
20 process_payroll = frappe.get_doc("Process Payroll", "Process Payroll")
21 process_payroll.company = frappe.flags.company
22 process_payroll.month = month
23 process_payroll.fiscal_year = year
24 process_payroll.create_sal_slip()
25 process_payroll.submit_salary_slip()
26 r = process_payroll.make_journal_entry(frappe.get_value('Account',
27 {'account_name': 'Salary'}))
28
29 journal_entry = frappe.get_doc(r)
30 journal_entry.cheque_no = random_string(10)
31 journal_entry.cheque_date = frappe.flags.current_date
32 journal_entry.posting_date = frappe.flags.current_date
33 journal_entry.insert()
34 journal_entry.submit()
Rohit Waghchaure8002d472016-07-13 16:03:05 +053035
36 if frappe.db.get_global('demo_hr_user'):
37 make_timesheet_records()
Saurabhf589c822016-07-15 18:28:05 +053038
39 #expense claim
40 expense_claim = frappe.new_doc("Expense Claim")
41 expense_claim.extend('expenses', get_expenses())
42 expense_claim.employee = get_random("Employee")
43 expense_claim.company = frappe.flags.company
44 expense_claim.posting_date = frappe.flags.current_date
45 expense_claim.exp_approver = filter((lambda x: x[0] != 'Administrator'), get_expense_approver(None, '', None, 0, 20, None))[0][0]
46 expense_claim.insert()
47
48 rand = random.random()
49
Saurabh9cba6e12016-07-18 16:22:51 +053050 if rand < 0.4:
Saurabhf589c822016-07-15 18:28:05 +053051 expense_claim.approval_status = "Approved"
52 update_sanctioned_amount(expense_claim)
53 expense_claim.submit()
54
55 if random.randint(0, 1):
56 #make journal entry against expense claim
57 je = frappe.get_doc(make_bank_entry(expense_claim.name))
58 je.posting_date = frappe.flags.current_date
59 je.cheque_no = random_string(10)
60 je.cheque_date = frappe.flags.current_date
61 je.flags.ignore_permissions = 1
62 je.submit()
63
Saurabh9cba6e12016-07-18 16:22:51 +053064 elif rand < 0.2:
Saurabhf589c822016-07-15 18:28:05 +053065 expense_claim.approval_status = "Rejected"
66 expense_claim.submit()
67
68def get_expenses():
69 expenses = []
Saurabh718d8352016-07-18 15:20:47 +053070 expese_types = frappe.db.sql("""select ect.name, eca.default_account from `tabExpense Claim Type` ect,
71 `tabExpense Claim Account` eca where eca.parent=ect.name
72 and eca.company=%s """, frappe.flags.company,as_dict=1)
Saurabhf589c822016-07-15 18:28:05 +053073
74 for expense_type in expese_types[:random.randint(1,4)]:
75 claim_amount = random.randint(1,20)*10
76
77 expenses.append({
78 "expense_date": frappe.flags.current_date,
79 "expense_type": expense_type.name,
80 "default_account": expense_type.default_account or "Miscellaneous Expenses - WPL",
81 "claim_amount": claim_amount,
82 "sanctioned_amount": claim_amount
83 })
84
85 return expenses
86
87def update_sanctioned_amount(expense_claim):
88 for expense in expense_claim.expenses:
89 sanctioned_amount = random.randint(1,20)*10
90
91 if sanctioned_amount < expense.claim_amount:
92 expense.sanctioned_amount = sanctioned_amount
Rohit Waghchaure8002d472016-07-13 16:03:05 +053093
94def get_timesheet_based_salary_slip_employee():
95 return frappe.get_all('Salary Structure', fields = ["distinct employee as name"],
96 filters = {'salary_slip_based_on_timesheet': 1})
97
98def make_timesheet_records():
99 employees = get_timesheet_based_salary_slip_employee()
100 for employee in employees:
101 ts = make_timesheet(employee.name, simulate = True, billable = 1, activity_type=get_random("Activity Type"))
102
103 rand = random.random()
104 if rand >= 0.3:
105 make_salary_slip_for_timesheet(ts.name)
106
107 rand = random.random()
108 if rand >= 0.2:
109 make_sales_invoice_for_timesheet(ts.name)
110
111def make_salary_slip_for_timesheet(name):
112 salary_slip = make_salary_slip(name)
113 salary_slip.insert()
114 salary_slip.submit()
Rohit Waghchaure7d439ec2016-07-21 14:50:59 +0530115 frappe.db.commit()
Rohit Waghchaure8002d472016-07-13 16:03:05 +0530116
117def make_sales_invoice_for_timesheet(name):
118 sales_invoice = make_sales_invoice(name)
119 sales_invoice.customer = get_random("Customer")
120 sales_invoice.append('items', {
Nabin Hait74edfff2016-07-21 11:39:46 +0530121 'item_code': get_random("Item", {"has_variants": 0, "is_stock_item": 0, "is_fixed_asset": 0}),
Rohit Waghchaure8002d472016-07-13 16:03:05 +0530122 'qty': 1,
123 'rate': 1000
124 })
Rohit Waghchaure7d439ec2016-07-21 14:50:59 +0530125 sales_invoice.flags.ignore_permissions = 1
Rohit Waghchaure8002d472016-07-13 16:03:05 +0530126 sales_invoice.set_missing_values()
127 sales_invoice.calculate_taxes_and_totals()
128 sales_invoice.insert()
Rohit Waghchaure7d439ec2016-07-21 14:50:59 +0530129 sales_invoice.submit()
Kanchan Chauhandb0e57c2016-07-29 15:59:39 +0530130 frappe.db.commit()
131
132def make_leave_application():
133 allocated_leaves = frappe.get_all("Leave Allocation", fields=['employee', 'leave_type'])
134
135 for allocated_leave in allocated_leaves:
136 leave_balance = get_leave_balance_on(allocated_leave.employee, allocated_leave.leave_type, frappe.flags.current_date,
137 consider_all_leaves_in_the_allocation_period=True)
138 if leave_balance != 0:
139 if leave_balance == 1:
140 to_date = frappe.flags.current_date
141 else:
142 to_date = add_days(frappe.flags.current_date, random.randint(0, leave_balance-1))
143
144 leave_application = frappe.get_doc({
145 "doctype": "Leave Application",
146 "employee": allocated_leave.employee,
147 "from_date": frappe.flags.current_date,
148 "to_date": to_date,
149 "leave_type": allocated_leave.leave_type,
150 "status": "Approved"
151 })
152 try:
153 leave_application.insert()
154 leave_application.submit()
155 frappe.db.commit()
156 except (OverlapError):
157 frappe.db.rollback()
158
159def mark_attendance():
160 att_date = frappe.flags.current_date
161 for employee in frappe.get_all('Employee', fields=['name'], filters = {'status': 'Active'}):
162
163 if not frappe.db.get_value("Attendance", {"employee": employee.name, "att_date": att_date}):
164 attendance = frappe.get_doc({
165 "doctype": "Attendance",
166 "employee": employee.name,
167 "att_date": att_date
168 })
169 leave = frappe.db.sql("""select name from `tabLeave Application`
170 where employee = %s and %s between from_date and to_date and status = 'Approved'
171 and docstatus = 1""", (employee.name, att_date))
172
173 if leave:
174 attendance.status = "Absent"
175 else:
176 attendance.status = "Present"
177 attendance.save()
178 attendance.submit()
179 frappe.db.commit()