Class: Report::PresenceReport::Presence
- Inherits:
-
Object
- Object
- Report::PresenceReport::Presence
- Defined in:
- app/services/report/presence_report/presence.rb
Overview
Creates a presence report for first signed in time of the day
Class Method Summary collapse
-
.first_available_presence_report(options = {}) ⇒ Array
Presence report rows.
-
.last_away_presence_report(options = {}) ⇒ Array
Presence report rows.
-
.report(options = {}) ⇒ Array
Presence report rows.
Class Method Details
.first_available_presence_report(options = {}) ⇒ Array
Returns presence report rows.
7 8 9 10 11 |
# File 'app/services/report/presence_report/presence.rb', line 7 def self.first_available_presence_report( = {}) [:tracked_presence] = 'available' [:track_mode] = :first presence_report end |
.last_away_presence_report(options = {}) ⇒ Array
Returns presence report rows.
16 17 18 19 20 |
# File 'app/services/report/presence_report/presence.rb', line 16 def self.last_away_presence_report( = {}) [:tracked_presence] = 'away' [:track_mode] = :last presence_report end |
.report(options = {}) ⇒ Array
Returns presence report rows.
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'app/services/report/presence_report/presence.rb', line 29 def self.report( = {}) [:tracked_presence] ||= 'available' [:track_mode] = :first if [:track_mode].nil? # options[:date_start] ||= Date.current.beginning_of_week # options[:date_end] ||= options[:date_start].end_of_week start_time = [:period1_gteq].beginning_of_day end_time = [:period1_lteq].end_of_day base = RecordVersion.where(item_type: 'EmployeePhoneStatus') .where(created_at: start_time..end_time) .where("object_changes->'presence'->>1 = ?", [:tracked_presence]) change_events = if [[], [""]].include?([:employee_phone_ids]) base else base.where(whodunnit: [:employee_phone_ids]) end # Load all employee phone status and employees employee_phone_statuses = EmployeePhoneStatus.includes(:employee).all # Grouping by date report_grouped = {} change_events.each do |version| report_date = version.created_at.to_date employee = employee_phone_statuses.find { |eps| eps.id == version.item_id }.employee employee_key = [employee.full_name, employee.id] report_grouped[employee_key] ||= {} new_event_time = version.created_at if (current_event_time = report_grouped[employee_key][report_date]) # Take the earliest event if [:track_mode] == :last new_event_time = current_event_time unless new_event_time > current_event_time else new_event_time = current_event_time unless new_event_time < current_event_time end end report_grouped[employee_key][ report_date ] = new_event_time end formatted_report_grouped = {} # Reformat times report_grouped.sort.each do |employee_key, date_hsh| date_hsh.sort.each do |report_date, event_time| formatted_report_grouped[employee_key] ||= {} formatted_report_grouped[employee_key][report_date] = event_time.strftime("%I:%M:%S %p") end end formatted_report_grouped end |