shiftnote 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a2b6656f26dac7e804d5913fc203623998e548e8af5ef23defc3ee2447d02e2a
4
- data.tar.gz: 3b3e588761717222c407be99ee76219d9cfa7ed18383a81145eae5fe34205d54
3
+ metadata.gz: 24825e9ebbda63ba9faf0fd76c83750438962dbf410167c47fbc5ebe884020fe
4
+ data.tar.gz: 88e4cd763bf6a5cef2516eba9ccfccd9701c4fa48e3d5b8de3bbcf994f8e3705
5
5
  SHA512:
6
- metadata.gz: e0f3b24ac76fd45f84f2a65817c2b4b57afb2d7d81d292f69231dba98fe27083bf2068e95212e6c5bf5e688147487551a30b90b5fcbe11f5d45f68bb8baa4b82
7
- data.tar.gz: fc572be0e9db37eb992a7f7615332ecc29d12bcc284a3d4ecb330a9a0b751e136a6b198438e5973f688ce5267092e3eeafc846ec8a8ccc8aca42344047309ec2
6
+ metadata.gz: 24bd639a5fce56f0a580cc2ffb54ab868ef2ed52671b62632ba78d8425ef27383698b7f6a3a19ef2b8c0d0de42aa64f3e7077fc38d34868446ce321bda68b50f
7
+ data.tar.gz: 7dd67473ef2150cc5d821d8ee58335d047e7bdb03fd7235b1acef44fbb76002f51adfc1d0327f6c7c8aa1c5a198b3ce951992141b2d36e3454375f0541cbe37c
@@ -8,13 +8,18 @@ require 'rails'
8
8
 
9
9
  # All ShiftNote functionality, whether extended or just here.
10
10
  class ShiftNote
11
- # Initialize a new ShiftNote variable, via a cookie.
12
- # @param cookie [String] Cookie of an authenticated user.
13
- def initialize(credentials = {})
14
- @credentials = credentials
15
- generate_cookie(credentials[:username], credentials[:password])
11
+ # Initialize a new ShiftNote variable, via login credentials.
12
+ # @param username [String] the username of the user.
13
+ # @param password [String] the password of the user.
14
+ def initialize(username: nil, password: nil)
15
+ @credentials = { username: username, password: password }
16
+ generate_cookie(username, password)
16
17
  end
17
18
 
19
+ # Generate a cookie, based on login credentials.
20
+ # @param username [String] the username of the user.
21
+ # @param password [String] the password of the user.
22
+ # @return [String] the cookie!
18
23
  def generate_cookie(username, password)
19
24
  uri = URI.parse('https://ww1.shiftnote.com/login')
20
25
  request = Net::HTTP::Post.new(uri)
@@ -41,9 +46,40 @@ class ShiftNote
41
46
  @cookie = response.header['Set-Cookie']
42
47
  end
43
48
 
44
- # Initialize the Employee
45
- # @return [ShiftNote::EmployeeOverviewViewModel] the employee
46
- def employee
49
+ # Useful method (for the gem that is) that gets rid of stuff we don't need.
50
+ # @!visibility private
51
+ # @param string [String] a string to scrape the junk off
52
+ def scrapejunk(string)
53
+ string.gsub('<script>', '').delete(';').gsub('</script>', '').gsub('window.scheduleMinebindings = ShiftNote.Bind(window.scheduleMinemodel)', '').gsub('window.scheduleMinemodel = ', '')
54
+ end
55
+
56
+ # Method to find the next instance of the given date.
57
+ # @!visibility private
58
+ # @param day [String] what day to find
59
+ def date_of_next(day)
60
+ date = Date.parse(day)
61
+ delta = date > Date.today ? 0 : 7
62
+ date + delta
63
+ end
64
+
65
+ # This is basically an API token.
66
+ # @return [String] the cookie of the authenticated user
67
+ def cookie
68
+ shiftnote = RestClient.get('https://ww1.shiftnote.com/BulletinBoard/', Cookie: @cookie)
69
+
70
+ doc = Nokogiri::HTML.parse(shiftnote.body)
71
+
72
+ begin
73
+ doc.search('div#MyScheduleDiv').at('script').text
74
+ rescue NoMethodError
75
+ generate_cookie(@credentials[:username], @credentials[:password])
76
+ end
77
+ @cookie
78
+ end
79
+
80
+ # Get the information of the currently logged in user.
81
+ # @return [User] the user
82
+ def user
47
83
  shiftnote = RestClient.get('https://ww1.shiftnote.com/BulletinBoard/', Cookie: @cookie)
48
84
 
49
85
  doc = Nokogiri::HTML.parse(shiftnote.body)
@@ -57,24 +93,45 @@ class ShiftNote
57
93
 
58
94
  data = data.gsub('<script>', '').delete(';').gsub('</script>', '').gsub('window.scheduleMinebindings = ShiftNote.Bind(window.scheduleMinemodel)', '').gsub('window.scheduleMinemodel = ', '')
59
95
 
60
- @employee = EmployeeOverviewViewModel.new(JSON.parse(data))
96
+ User.new(JSON.parse(data))
97
+ end
98
+
99
+ # Get an employee (by id)
100
+ # @param id [Integer] the id of the employee
101
+ def employee(id)
102
+ Employee.new(id: id)
61
103
  end
62
104
 
63
- # @param weeks [Integer]
64
- def get_all_upcoming_shifts(_weeks = 0)
65
- employee if @employee = nil?
66
- week2 = RestClient.get("https://ww1.shiftnote.com/Schedules/ScheduleMine/?startDate=#{nextmonday.month}%2F#{nextmonday.day}%2F#{nextmonday.year}&noContainer=true&_=1559999273196", Cookie: @cookie)
105
+ # @param day [String] what day the week starts on.
106
+ # @return [ScheduleThisWeek] the schedule for next week.
107
+ def get_next_week_shifts(day = "Monday")
108
+ nextmonday = date_of_next(day)
109
+
110
+ week2 = RestClient.get("https://ww1.shiftnote.com/Schedules/ScheduleMine/?startDate=#{nextmonday.month}%2F#{nextmonday.day}%2F#{nextmonday.year}&noContainer=true&_=#{Time.now.to_i * 1000}", Cookie: cookie)
67
111
 
68
112
  week2doc = Nokogiri::HTML.parse(week2.body)
69
113
  dataweek2 = JSON.parse(scrapejunk(week2doc.at('script').text))
70
- me2 = EmployeeOverviewViewModel.new(dataweek2)
114
+ User.new(dataweek2).schedule_this_week
115
+ end
116
+
117
+ # Send a message to a user (or group of them)
118
+ # @param recipients [Array<Integer>] who will receive this message
119
+ def send_message(recipients, subject, body, urgent)
120
+ data = {
121
+ "ToUserIDs" => recipients,
122
+ "Subject" => subject,
123
+ "Body" => body,
124
+ "Priority" => urgent
125
+ }
126
+ RestClient.post('https://ww1.shiftnote.com/Message/SendMessages', URI.encode_www_form(data), Cookie: @cookie)
71
127
  end
72
128
  end
73
129
 
74
130
  # Require files.
75
131
  require_relative 'shiftnote/days_of_week_shift'
76
132
  require_relative 'shiftnote/days_of_week_shifts'
77
- require_relative 'shiftnote/employee_overview_view_model'
133
+ require_relative 'shiftnote/employee'
78
134
  require_relative 'shiftnote/errors'
79
- require_relative 'shiftnote/schedule_this_week_view_model'
80
- require_relative 'shiftnote/shift_view_model'
135
+ require_relative 'shiftnote/schedule_this_week'
136
+ require_relative 'shiftnote/shift'
137
+ require_relative 'shiftnote/user'
@@ -1,3 +1,4 @@
1
+ # A specific day of a schedule.
1
2
  class ShiftNote::DaysOfWeekShift
2
3
  def initialize(data)
3
4
  @raw = data
@@ -5,23 +6,28 @@ class ShiftNote::DaysOfWeekShift
5
6
  @raw_shifts = data['Shifts']
6
7
  end
7
8
 
9
+ # @return [Time] the day
8
10
  attr_reader :date
9
11
 
12
+ # @return [Array<Shift>] the shifts this employee is working on this day.
10
13
  def shifts
11
14
  shifts = []
12
15
  @raw_shifts.each do |e|
13
- shifts.push ShiftNote::ShiftViewModel.new(e)
16
+ shifts.push ShiftNote::Shift.new(e)
14
17
  end
15
18
  shifts
16
19
  end
17
20
 
21
+ # @return [Integer] the amount shifts this employee is working on this day.
18
22
  def amount_of_shifts
19
23
  @raw_shifts.length
20
24
  end
21
25
 
26
+ # @return [Shift] the first shift this employee is working on this day.
22
27
  def first_shift
23
- ShiftNote::ShiftViewModel.new(@raw_shifts.first)
28
+ ShiftNote::Shift.new(@raw_shifts.first)
24
29
  end
25
30
 
31
+ # @return [JSON] the raw data returned by ShiftNote.
26
32
  attr_reader :raw
27
33
  end
@@ -1,8 +1,11 @@
1
+ # The days of the week, their shifts.
1
2
  class ShiftNote::DaysOfWeekShifts
2
3
  def initialize(data)
3
4
  @data = data
4
5
  end
5
6
 
7
+ # The days in this week, whether working or not.
8
+ # @return [Array<DaysOfWeekShift>] the days in this schedule.
6
9
  def days
7
10
  dayz = []
8
11
  @data.each do |e|
@@ -11,6 +14,7 @@ class ShiftNote::DaysOfWeekShifts
11
14
  dayz
12
15
  end
13
16
 
17
+ # @return [Array<DaysOfWeekShift>] only the days this employee is working.
14
18
  def working_days
15
19
  dayz = []
16
20
  @data.each do |e|
@@ -19,6 +23,7 @@ class ShiftNote::DaysOfWeekShifts
19
23
  dayz
20
24
  end
21
25
 
26
+ # @return [JSON] the raw data returned by ShiftNote
22
27
  def raw
23
28
  @data
24
29
  end
@@ -0,0 +1,26 @@
1
+ # An employee.
2
+ class ShiftNote::Employee
3
+ def initialize(id: nil)
4
+ @id = id
5
+ end
6
+
7
+ # @return [Integer] the ID of the employee
8
+ attr_reader :id
9
+
10
+ # Deletes this employee
11
+ # Quote from the site
12
+ # This employee may have scheduled shifts.
13
+ # You can choose to have these assigned shifts converted to house shifts if they are on a published schedule, and template shifts if they are on a draft schedule.
14
+ # If [false], you will have to manually reassign or delete any shifts assigned to this employee.
15
+ # [true] will convert assigned shifts to house and template shifts.
16
+ # @param convert_shifts [true, false] whether to convert these shifts
17
+ def delete(convert_shifts = false)
18
+ cooki = cookie
19
+ puts cooki
20
+ data = {
21
+ 'EmployeeID' => @id,
22
+ 'ConvertShifts' => convert_shifts,
23
+ '_' => Time.now.to_i * 1000
24
+ }
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ # The schedule for this week.
2
+ class ShiftNote::ScheduleThisWeek
3
+ def initialize(data)
4
+ @raw = data
5
+ @start_date = Time.parse(data['StartDate'])
6
+ @end_date = Time.parse(data['EndDate'])
7
+ @hours = data['Hours']
8
+ @cost = data['Cost']
9
+ @shifts = data['Shifts']
10
+ @schedule = ShiftNote::DaysOfWeekShifts.new(data['DaysOfWeekShifts'])
11
+ end
12
+
13
+ # @return [Time] the start date of the schedule.
14
+ attr_reader :start_date
15
+
16
+ # @return [Time] the end date of the schedule.
17
+ attr_reader :end_date
18
+
19
+ # @return [Float] the total hours this employee is working this schedule
20
+ attr_reader :hours
21
+
22
+ # The cost is simply hours * rate.
23
+ # @return [Float] the amount of pay the employee will receive
24
+ attr_reader :cost
25
+
26
+ # @return [Float] the amount of shifts this person has this week.
27
+ attr_reader :shifts
28
+
29
+ # @return [ShiftNote::DaysOfWeekShifts] the schedule for this week
30
+ attr_reader :schedule
31
+
32
+ # @return [JSON] the raw data returned by ShiftNote.
33
+ attr_reader :raw
34
+ end
@@ -0,0 +1,144 @@
1
+ # A shift, on the schedule. Woah!
2
+ class ShiftNote::Shift
3
+ def initialize(data)
4
+ @raw = data
5
+ @schedule_id = data['ScheduleId']
6
+ @schedule_name = data['ScheduleName']
7
+ @schedule_status_id = data['ScheduleStatusId']
8
+ @shift_id = data['ShiftId']
9
+ @employee_id = data['EmployeeId']
10
+ @employee = data['Employee']
11
+ @shift_date = Time.parse(data['ShiftDate'])
12
+ @time_in = Time.parse(data['TimeIn'])
13
+ @time_out = Time.parse(data['TimeOut'])
14
+ @position = data['Position']
15
+ @position_color = data['PositionColor']
16
+ @internal_location = data['InternalLocation']
17
+ @open = data['Open']
18
+ @close = data['Close']
19
+ @on_call = data['OnCall']
20
+ @volume = data['Volume']
21
+ @note = data['Note']
22
+ @hours = data['Hours']
23
+ @cost = data['Cost']
24
+ @is_pending_pickup = data['IsPendingPickUp']
25
+ @is_pending_manager_approval = data['IsPendingManagerApproval']
26
+ @is_pending_swap = data['IsPendingSwap']
27
+ @is_pending_swap_manager_approval = data['IsPendingSwapManagerApproval']
28
+ @hide_end_times = data['HideEndTimes']
29
+ end
30
+
31
+ # @return [Integer] the shift's schedule's ID.
32
+ attr_reader :schedule_id
33
+
34
+ # @return [String] the shift's schedule's name
35
+ attr_reader :schedule_name
36
+
37
+ # I have absolutely no idea what the IDs mean.
38
+ # @return [Integer] the shift's schedule's status ID.
39
+ attr_reader :schedule_status_id
40
+
41
+ # @return [Integer] the shift's ID.
42
+ attr_reader :shift_id
43
+
44
+ # @return [Integer] the employee working this shift's ID.
45
+ attr_reader :employee_id
46
+
47
+ # @return [String] the name of the employee working this Shift.
48
+ attr_reader :employee
49
+
50
+ # @return [Time] the date of this shift.
51
+ attr_reader :shift_date
52
+
53
+ # @return [Time] the time this employee should clock in.
54
+ attr_reader :time_in
55
+
56
+ # @return [Time] the time this employee should clock out.
57
+ attr_reader :time_out
58
+
59
+ # @return [String] the position this employee is working.
60
+ attr_reader :position
61
+
62
+ # Probably used on the website.
63
+ # @return [String] the color of this position this employee is working.
64
+ attr_reader :position_color
65
+
66
+ # @return [String] the internal location of this shift.
67
+ attr_reader :internal_location
68
+
69
+ # I don't know what this means. Do they open? Is the shift open? What!
70
+ # It's true or false though.
71
+ # @return [true, false]
72
+ attr_reader :open
73
+
74
+ # I don't know what this means.
75
+ # @return [true, false]
76
+ attr_reader :close
77
+
78
+ # I don't know what this means.
79
+ # @return [true, false]
80
+ attr_reader :on_call
81
+
82
+ # I don't know what this means.
83
+ # @return [true, false]
84
+ attr_reader :volume
85
+
86
+ # I don't know what this means.
87
+ # @return [String]
88
+ attr_reader :note
89
+
90
+ # @return [Float] the duration of this shift in hours.
91
+ attr_reader :hours
92
+
93
+ # @return [Float] the cost of this shift for the company
94
+ attr_reader :cost
95
+
96
+ # This is true if this shift is dropped.
97
+ # This is false if it's been picked up or never was dropped.
98
+ # @return [true, false] whether this shift is pending pickup
99
+ def pending_pickup?
100
+ @is_pending_pickup
101
+ end
102
+
103
+ # If the shift is waiting for the manager to approve it.
104
+ # @return [true, false] whether this shift is pending manager approval
105
+ def pending_manager_approval?
106
+ @is_pending_manager_approval
107
+ end
108
+
109
+ # When a shift is swapped with someone, it waits for them to accept or deny.
110
+ # Until that happens, this is true.
111
+ # @return [true, false] is the shift is pending swap.
112
+ def pending_swap?
113
+ @is_pending_swap
114
+ end
115
+
116
+ # When the shift swap is approved, the manager needs to approve it.
117
+ # Until this happens, this is true.
118
+ # @return [true, false] is the shift is pending swap manager approval.
119
+ def pending_swap_manager_approval?
120
+ @is_pending_swap_manager_approval
121
+ end
122
+
123
+ # I wonder what happens when this is true. Hopefully it doesn't break.
124
+ # @return [true, false] to hide the end time of the shift.
125
+ def hide_end_times?
126
+ @hide_end_times
127
+ end
128
+
129
+ # @return [JSON] the raw data returned by ShiftNote
130
+ attr_reader :raw
131
+
132
+ # Releases the shift to an employee.
133
+ # @param [Integer] the employee ID of the employee to drop this to, leave blank for everyone.
134
+ # @param [String] the reason for dropping this shift.
135
+ def release(employee = 0, reason = nil)
136
+ data = {
137
+ "ShiftID" => shift_id,
138
+ "ScheduleID" => schedule_id,
139
+ "EmployeeId" => employee,
140
+ "Reason" => reason,
141
+ "X-Requested-With" => "XMLHttpRequest"
142
+ }
143
+ end
144
+ end
@@ -1,4 +1,5 @@
1
- class ShiftNote::EmployeeOverviewViewModel
1
+ # An employee.
2
+ class ShiftNote::User < ShiftNote::Employee
2
3
  def initialize(data)
3
4
  @raw = data
4
5
  @id = data['EmployeeId']
@@ -8,8 +9,8 @@ class ShiftNote::EmployeeOverviewViewModel
8
9
  'mobile' => data['MobilePhone']
9
10
  }
10
11
  @email = data['Email']
11
- @birthday = Time.parse(data['BirthDate'])
12
- @schedule_this_week = ShiftNote::ScheduleThisWeekViewModel.new(data['ScheduleThisWeekViewModel'])
12
+ @birthday = data['BirthDate'] ? Time.parse(data['BirthDate']) : nil
13
+ @schedule_this_week = ShiftNote::ScheduleThisWeek.new(data['ScheduleThisWeekViewModel'])
13
14
  @trade_shifts = data['TradeShifts']
14
15
  @trade_shifts_current_day = data['TradeShiftsCurrentDay']
15
16
  @positions = data['ThisEmployeePositions']
@@ -36,12 +37,33 @@ class ShiftNote::EmployeeOverviewViewModel
36
37
  attr_reader :birthday
37
38
 
38
39
  # The user's "Schedule This Week," consider the return type for info
39
- # @return [ShiftNote::ScheduleThisWeekViewModel]
40
+ # @return [ScheduleThisWeek]
40
41
  attr_reader :schedule_this_week
41
- attr_reader :raw
42
- attr_reader :trade_shifts
43
- attr_reader :trade_shifts_current_day
42
+
43
+ # Trading (or swapping) means the employee can trade shifts with other employees.
44
+ # @return [true, false] if this employee can trade (or swap) shifts at all.
45
+ def trade_shifts?
46
+ @trade_shifts
47
+ end
48
+
49
+ alias_method :can_swap?, :trade_shifts?
50
+
51
+ # Assuming trade_shifts? is true, this method returns if the user can trade shifts
52
+ # for the given day. Where I work, this is false. Should've thought of that first, Billy.
53
+ # @return [true, false] if this employee can trade shifts for today's shifts.
54
+ def trade_shifts_current_day?
55
+ @trade_shifts_current_day
56
+ end
57
+
58
+ # @return [Array<String>] the positions this employee is working.
44
59
  attr_reader :positions
60
+
61
+ # @return [Time, nil] the employee's last day, nil if they don't have one (good)
45
62
  attr_reader :last_day
63
+
64
+ # @return [Time, nil] the employee's hire date, nil if they don't have one set
46
65
  attr_reader :hire_day
66
+
67
+ # @return [JSON] the raw data returned by ShiftNote
68
+ attr_reader :raw
47
69
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shiftnote
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chew
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-17 00:00:00.000000000 Z
11
+ date: 2019-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -61,20 +61,30 @@ files:
61
61
  - lib/shiftnote.rb
62
62
  - lib/shiftnote/days_of_week_shift.rb
63
63
  - lib/shiftnote/days_of_week_shifts.rb
64
- - lib/shiftnote/employee_overview_view_model.rb
64
+ - lib/shiftnote/employee.rb
65
65
  - lib/shiftnote/errors.rb
66
- - lib/shiftnote/schedule_this_week_view_model.rb
67
- - lib/shiftnote/shift_view_model.rb
66
+ - lib/shiftnote/schedule_this_week.rb
67
+ - lib/shiftnote/shift.rb
68
+ - lib/shiftnote/user.rb
68
69
  homepage: https://github.com/Chew/ShiftNoteRB
69
70
  licenses:
70
71
  - MIT
71
72
  metadata:
72
73
  bug_tracker_uri: https://github.com/Chew/ShiftNoteRB/issues
73
74
  changelog_uri: https://github.com/Chew/ShiftNoteRB/releases
75
+ documentation_uri: https://rubydocs.chew.pro/docs/shiftnote
74
76
  homepage_uri: http://github.com/Chew/ShiftNoteRB
75
77
  source_code_uri: http://github.com/Chew/ShiftNoteRB
76
78
  wiki_uri: http://github.com/Chew/ShiftNoteRB/wiki
77
- post_install_message:
79
+ post_install_message: |-
80
+ Hello! Thanks for using this ShiftNote gem. 0.2.0 introduced some major changes.
81
+ If this is your first version you can just ignore this message.
82
+
83
+ * ShiftNote#employee has been replaced with ShiftNote#user.
84
+ * "ViewModel" has been removed from all class names.
85
+
86
+ Check the documentation server (https://rubydocs.chew.pro/docs/shiftnote) and the GitHub Release (https://github.com/Chew/ShiftNoteRB/releases/tag/0.2.0) to see the full changes!
87
+ Enjoy :)
78
88
  rdoc_options: []
79
89
  require_paths:
80
90
  - lib
@@ -1,19 +0,0 @@
1
- class ShiftNote::ScheduleThisWeekViewModel
2
- def initialize(data)
3
- @raw = data
4
- @start_date = Time.parse(data['StartDate'])
5
- @end_date = Time.parse(data['EndDate'])
6
- @hours = data['Hours']
7
- @cost = data['Cost']
8
- @shifts = data['Shifts']
9
- @schedule = ShiftNote::DaysOfWeekShifts.new(data['DaysOfWeekShifts'])
10
- end
11
-
12
- attr_reader :start_date
13
- attr_reader :end_date
14
- attr_reader :hours
15
- attr_reader :cost
16
- attr_reader :shifts
17
- attr_reader :schedule
18
- attr_reader :raw
19
- end
@@ -1,60 +0,0 @@
1
- class ShiftNote::ShiftViewModel
2
- def initialize(data)
3
- @raw = data
4
- @schedule_id = data['ScheduleId']
5
- @schedule_name = data['ScheduleName']
6
- @schedule_status_id = data['ScheduleStatusId']
7
- @shift_id = data['ShiftId']
8
- @employee_id = data['EmployeeId']
9
- @employee = data['Employee']
10
- @shift_date = Time.parse(data['ShiftDate'])
11
- @time_in = Time.parse(data['TimeIn'])
12
- @time_out = Time.parse(data['TimeOut'])
13
- @position = data['Position']
14
- @position_color = data['PositionColor']
15
- @internal_location = data['InternalLocation']
16
- @open = data['Open']
17
- @close = data['Close']
18
- @on_call = data['OnCall']
19
- @volume = data['Volume']
20
- @note = data['Note']
21
- @hours = data['Hours']
22
- @cost = data['Cost']
23
- @is_pending_pickup = data['IsPendingPickUp']
24
- @is_pending_manager_approval = data['IsPendingManagerApproval']
25
- @is_pending_swap = data['IsPendingSwap']
26
- @is_pending_swap_manager_approval = data['IsPendingSwapManagerApproval']
27
- @hide_end_times = data['HideEndTimes']
28
- end
29
-
30
- attr_reader :schedule_id
31
- attr_reader :schedule_name
32
- attr_reader :schedule_status_id
33
- attr_reader :shift_id
34
- attr_reader :employee_id
35
- attr_reader :employee
36
- attr_reader :shift_date
37
- attr_reader :time_in
38
- attr_reader :time_out
39
- attr_reader :position
40
- attr_reader :position_color
41
- attr_reader :internal_location
42
- attr_reader :open
43
- attr_reader :close
44
- attr_reader :on_call
45
- attr_reader :volume
46
- attr_reader :note
47
- attr_reader :hours
48
- attr_reader :cost
49
- attr_reader :is_pending_pickup
50
- attr_reader :is_pending_manager_approval
51
- attr_reader :is_pending_swap
52
- attr_reader :is_pending_swap_manager_approval
53
- attr_reader :hide_end_times
54
- attr_reader :raw
55
-
56
- # Releases the shift
57
- def release(employee = 0)
58
-
59
- end
60
- end