Skip to content

Commit

Permalink
Merge pull request #3014 from ONE-F-M/test-production
Browse files Browse the repository at this point in the history
Test production to Master
  • Loading branch information
mymi14s authored Dec 28, 2023
2 parents 2c3ab42 + 7a405a8 commit 0651fb5
Show file tree
Hide file tree
Showing 12 changed files with 333 additions and 70 deletions.
36 changes: 36 additions & 0 deletions one_fm/api/doc_methods/hd_ticket.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import frappe
from frappe.utils import getdate
from frappe.desk.form.assign_to import add as add_assignment


def validate_hd_ticket(doc,event):
if not doc.is_new():
existing_todo = frappe.get_all("ToDo",{'reference_name':doc.name,'reference_type':'HD Ticket'},['name'])
if not existing_todo:
bug_buster = frappe.get_all("Bug Buster",{'docstatus':1,'from_date':['<=',getdate()],'to_date':['>=',getdate()]},['employee'])
if bug_buster:
emp_user = frappe.get_value("Employee",bug_buster[0].employee,'user_id')
if emp_user:
add_assignment({
'doctype': "HD Ticket",
'name': str(doc.name),
'assign_to': [emp_user],
"description": "Please Review Issue",
})

def assign_to_bug_buster(doc, event):
"""
Assign Ticket to the bug buster if any exists
"""
bug_buster = frappe.get_all("Bug Buster",{'docstatus':1,'from_date':['<=',getdate()],'to_date':['>=',getdate()]},['employee'])
if bug_buster:
emp_user = frappe.get_value("Employee",bug_buster[0].employee,'user_id')
if emp_user:
existing_todo = frappe.get_all("ToDo",{'reference_name':doc.name,'reference_type':'HD Ticket'},['name'])
if not existing_todo:
add_assignment({
'doctype': "HD Ticket",
'name': str(doc.name),
'assign_to': [emp_user],
"description": "Please Review Issue details",
})
72 changes: 45 additions & 27 deletions one_fm/api/doc_methods/payroll_entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@
from hrms.payroll.doctype.payroll_entry.payroll_entry import (
get_filter_condition, get_joining_relieving_condition, remove_payrolled_employees, get_salary_structure
)
from one_fm.one_fm.doctype.hr_and_payroll_additional_settings.hr_and_payroll_additional_settings import get_projects_not_configured_in_payroll_cycle_but_linked_in_employee
from one_fm.one_fm.doctype.hr_and_payroll_additional_settings.hr_and_payroll_additional_settings import (
get_projects_not_configured_in_payroll_cycle_but_linked_in_employee,
get_projects_configured_in_payroll_cycle
)
from itertools import groupby
from operator import itemgetter
from one_fm.processor import sendemail
Expand Down Expand Up @@ -69,29 +72,40 @@ def fill_employee_details(self):
and for which salary structure exists.
"""
self.set('employees', [])
# Find projects comes under the same payroll cycle
if str(get_start_date(self.start_date)) == str(frappe.db.get_single_value('HR and Payroll Additional Settings', 'default_payroll_start_day')):

project_list = False

# Find payroll cycle start day
payroll_start_day = str(get_start_date(self.start_date))

# Find projects comes under the default payroll cycle
if payroll_start_day == str(frappe.db.get_single_value('HR and Payroll Additional Settings', 'default_payroll_start_day')):
# Find all projects linked to payroll cycles
query = '''
select
project
from
`tabProject Payroll Cycle`
'''
projects = frappe.db.sql(query, as_dict=True)
default_projects = get_projects_not_configured_in_payroll_cycle_but_linked_in_employee(', '.join(['"{}"'.format(project.project) for project in projects]))
project_list = ', '.join(['"{}"'.format(project.project) for project in default_projects])
if not projects:
projects = [{'project': ''}]

# Get projects not configured in payroll cycle but linked in employee
default_projects = get_projects_not_configured_in_payroll_cycle_but_linked_in_employee(', '.join(['"{}"'.format(project['project']) for project in projects]))
if default_projects:
project_list = ', '.join(['"{}"'.format(project.project) for project in default_projects])

# Find projects configured in default payroll cycle
configured_projects = get_projects_configured_in_payroll_cycle(payroll_start_day)
if configured_projects:
if project_list:
project_list += ', '+configured_projects
else:
project_list = configured_projects
else:
query = '''
select
project
from
`tabProject Payroll Cycle`
where
payroll_start_day = '{0}'
'''
start_day = get_start_date(self.start_date)
projects = frappe.db.sql(query.format(start_day), as_dict=True)
project_list = ', '.join(['"{}"'.format(project.project) for project in projects])
# Find projects configured in payroll start day
project_list = get_projects_configured_in_payroll_cycle(payroll_start_day)

employees = get_emp_list(self, project_list)

Expand Down Expand Up @@ -133,7 +147,7 @@ def get_emp_list(self, project_list=False):
sal_struct = get_salary_structure(
self.company, self.currency, self.salary_slip_based_on_timesheet, self.payroll_frequency
)
print(sal_struct)

if sal_struct:
cond += "and t2.salary_structure IN %(sal_struct)s "
cond += "and t2.payroll_payable_account = %(payroll_payable_account)s "
Expand Down Expand Up @@ -290,6 +304,8 @@ def auto_create_payroll_entry(payroll_date=None):
# Calculate payroll date
payroll_date = (datetime(getdate().year, getdate().month, cint(payroll_date_day))).strftime("%Y-%m-%d")

# Find default from date and end date for payroll
default_payroll_start_day = frappe.db.get_single_value('HR and Payroll Additional Settings', 'default_payroll_start_day')

# Get Payroll cycle list from HR and Payroll Settings and itrate for payroll cycle
query = '''
Expand All @@ -298,23 +314,25 @@ def auto_create_payroll_entry(payroll_date=None):
from
`tabProject Payroll Cycle`
'''
payroll_start_day_list = frappe.db.sql(query, as_dict=True)
payroll_type = ["Basic", "Over-Time"]
data = frappe.db.sql(query, as_dict=True)

payroll_start_day_list = [d['payroll_start_day'] for d in data]

for payroll_start_day in payroll_start_day_list:
# Find from date and end date for payroll
start_date, end_date = get_payroll_start_end_date_by_start_day(payroll_date, payroll_start_day.payroll_start_day)
start_date, end_date = get_payroll_start_end_date_by_start_day(payroll_date, payroll_start_day)

# Create Payroll Entry
create_monthly_payroll_entry(payroll_date, start_date, end_date, payroll_type)
create_monthly_payroll_entry(payroll_date, start_date, end_date)

# # Find default from date and end date for payroll
default_payroll_start_day = frappe.db.get_single_value('HR and Payroll Additional Settings', 'default_payroll_start_day')
default_start_date, default_end_date = get_payroll_start_end_date_by_start_day(payroll_date, default_payroll_start_day)
if default_payroll_start_day and default_payroll_start_day not in payroll_start_day_list:
default_start_date, default_end_date = get_payroll_start_end_date_by_start_day(payroll_date, default_payroll_start_day)

create_monthly_payroll_entry(payroll_date, default_start_date, default_end_date, payroll_type)
create_monthly_payroll_entry(payroll_date, default_start_date, default_end_date)

def create_monthly_payroll_entry(payroll_date, start_date, end_date, payroll_type):
def create_monthly_payroll_entry(payroll_date, start_date, end_date):
try:
payroll_type = ["Basic", "Over-Time"]
for types in payroll_type:
payroll_entry = frappe.new_doc("Payroll Entry")
payroll_entry.posting_date = getdate(payroll_date)
Expand Down Expand Up @@ -643,7 +661,7 @@ def create_salary_slips(doc):
create_salary_slips_for_employees(employees, payroll_entry = doc, publish_progress=False)
# since this method is called via frm.call this doc needs to be updated manually
doc.reload()


def log_payroll_failure(process, payroll_entry, error):
error_log = frappe.log_error(
Expand Down
18 changes: 8 additions & 10 deletions one_fm/api/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -1021,24 +1021,22 @@ def process_overtime_shift(roster, date, time):
for schedule in roster:
#Check for employee's shift assignment of the day, if he has any.
try:
if frappe.db.exists("Shift Assignment", {"employee":schedule.employee, "start_date": date}):
shift_assignment = frappe.get_doc("Shift Assignment", {"employee":schedule.employee, "start_date": date},["name","shift_type"])
if frappe.db.exists('Employee', {'employee':schedule.employee, 'status':'Active'}):
shift_assignment = frappe.db.sql(f"""SELECT name, shift_type, end_datetime, roster_type from `tabShift Assignment` WHERE employee = '{schedule.employee}' AND date(end_datetime) = '{date}'""", as_dict=1)
if shift_assignment:
shift_end_time = frappe.get_value("Shift Type",shift_assignment.shift_type, "end_time")
shift_end_time = frappe.get_value("Shift Type",shift_assignment[0].shift_type, "end_time")
#check if the given shift has ended
# Set status inactive before creating new shift
if str(shift_end_time) == str(time):
frappe.set_value("Shift Assignment", shift_assignment.name,'end_date', date)
frappe.set_value("Shift Assignment", shift_assignment.name,'status', "Inactive")
frappe.set_value("Shift Assignment", shift_assignment[0].name,'end_date', date)
frappe.set_value("Shift Assignment", shift_assignment[0].name,'status', "Inactive")
create_overtime_shift_assignment(schedule, date)
else:
create_overtime_shift_assignment(schedule, date)
else:
create_overtime_shift_assignment(schedule, date)
except Exception as e:
continue

def create_overtime_shift_assignment(schedule, date):
if (not frappe.db.exists("Shift Assignment",{"employee":schedule.employee, 'docstatus':1, "start_date":getdate(date), "status":"Active"}) and
frappe.db.exists('Employee', {'employee':schedule.employee, 'status':'Active'})):
def create_overtime_shift_assignment(schedule, date):
try:
shift_assignment = frappe.new_doc("Shift Assignment")
shift_assignment.start_date = date
Expand Down
18 changes: 16 additions & 2 deletions one_fm/developer/doctype/bug_buster/bug_buster.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ def send_email(self):
""",
)


def roster_bug_buster():
today = getdate()
tomorrow = add_days(today, 1)
Expand All @@ -70,4 +69,19 @@ def roster_bug_buster():
"employee":busters.next_bug_buster,
"from_date": tomorrow,
"to_date": add_days(tomorrow, 6)
}).submit()
}).submit()
#set user in HD Team
try:
emp_user = frappe.get_value("Employee",busters.next_bug_buster,'user_id')
if emp_user and busters.get('default_support_team'):
frappe.db.sql(f"Delete from `tabHD Team Member` where parent = '{busters.get('default_support_team')}' and parenttype ='HD Team' ")
frappe.get_doc({
'doctype':'HD Team Member',
'parent':busters.get('default_support_team'),
'parentfield':'users',
'user':emp_user,
'parenttype' :'HD Team'
}).insert()
except:
frappe.log_error(title="Error Assigning Bug Buster",message = frappe.get_traceback())

Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
"full_name",
"to_date",
"section_break_x5grl",
"employees"
"employees",
"default_support_team"
],
"fields": [
{
Expand Down Expand Up @@ -55,11 +56,17 @@
"fieldname": "to_date",
"fieldtype": "Date",
"label": "To Date"
},
{
"fieldname": "default_support_team",
"fieldtype": "Link",
"label": "Default Support Team",
"options": "HD Team"
}
],
"issingle": 1,
"links": [],
"modified": "2023-03-07 17:08:27.711904",
"modified": "2023-12-23 20:18:15.804068",
"modified_by": "Administrator",
"module": "Developer",
"name": "Bug Buster Employee",
Expand Down
4 changes: 4 additions & 0 deletions one_fm/hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,10 @@
"Leave Type": {
"validate": "one_fm.utils.validate_leave_type_for_one_fm_paid_leave"
},
"HD Ticket": {
"after_insert": "one_fm.api.doc_methods.hd_ticket.assign_to_bug_buster",
"validate": "one_fm.api.doc_methods.hd_ticket.validate_hd_ticket"
},
"Employee Grade": {
"validate": "one_fm.one_fm.utils.employee_grade_validate"
},
Expand Down
Loading

0 comments on commit 0651fb5

Please sign in to comment.