Rushabh Mehta | dc8067e | 2016-06-29 18:38:32 +0530 | [diff] [blame] | 1 | from __future__ import unicode_literals |
| 2 | import frappe |
Rohit Waghchaure | 8002d47 | 2016-07-13 16:03:05 +0530 | [diff] [blame] | 3 | import random |
Kanchan Chauhan | db0e57c | 2016-07-29 15:59:39 +0530 | [diff] [blame] | 4 | from frappe.utils import random_string, add_days |
Rohit Waghchaure | 8002d47 | 2016-07-13 16:03:05 +0530 | [diff] [blame] | 5 | from erpnext.projects.doctype.timesheet.test_timesheet import make_timesheet |
| 6 | from erpnext.projects.doctype.timesheet.timesheet import make_salary_slip, make_sales_invoice |
| 7 | from frappe.utils.make_random import how_many, get_random |
Saurabh | f589c82 | 2016-07-15 18:28:05 +0530 | [diff] [blame] | 8 | from erpnext.hr.doctype.expense_claim.expense_claim import get_expense_approver, make_bank_entry |
Kanchan Chauhan | db0e57c | 2016-07-29 15:59:39 +0530 | [diff] [blame] | 9 | from erpnext.hr.doctype.leave_application.leave_application import get_leave_balance_on, OverlapError |
Rushabh Mehta | dc8067e | 2016-06-29 18:38:32 +0530 | [diff] [blame] | 10 | |
| 11 | def work(): |
| 12 | frappe.set_user(frappe.db.get_global('demo_hr_user')) |
Rushabh Mehta | dc8067e | 2016-06-29 18:38:32 +0530 | [diff] [blame] | 13 | year, month = frappe.flags.current_date.strftime("%Y-%m").split("-") |
Kanchan Chauhan | db0e57c | 2016-07-29 15:59:39 +0530 | [diff] [blame] | 14 | |
| 15 | mark_attendance() |
| 16 | make_leave_application() |
Rushabh Mehta | dc8067e | 2016-06-29 18:38:32 +0530 | [diff] [blame] | 17 | |
| 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 Waghchaure | 8002d47 | 2016-07-13 16:03:05 +0530 | [diff] [blame] | 35 | |
| 36 | if frappe.db.get_global('demo_hr_user'): |
| 37 | make_timesheet_records() |
Saurabh | f589c82 | 2016-07-15 18:28:05 +0530 | [diff] [blame] | 38 | |
| 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 | |
Saurabh | 9cba6e1 | 2016-07-18 16:22:51 +0530 | [diff] [blame] | 50 | if rand < 0.4: |
Saurabh | f589c82 | 2016-07-15 18:28:05 +0530 | [diff] [blame] | 51 | 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 | |
Saurabh | 9cba6e1 | 2016-07-18 16:22:51 +0530 | [diff] [blame] | 64 | elif rand < 0.2: |
Saurabh | f589c82 | 2016-07-15 18:28:05 +0530 | [diff] [blame] | 65 | expense_claim.approval_status = "Rejected" |
| 66 | expense_claim.submit() |
| 67 | |
| 68 | def get_expenses(): |
| 69 | expenses = [] |
Saurabh | 718d835 | 2016-07-18 15:20:47 +0530 | [diff] [blame] | 70 | 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) |
Saurabh | f589c82 | 2016-07-15 18:28:05 +0530 | [diff] [blame] | 73 | |
| 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 | |
| 87 | def 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 Waghchaure | 8002d47 | 2016-07-13 16:03:05 +0530 | [diff] [blame] | 93 | |
| 94 | def 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 | |
| 98 | def 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 | |
| 111 | def make_salary_slip_for_timesheet(name): |
| 112 | salary_slip = make_salary_slip(name) |
| 113 | salary_slip.insert() |
| 114 | salary_slip.submit() |
Rohit Waghchaure | 7d439ec | 2016-07-21 14:50:59 +0530 | [diff] [blame] | 115 | frappe.db.commit() |
Rohit Waghchaure | 8002d47 | 2016-07-13 16:03:05 +0530 | [diff] [blame] | 116 | |
| 117 | def 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 Hait | 74edfff | 2016-07-21 11:39:46 +0530 | [diff] [blame] | 121 | 'item_code': get_random("Item", {"has_variants": 0, "is_stock_item": 0, "is_fixed_asset": 0}), |
Rohit Waghchaure | 8002d47 | 2016-07-13 16:03:05 +0530 | [diff] [blame] | 122 | 'qty': 1, |
| 123 | 'rate': 1000 |
| 124 | }) |
Rohit Waghchaure | 7d439ec | 2016-07-21 14:50:59 +0530 | [diff] [blame] | 125 | sales_invoice.flags.ignore_permissions = 1 |
Rohit Waghchaure | 8002d47 | 2016-07-13 16:03:05 +0530 | [diff] [blame] | 126 | sales_invoice.set_missing_values() |
| 127 | sales_invoice.calculate_taxes_and_totals() |
| 128 | sales_invoice.insert() |
Rohit Waghchaure | 7d439ec | 2016-07-21 14:50:59 +0530 | [diff] [blame] | 129 | sales_invoice.submit() |
Kanchan Chauhan | db0e57c | 2016-07-29 15:59:39 +0530 | [diff] [blame] | 130 | frappe.db.commit() |
| 131 | |
| 132 | def 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 | |
| 159 | def 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() |