Class: Reserve

Inherits:
ActiveRecord::Base
  • 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.



64
65
66
# File 'app/models/reserve.rb', line 64

def force_retaining
  @force_retaining
end

#item_identifierObject

Returns the value of attribute item_identifier.



64
65
66
# File 'app/models/reserve.rb', line 64

def item_identifier
  @item_identifier
end

#user_numberObject

Returns the value of attribute user_number.



64
65
66
# File 'app/models/reserve.rb', line 64

def user_number
  @user_number
end

Class Method Details

.expireObject



253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
# File 'app/models/reserve.rb', line 253

def self.expire
  Reserve.transaction do
    self.will_expire_retained(Time.zone.now.beginning_of_day).readonly(false).map{|r| r.transition_to!(:expired)}
    self.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



228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
# File 'app/models/reserve.rb', line 228

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])
    self.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



280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
# File 'app/models/reserve.rb', line 280

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



145
146
147
148
149
150
151
152
153
# File 'app/models/reserve.rb', line 145

def check_expired_at
  if canceled_at.blank? and 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



274
275
276
277
278
# File 'app/models/reserve.rb', line 274

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

#completed?Boolean



300
301
302
# File 'app/models/reserve.rb', line 300

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

#next_reservationObject



155
156
157
158
159
# File 'app/models/reserve.rb', line 155

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

#retained?Boolean



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

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

#retained_by_other_user?Boolean



132
133
134
135
136
137
138
139
# File 'app/models/reserve.rb', line 132

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

#send_message(sender = nil) ⇒ Object



161
162
163
164
165
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
# File 'app/models/reserve.rb', line 161

def send_message(sender = nil)
  sender = User.find(1) unless sender # 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
      self.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



110
111
112
113
114
115
116
# File 'app/models/reserve.rb', line 110

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



106
107
108
# File 'app/models/reserve.rb', line 106

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

#set_request_statusObject



141
142
143
# File 'app/models/reserve.rb', line 141

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

#set_userObject



118
119
120
121
122
123
# File 'app/models/reserve.rb', line 118

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



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

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

#valid_item?Boolean



125
126
127
128
129
130
# File 'app/models/reserve.rb', line 125

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