blob: 2686987473729057c950f0711a0c057067da9c28 [file] [log] [blame]
Rushabh Mehtadc8067e2016-06-29 18:38:32 +05301from __future__ import unicode_literals
Kanchan Chauhan1c1e2e92016-10-20 14:53:10 +05302import frappe, erpnext
Rohit Waghchaure8002d472016-07-13 16:03:05 +05303import random
Neil Trini Lasrado06724592016-08-22 12:57:09 +05304from frappe.utils import random_string, add_days, cint
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
Neil Trini Lasrado06724592016-08-22 12:57:09 +05307from frappe.utils.make_random import 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("-")
Neil Trini Lasrado06724592016-08-22 12:57:09 +053014 prev_month = str(cint(month)- 1).zfill(2)
15 if month=="01":
16 prev_month = "12"
Kanchan Chauhandb0e57c2016-07-29 15:59:39 +053017
18 mark_attendance()
19 make_leave_application()
Rushabh Mehtadc8067e2016-06-29 18:38:32 +053020
21 # process payroll
Neil Trini Lasrado06724592016-08-22 12:57:09 +053022 if not frappe.db.get_value("Salary Slip", {"month": prev_month, "fiscal_year": year}):
Rushabh Mehtadc8067e2016-06-29 18:38:32 +053023 process_payroll = frappe.get_doc("Process Payroll", "Process Payroll")
24 process_payroll.company = frappe.flags.company
Neil Trini Lasrado06724592016-08-22 12:57:09 +053025 process_payroll.month = prev_month
Rushabh Mehtadc8067e2016-06-29 18:38:32 +053026 process_payroll.fiscal_year = year
Kanchan Chauhan1c1e2e92016-10-20 14:53:10 +053027 process_payroll.from_date = frappe.flags.current_date
28 process_payroll.to_date = add_days(frappe.flags.current_date, random.randint(0, 30))
29 process_payroll.reference_number = "DemoRef23"
30 process_payroll.reference_date = frappe.flags.current_date
31 process_payroll.payment_account = frappe.get_value('Account', {'account_type': 'Cash', 'company': erpnext.get_default_company(),'is_group':0}, "name")
Rushabh Mehtadc8067e2016-06-29 18:38:32 +053032 process_payroll.submit_salary_slip()
Kanchan Chauhan1c1e2e92016-10-20 14:53:10 +053033 process_payroll.make_journal_entry()
34
Rohit Waghchaure8002d472016-07-13 16:03:05 +053035 if frappe.db.get_global('demo_hr_user'):
36 make_timesheet_records()
Saurabhf589c822016-07-15 18:28:05 +053037
38 #expense claim
39 expense_claim = frappe.new_doc("Expense Claim")
40 expense_claim.extend('expenses', get_expenses())
41 expense_claim.employee = get_random("Employee")
42 expense_claim.company = frappe.flags.company
43 expense_claim.posting_date = frappe.flags.current_date
44 expense_claim.exp_approver = filter((lambda x: x[0] != 'Administrator'), get_expense_approver(None, '', None, 0, 20, None))[0][0]
45 expense_claim.insert()
46
47 rand = random.random()
48
Saurabh9cba6e12016-07-18 16:22:51 +053049 if rand < 0.4:
Saurabhf589c822016-07-15 18:28:05 +053050 expense_claim.approval_status = "Approved"
51 update_sanctioned_amount(expense_claim)
52 expense_claim.submit()
53
54 if random.randint(0, 1):
55 #make journal entry against expense claim
56 je = frappe.get_doc(make_bank_entry(expense_claim.name))
57 je.posting_date = frappe.flags.current_date
58 je.cheque_no = random_string(10)
59 je.cheque_date = frappe.flags.current_date
60 je.flags.ignore_permissions = 1
61 je.submit()
62
Saurabh9cba6e12016-07-18 16:22:51 +053063 elif rand < 0.2:
Saurabhf589c822016-07-15 18:28:05 +053064 expense_claim.approval_status = "Rejected"
65 expense_claim.submit()
66
67def get_expenses():
68 expenses = []
Saurabh718d8352016-07-18 15:20:47 +053069 expese_types = frappe.db.sql("""select ect.name, eca.default_account from `tabExpense Claim Type` ect,
70 `tabExpense Claim Account` eca where eca.parent=ect.name
71 and eca.company=%s """, frappe.flags.company,as_dict=1)
Saurabhf589c822016-07-15 18:28:05 +053072
73 for expense_type in expese_types[:random.randint(1,4)]:
74 claim_amount = random.randint(1,20)*10
75
76 expenses.append({
77 "expense_date": frappe.flags.current_date,
78 "expense_type": expense_type.name,
79 "default_account": expense_type.default_account or "Miscellaneous Expenses - WPL",
80 "claim_amount": claim_amount,
81 "sanctioned_amount": claim_amount
82 })
83
84 return expenses
85
86def update_sanctioned_amount(expense_claim):
87 for expense in expense_claim.expenses:
88 sanctioned_amount = random.randint(1,20)*10
89
90 if sanctioned_amount < expense.claim_amount:
91 expense.sanctioned_amount = sanctioned_amount
Rohit Waghchaure8002d472016-07-13 16:03:05 +053092
93def get_timesheet_based_salary_slip_employee():
Kanchan Chauhandb197d52016-08-20 00:30:59 +053094 sal_struct = frappe.db.sql("""
95 select name from `tabSalary Structure`
96 where salary_slip_based_on_timesheet = 1
97 and docstatus != 2""")
98 if sal_struct:
99 employees = frappe.db.sql("""
100 select employee from `tabSalary Structure Employee`
101 where parent IN %(sal_struct)s""", {"sal_struct": sal_struct}, as_dict=True)
102 return employees
Rohit Waghchaure8002d472016-07-13 16:03:05 +0530103
104def make_timesheet_records():
105 employees = get_timesheet_based_salary_slip_employee()
Kanchan Chauhandb197d52016-08-20 00:30:59 +0530106 for e in employees:
107 ts = make_timesheet(e.employee, simulate = True, billable = 1, activity_type=get_random("Activity Type"))
Rohit Waghchaure8002d472016-07-13 16:03:05 +0530108
109 rand = random.random()
110 if rand >= 0.3:
111 make_salary_slip_for_timesheet(ts.name)
112
113 rand = random.random()
114 if rand >= 0.2:
115 make_sales_invoice_for_timesheet(ts.name)
116
117def make_salary_slip_for_timesheet(name):
118 salary_slip = make_salary_slip(name)
119 salary_slip.insert()
120 salary_slip.submit()
Rohit Waghchaure7d439ec2016-07-21 14:50:59 +0530121 frappe.db.commit()
Rohit Waghchaure8002d472016-07-13 16:03:05 +0530122
123def make_sales_invoice_for_timesheet(name):
124 sales_invoice = make_sales_invoice(name)
125 sales_invoice.customer = get_random("Customer")
126 sales_invoice.append('items', {
Nabin Hait74edfff2016-07-21 11:39:46 +0530127 'item_code': get_random("Item", {"has_variants": 0, "is_stock_item": 0, "is_fixed_asset": 0}),
Rohit Waghchaure8002d472016-07-13 16:03:05 +0530128 'qty': 1,
129 'rate': 1000
130 })
Rohit Waghchaure7d439ec2016-07-21 14:50:59 +0530131 sales_invoice.flags.ignore_permissions = 1
Rohit Waghchaure8002d472016-07-13 16:03:05 +0530132 sales_invoice.set_missing_values()
133 sales_invoice.calculate_taxes_and_totals()
134 sales_invoice.insert()
Rohit Waghchaure7d439ec2016-07-21 14:50:59 +0530135 sales_invoice.submit()
Kanchan Chauhandb0e57c2016-07-29 15:59:39 +0530136 frappe.db.commit()
137
138def make_leave_application():
139 allocated_leaves = frappe.get_all("Leave Allocation", fields=['employee', 'leave_type'])
140
141 for allocated_leave in allocated_leaves:
142 leave_balance = get_leave_balance_on(allocated_leave.employee, allocated_leave.leave_type, frappe.flags.current_date,
143 consider_all_leaves_in_the_allocation_period=True)
144 if leave_balance != 0:
145 if leave_balance == 1:
146 to_date = frappe.flags.current_date
147 else:
148 to_date = add_days(frappe.flags.current_date, random.randint(0, leave_balance-1))
149
150 leave_application = frappe.get_doc({
151 "doctype": "Leave Application",
152 "employee": allocated_leave.employee,
153 "from_date": frappe.flags.current_date,
154 "to_date": to_date,
155 "leave_type": allocated_leave.leave_type,
156 "status": "Approved"
157 })
158 try:
159 leave_application.insert()
160 leave_application.submit()
161 frappe.db.commit()
162 except (OverlapError):
163 frappe.db.rollback()
164
165def mark_attendance():
166 att_date = frappe.flags.current_date
167 for employee in frappe.get_all('Employee', fields=['name'], filters = {'status': 'Active'}):
168
169 if not frappe.db.get_value("Attendance", {"employee": employee.name, "att_date": att_date}):
170 attendance = frappe.get_doc({
171 "doctype": "Attendance",
172 "employee": employee.name,
173 "att_date": att_date
174 })
175 leave = frappe.db.sql("""select name from `tabLeave Application`
176 where employee = %s and %s between from_date and to_date and status = 'Approved'
177 and docstatus = 1""", (employee.name, att_date))
178
179 if leave:
180 attendance.status = "Absent"
181 else:
Neil Trini Lasrado06724592016-08-22 12:57:09 +0530182 attendance.status = "Present"
Kanchan Chauhandb0e57c2016-07-29 15:59:39 +0530183 attendance.save()
184 attendance.submit()
Neil Trini Lasrado06724592016-08-22 12:57:09 +0530185 frappe.db.commit()