summaryrefslogtreecommitdiff
path: root/addons/hr_holidays/report/holidays_summary_report.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/hr_holidays/report/holidays_summary_report.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/hr_holidays/report/holidays_summary_report.py')
-rw-r--r--addons/hr_holidays/report/holidays_summary_report.py124
1 files changed, 124 insertions, 0 deletions
diff --git a/addons/hr_holidays/report/holidays_summary_report.py b/addons/hr_holidays/report/holidays_summary_report.py
new file mode 100644
index 00000000..74d41d19
--- /dev/null
+++ b/addons/hr_holidays/report/holidays_summary_report.py
@@ -0,0 +1,124 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import calendar
+
+from datetime import timedelta
+from dateutil.relativedelta import relativedelta
+from odoo import api, fields, models, _
+from odoo.exceptions import UserError
+
+
+class HrHolidaySummaryReport(models.AbstractModel):
+ _name = 'report.hr_holidays.report_holidayssummary'
+ _description = 'Holidays Summary Report'
+
+ def _get_header_info(self, start_date, holiday_type):
+ st_date = fields.Date.from_string(start_date)
+ return {
+ 'start_date': fields.Date.to_string(st_date),
+ 'end_date': fields.Date.to_string(st_date + relativedelta(days=59)),
+ 'holiday_type': 'Confirmed and Approved' if holiday_type == 'both' else holiday_type
+ }
+
+ def _date_is_day_off(self, date):
+ return date.weekday() in (calendar.SATURDAY, calendar.SUNDAY,)
+
+ def _get_day(self, start_date):
+ res = []
+ start_date = fields.Date.from_string(start_date)
+ for x in range(0, 60):
+ color = '#ababab' if self._date_is_day_off(start_date) else ''
+ res.append({'day_str': start_date.strftime('%a'), 'day': start_date.day , 'color': color})
+ start_date = start_date + relativedelta(days=1)
+ return res
+
+ def _get_months(self, start_date):
+ # it works for geting month name between two dates.
+ res = []
+ start_date = fields.Date.from_string(start_date)
+ end_date = start_date + relativedelta(days=59)
+ while start_date <= end_date:
+ last_date = start_date + relativedelta(day=1, months=+1, days=-1)
+ if last_date > end_date:
+ last_date = end_date
+ month_days = (last_date - start_date).days + 1
+ res.append({'month_name': start_date.strftime('%B'), 'days': month_days})
+ start_date += relativedelta(day=1, months=+1)
+ return res
+
+ def _get_leaves_summary(self, start_date, empid, holiday_type):
+ res = []
+ count = 0
+ start_date = fields.Date.from_string(start_date)
+ end_date = start_date + relativedelta(days=59)
+ for index in range(0, 60):
+ current = start_date + timedelta(index)
+ res.append({'day': current.day, 'color': ''})
+ if self._date_is_day_off(current) :
+ res[index]['color'] = '#ababab'
+ # count and get leave summary details.
+ holiday_type = ['confirm','validate'] if holiday_type == 'both' else ['confirm'] if holiday_type == 'Confirmed' else ['validate']
+ holidays = self.env['hr.leave'].search([
+ ('employee_id', '=', empid), ('state', 'in', holiday_type),
+ ('date_from', '<=', str(end_date)),
+ ('date_to', '>=', str(start_date))
+ ])
+ for holiday in holidays:
+ # Convert date to user timezone, otherwise the report will not be consistent with the
+ # value displayed in the interface.
+ date_from = fields.Datetime.from_string(holiday.date_from)
+ date_from = fields.Datetime.context_timestamp(holiday, date_from).date()
+ date_to = fields.Datetime.from_string(holiday.date_to)
+ date_to = fields.Datetime.context_timestamp(holiday, date_to).date()
+ for index in range(0, ((date_to - date_from).days + 1)):
+ if date_from >= start_date and date_from <= end_date:
+ res[(date_from-start_date).days]['color'] = holiday.holiday_status_id.color_name
+ date_from += timedelta(1)
+ count += holiday.number_of_days
+ employee = self.env['hr.employee'].browse(empid)
+ return {'emp': employee.name, 'display': res, 'sum': count}
+
+ def _get_data_from_report(self, data):
+ res = []
+ Employee = self.env['hr.employee']
+ if 'depts' in data:
+ for department in self.env['hr.department'].browse(data['depts']):
+ res.append({
+ 'dept': department.name,
+ 'data': [
+ self._get_leaves_summary(data['date_from'], emp.id, data['holiday_type'])
+ for emp in Employee.search([('department_id', '=', department.id)])
+ ],
+ 'color': self._get_day(data['date_from']),
+ })
+ elif 'emp' in data:
+ res.append({'data': [
+ self._get_leaves_summary(data['date_from'], emp.id, data['holiday_type'])
+ for emp in Employee.browse(data['emp'])
+ ]})
+ return res
+
+ def _get_holidays_status(self):
+ res = []
+ for holiday in self.env['hr.leave.type'].search([]):
+ res.append({'color': holiday.color_name, 'name': holiday.name})
+ return res
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ if not data.get('form'):
+ raise UserError(_("Form content is missing, this report cannot be printed."))
+
+ holidays_report = self.env['ir.actions.report']._get_report_from_name('hr_holidays.report_holidayssummary')
+ holidays = self.env['hr.leave'].browse(self.ids)
+ return {
+ 'doc_ids': self.ids,
+ 'doc_model': holidays_report.model,
+ 'docs': holidays,
+ 'get_header_info': self._get_header_info(data['form']['date_from'], data['form']['holiday_type']),
+ 'get_day': self._get_day(data['form']['date_from']),
+ 'get_months': self._get_months(data['form']['date_from']),
+ 'get_data_from_report': self._get_data_from_report(data['form']),
+ 'get_holidays_status': self._get_holidays_status(),
+ }