Class: Reserve

Inherits:
ApplicationRecord
  • Object
show all
Includes:
Statesman::Adapters::ActiveRecordQueries
Defined in:
app/models/reserve.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#force_retainingObject

Returns the value of attribute force_retaining.



69
70
71
# File 'app/models/reserve.rb', line 69

def force_retaining
  @force_retaining
end

#item_identifierObject

Returns the value of attribute item_identifier.



69
70
71
# File 'app/models/reserve.rb', line 69

def item_identifier
  @item_identifier
end

#user_numberObject

Returns the value of attribute user_number.



69
70
71
# File 'app/models/reserve.rb', line 69

def user_number
  @user_number
end

Class Method Details

.expireObject



258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
# File 'app/models/reserve.rb', line 258

def self.expire
  Reserve.transaction do
    will_expire_retained(Time.zone.now.beginning_of_day).readonly(false).map{|r| r.transition_to!(:expired)}
    will_expire_pending(Time.zone.now.beginning_of_day).readonly(false).map{|r| r.transition_to!(:expired)}

    # キューに登録した時点では本文は作られないので
    # 予約の連絡をすませたかどうかを識別できるようにしなければならない
    # reserve.send_message('expired')
    User.find_each do |user|
      unless user.reserves.not_sent_expiration_notice_to_patron.empty?
        user.send_message('reservation_expired_for_patron', manifestations: user.reserves.not_sent_expiration_notice_to_patron.collect(&:manifestation))
      end
    end
    unless Reserve.not_sent_expiration_notice_to_library.empty?
      Reserve.send_message_to_library('expired', manifestations: Reserve.not_sent_expiration_notice_to_library.collect(&:manifestation))
    end
  end
# rescue
#  logger.info "#{Time.zone.now} expiring reservations failed!"
end

.send_message_to_library(status, options = {}) ⇒ Object



233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'app/models/reserve.rb', line 233

def self.send_message_to_library(status, options = {})
  sender = User.find(1) # TODO: システムからのメッセージの発信者
  case status
  when 'expired'
    message_template_to_library = MessageTemplate.localized_template('reservation_expired_for_library', sender.profile.locale)
    request = MessageRequest.new
    request.assign_attributes(sender: sender, receiver: sender, message_template: message_template_to_library)
    request.save_message_body(manifestations: options[:manifestations])
    not_sent_expiration_notice_to_library.readonly(false).each do |reserve|
      reserve.expiration_notice_to_library = true
      reserve.save(validate: false)
    end
  # when 'canceled'
  #  message_template_to_library = MessageTemplate.localized_template('reservation_canceled_for_library', sender.locale)
  #  request = MessageRequest.new
  #  request.assign_attributes({sender: sender, receiver: sender, message_template: message_template_to_library})
  #  request.save_message_body(manifestations: self.not_sent_expiration_notice_to_library.collect(&:manifestation))
  #  self.not_sent_cancel_notice_to_library.each do |reserve|
  #    reserve.update_attribute(:expiration_notice_to_library, true)
  #  end
  else
    raise 'status not defined'
  end
end

Instance Method Details

#available_for_reservation?Boolean

Returns:

  • (Boolean)


285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
# File 'app/models/reserve.rb', line 285

def available_for_reservation?
  if manifestation
    if checked_out_now?
      errors[:base] << I18n.t('reserve.this_manifestation_is_already_checked_out')
    end

    if manifestation.is_reserved_by?(user)
      errors[:base] << I18n.t('reserve.this_manifestation_is_already_reserved')
    end
    if user.try(:reached_reservation_limit?, manifestation)
      errors[:base] << I18n.t('reserve.excessed_reservation_limit')
    end

    expired_period = manifestation.try(:reservation_expired_period, user)
    if expired_period.nil?
      errors[:base] << I18n.t('reserve.this_patron_cannot_reserve')
    end
  end
end

#check_expired_atObject



150
151
152
153
154
155
156
157
158
# File 'app/models/reserve.rb', line 150

def check_expired_at
  if canceled_at.blank? && expired_at?
    if !completed?
      if expired_at.beginning_of_day < Time.zone.now
        errors[:base] << I18n.t('reserve.invalid_date')
      end
    end
  end
end

#checked_out_now?Boolean

Returns:

  • (Boolean)


279
280
281
282
283
# File 'app/models/reserve.rb', line 279

def checked_out_now?
  if user && manifestation
    true if !(user.checkouts.not_returned.pluck(:item_id) & manifestation.items.pluck('items.id')).empty?
  end
end

#completed?Boolean

Returns:

  • (Boolean)


305
306
307
# File 'app/models/reserve.rb', line 305

def completed?
  ['canceled', 'expired', 'completed'].include?(current_state)
end

#next_reservationObject



160
161
162
163
164
# File 'app/models/reserve.rb', line 160

def next_reservation
  if item
    Reserve.waiting.where(manifestation_id: item.manifestation.id).readonly(false).first
  end
end

#retained?Boolean

Returns:

  • (Boolean)


309
310
311
312
# File 'app/models/reserve.rb', line 309

def retained?
  return true if current_state == 'retained'
  false
end

#retained_by_other_user?Boolean

Returns:

  • (Boolean)


137
138
139
140
141
142
143
144
# File 'app/models/reserve.rb', line 137

def retained_by_other_user?
  return nil if force_retaining == '1'
  if item && !retained?
    if Reserve.retained.where(item_id: item.id).count > 0
      errors[:base] << I18n.t('reserve.attempt_to_update_retained_reservation')
    end
  end
end

#send_message(sender = nil) ⇒ Object



166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
# File 'app/models/reserve.rb', line 166

def send_message(sender = nil)
  sender ||= User.find(1) # TODO: システムからのメッセージの発信者
  Reserve.transaction do
    case current_state
    when 'requested'
      message_template_to_patron = MessageTemplate.localized_template('reservation_accepted_for_patron', user.profile.locale)
      request = MessageRequest.new
      request.assign_attributes(sender: sender, receiver: user, message_template: message_template_to_patron)
      request.save_message_body(manifestations: Array[manifestation], user: user)
      request.transition_to!(:sent) # 受付時は即時送信
      message_template_to_library = MessageTemplate.localized_template('reservation_accepted_for_library', user.profile.locale)
      request = MessageRequest.new
      request.assign_attributes(sender: sender, receiver: sender, message_template: message_template_to_library)
      request.save_message_body(manifestations: Array[manifestation], user: user)
      request.transition_to!(:sent) # 受付時は即時送信
    when 'canceled'
      message_template_to_patron = MessageTemplate.localized_template('reservation_canceled_for_patron', user.profile.locale)
      request = MessageRequest.new
      request.assign_attributes(sender: sender, receiver: user, message_template: message_template_to_patron)
      request.save_message_body(manifestations: Array[manifestation], user: user)
      request.transition_to!(:sent) # キャンセル時は即時送信
      message_template_to_library = MessageTemplate.localized_template('reservation_canceled_for_library', user.profile.locale)
      request = MessageRequest.new
      request.assign_attributes(sender: sender, receiver: sender, message_template: message_template_to_library)
      request.save_message_body(manifestations: Array[manifestation], user: user)
      request.transition_to!(:sent) # キャンセル時は即時送信
    when 'expired'
      message_template_to_patron = MessageTemplate.localized_template('reservation_expired_for_patron', user.profile.locale)
      request = MessageRequest.new
      request.assign_attributes(sender: sender, receiver: user, message_template: message_template_to_patron)
      request.save_message_body(manifestations: Array[manifestation], user: user)
      request.transition_to!(:sent)
      reload
      update_attribute(:expiration_notice_to_patron, true)
      message_template_to_library = MessageTemplate.localized_template('reservation_expired_for_library', sender.profile.locale)
      request = MessageRequest.new
      request.assign_attributes(sender: sender, receiver: sender, message_template: message_template_to_library)
      request.save_message_body(manifestations: Array[manifestation], user: sender)
      request.transition_to!(:sent)
    when 'retained'
      message_template_for_patron = MessageTemplate.localized_template('item_received_for_patron', user.profile.locale)
      request = MessageRequest.new
      request.assign_attributes(sender: sender, receiver: user, message_template: message_template_for_patron)
      request.save_message_body(manifestations: Array[item.manifestation], user: user)
      request.transition_to!(:sent)
      message_template_for_library = MessageTemplate.localized_template('item_received_for_library', user.profile.locale)
      request = MessageRequest.new
      request.assign_attributes(sender: sender, receiver: sender, message_template: message_template_for_library)
      request.save_message_body(manifestations: Array[item.manifestation], user: user)
      request.transition_to!(:sent)
    when 'postponed'
      message_template_for_patron = MessageTemplate.localized_template('reservation_postponed_for_patron', user.profile.locale)
      request = MessageRequest.new
      request.assign_attributes(sender: sender, receiver: user, message_template: message_template_for_patron)
      request.save_message_body(manifestations: Array[manifestation], user: user)
      request.transition_to!(:sent)
      message_template_for_library = MessageTemplate.localized_template('reservation_postponed_for_library', user.profile.locale)
      request = MessageRequest.new
      request.assign_attributes(sender: sender, receiver: sender, message_template: message_template_for_library)
      request.save_message_body(manifestations: Array[manifestation], user: user)
      request.transition_to!(:sent)
    else
      raise 'status not defined'
    end
  end
end

#set_itemObject



115
116
117
118
119
120
121
# File 'app/models/reserve.rb', line 115

def set_item
  identifier = item_identifier.to_s.strip
  if identifier.present?
    item = Item.where(item_identifier: identifier).first
    self.item = item
  end
end

#set_manifestationObject



111
112
113
# File 'app/models/reserve.rb', line 111

def set_manifestation
  self.manifestation = item.manifestation if item
end

#set_request_statusObject



146
147
148
# File 'app/models/reserve.rb', line 146

def set_request_status
  self.request_status_type = RequestStatusType.where(name: 'In Process').first
end

#set_userObject



123
124
125
126
127
128
# File 'app/models/reserve.rb', line 123

def set_user
  number = user_number.to_s.strip
  if number.present?
    self.user = Profile.where(user_number: number).first.try(:user)
  end
end

#state_machineObject



73
74
75
# File 'app/models/reserve.rb', line 73

def state_machine
  ReserveStateMachine.new(self, transition_class: ReserveTransition)
end

#valid_item?Boolean

Returns:

  • (Boolean)


130
131
132
133
134
135
# File 'app/models/reserve.rb', line 130

def valid_item?
  if item_identifier.present?
    item = Item.where(item_identifier: item_identifier).first
    errors[:base] << I18n.t('reserve.invalid_item') unless item
  end
end