enju_circulation 0.3.8 → 0.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/checkins_controller.rb +2 -2
- data/app/models/checkin.rb +1 -1
- data/app/models/checkout.rb +2 -2
- data/app/models/checkout_stat_has_user.rb +1 -1
- data/app/models/concerns/enju_circulation/enju_item.rb +2 -0
- data/app/models/lending_policy.rb +3 -3
- data/app/models/manifestation_checkout_stat_transition.rb +1 -1
- data/app/models/manifestation_reserve_stat_transition.rb +1 -1
- data/app/models/reserve.rb +4 -4
- data/app/models/reserve_state_machine.rb +2 -3
- data/app/models/reserve_transition.rb +1 -1
- data/app/models/user_checkout_stat_transition.rb +1 -1
- data/app/models/user_group_has_checkout_type.rb +6 -6
- data/app/models/user_reserve_stat_transition.rb +1 -1
- data/lib/enju_circulation/version.rb +1 -1
- data/spec/controllers/checkins_controller_spec.rb +130 -8
- data/spec/controllers/withdraws_controller_spec.rb +26 -0
- data/spec/dummy/db/migrate/20200425072340_create_manifestation_custom_properties.rb +12 -0
- data/spec/dummy/db/migrate/20200425072349_create_item_custom_properties.rb +12 -0
- data/spec/dummy/db/migrate/20200425074758_create_manifestation_custom_values.rb +12 -0
- data/spec/dummy/db/migrate/20200425074822_create_item_custom_values.rb +12 -0
- data/spec/dummy/db/schema.rb +43 -10
- data/spec/fixtures/checkins.yml +1 -1
- data/spec/fixtures/checkout_stat_has_users.yml +1 -1
- data/spec/fixtures/checkouts.yml +2 -2
- data/spec/fixtures/lending_policies.yml +3 -3
- data/spec/fixtures/reserve_transitions.yml +1 -1
- data/spec/fixtures/reserves.yml +3 -3
- data/spec/fixtures/user_group_has_checkout_types.yml +6 -6
- data/spec/models/checkin_spec.rb +1 -1
- data/spec/models/checkout_spec.rb +2 -2
- data/spec/models/checkout_stat_has_user_spec.rb +1 -1
- data/spec/models/lending_policy_spec.rb +3 -3
- data/spec/models/reserve_spec.rb +3 -3
- data/spec/models/user_group_has_checkout_type_spec.rb +6 -6
- metadata +383 -347
- data/spec/dummy/db/migrate/20191219122214_create_custom_properties.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8acae0635971690b1966d9ec8c5c3f5c608528c624feb76f201ce0cc90b473e4
|
4
|
+
data.tar.gz: 60815d7876aee8efe0aba781e33cc919c2ff5af9830761dc1aff778398522bea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec55abc5f36563dbba595a2984564c1f8f45911acf3fc24fdcddba3c4f0b0b3d66981081638a4ff7d768122ba510196e49d2546af9b4522b928d39d9aad6b1fe
|
7
|
+
data.tar.gz: fc0727906cdea3789852dbee7c97684b600f4ca0b5aa143a8c75caff5c5f0f104a3ec6d284bb92c76a3d99121c974261341924a4d3450e94162c0dcde6fd5b9c
|
@@ -77,12 +77,12 @@ class CheckinsController < ApplicationController
|
|
77
77
|
end
|
78
78
|
flash[:message] << message if message
|
79
79
|
format.html { redirect_to checkins_url(basket_id: @checkin.basket_id) }
|
80
|
-
format.json { render json: @checkin, status: :created, location: @checkin }
|
80
|
+
format.json { render json: {result: @checkin, messages: flash[:message]}, status: :created, location: @checkin }
|
81
81
|
format.js { redirect_to checkins_url(basket_id: @basket.id, format: :js) }
|
82
82
|
else
|
83
83
|
@checkins = @basket.checkins.page(1)
|
84
84
|
format.html { render action: "new" }
|
85
|
-
format.json { render json: @checkin.errors, status: :unprocessable_entity }
|
85
|
+
format.json { render json: {messages: @checkin.errors}, status: :unprocessable_entity }
|
86
86
|
format.js { render action: "index" }
|
87
87
|
end
|
88
88
|
end
|
data/app/models/checkin.rb
CHANGED
data/app/models/checkout.rb
CHANGED
@@ -174,8 +174,8 @@ end
|
|
174
174
|
# librarian_id :integer
|
175
175
|
# basket_id :integer
|
176
176
|
# due_date :datetime
|
177
|
-
# checkout_renewal_count :integer default(0), not null
|
178
|
-
# lock_version :integer default(0), not null
|
177
|
+
# checkout_renewal_count :integer default("0"), not null
|
178
|
+
# lock_version :integer default("0"), not null
|
179
179
|
# created_at :datetime
|
180
180
|
# updated_at :datetime
|
181
181
|
# shelf_id :integer
|
@@ -17,7 +17,7 @@ end
|
|
17
17
|
# id :integer not null, primary key
|
18
18
|
# user_checkout_stat_id :integer not null
|
19
19
|
# user_id :integer not null
|
20
|
-
# checkouts_count :integer default(0), not null
|
20
|
+
# checkouts_count :integer default("0"), not null
|
21
21
|
# created_at :datetime
|
22
22
|
# updated_at :datetime
|
23
23
|
#
|
@@ -19,10 +19,10 @@ end
|
|
19
19
|
# id :integer not null, primary key
|
20
20
|
# item_id :integer not null
|
21
21
|
# user_group_id :integer not null
|
22
|
-
# loan_period :integer default(0), not null
|
22
|
+
# loan_period :integer default("0"), not null
|
23
23
|
# fixed_due_date :datetime
|
24
|
-
# renewal :integer default(0), not null
|
25
|
-
# fine :integer default(0), not null
|
24
|
+
# renewal :integer default("0"), not null
|
25
|
+
# fine :integer default("0"), not null
|
26
26
|
# note :text
|
27
27
|
# position :integer
|
28
28
|
# created_at :datetime
|
data/app/models/reserve.rb
CHANGED
@@ -2,7 +2,7 @@ class Reserve < ApplicationRecord
|
|
2
2
|
include Statesman::Adapters::ActiveRecordQueries
|
3
3
|
scope :hold, -> { where('item_id IS NOT NULL') }
|
4
4
|
scope :not_hold, -> { where(item_id: nil) }
|
5
|
-
scope :waiting, -> {not_in_state(:completed, :expired
|
5
|
+
scope :waiting, -> {not_in_state(:completed, :expired).where('canceled_at IS NULL AND (expired_at > ? OR expired_at IS NULL)', Time.zone.now).order('reserves.id DESC')}
|
6
6
|
scope :retained, -> {in_state(:retained).where('retained_at IS NOT NULL')}
|
7
7
|
scope :completed, -> {in_state(:completed).where('checked_out_at IS NOT NULL')}
|
8
8
|
scope :canceled, -> {in_state(:canceled).where('canceled_at IS NOT NULL')}
|
@@ -404,10 +404,10 @@ end
|
|
404
404
|
# canceled_at :datetime
|
405
405
|
# expired_at :datetime
|
406
406
|
# deleted_at :datetime
|
407
|
-
# expiration_notice_to_patron :boolean default(
|
408
|
-
# expiration_notice_to_library :boolean default(
|
407
|
+
# expiration_notice_to_patron :boolean default("0")
|
408
|
+
# expiration_notice_to_library :boolean default("0")
|
409
409
|
# pickup_location_id :integer
|
410
410
|
# retained_at :datetime
|
411
411
|
# postponed_at :datetime
|
412
|
-
# lock_version :integer default(0), not null
|
412
|
+
# lock_version :integer default("0"), not null
|
413
413
|
#
|
@@ -14,16 +14,15 @@ class ReserveStateMachine
|
|
14
14
|
transition from: :requested, to: [:retained, :canceled, :expired, :completed]
|
15
15
|
|
16
16
|
after_transition(to: :requested) do |reserve|
|
17
|
-
reserve.update(request_status_type: RequestStatusType.
|
17
|
+
reserve.update(request_status_type: RequestStatusType.find_by(name: 'In Process'), item_id: nil, retained_at: nil)
|
18
18
|
end
|
19
19
|
|
20
20
|
after_transition(to: :retained) do |reserve|
|
21
21
|
# TODO: 「取り置き中」の状態を正しく表す
|
22
|
-
reserve.update(request_status_type: RequestStatusType.
|
22
|
+
reserve.update(request_status_type: RequestStatusType.find_by(name: 'In Process'), retained_at: Time.zone.now)
|
23
23
|
Reserve.transaction do
|
24
24
|
if reserve.item
|
25
25
|
other_reserves = reserve.item.reserves.waiting
|
26
|
-
other_reserves += reserve.item.reserves.in_state(:retained)
|
27
26
|
other_reserves.each{|r|
|
28
27
|
if r != reserve
|
29
28
|
r.transition_to!(:postponed)
|
@@ -71,12 +71,12 @@ end
|
|
71
71
|
# id :integer not null, primary key
|
72
72
|
# user_group_id :integer not null
|
73
73
|
# checkout_type_id :integer not null
|
74
|
-
# checkout_limit :integer default(0), not null
|
75
|
-
# checkout_period :integer default(0), not null
|
76
|
-
# checkout_renewal_limit :integer default(0), not null
|
77
|
-
# reservation_limit :integer default(0), not null
|
78
|
-
# reservation_expired_period :integer default(7), not null
|
79
|
-
# set_due_date_before_closing_day :boolean default(
|
74
|
+
# checkout_limit :integer default("0"), not null
|
75
|
+
# checkout_period :integer default("0"), not null
|
76
|
+
# checkout_renewal_limit :integer default("0"), not null
|
77
|
+
# reservation_limit :integer default("0"), not null
|
78
|
+
# reservation_expired_period :integer default("7"), not null
|
79
|
+
# set_due_date_before_closing_day :boolean default("0"), not null
|
80
80
|
# fixed_due_date :datetime
|
81
81
|
# note :text
|
82
82
|
# position :integer
|
@@ -201,14 +201,14 @@ describe CheckinsController do
|
|
201
201
|
it 'redirects to the created checkin' do
|
202
202
|
post :create, params: { checkin: @attrs, basket_id: 9 }
|
203
203
|
response.should redirect_to(checkins_url(basket_id: assigns(:checkin).basket_id))
|
204
|
-
assigns(:checkin).item.circulation_status.name.should eq 'Available On Shelf'
|
204
|
+
assigns(:checkin).checkout.item.circulation_status.name.should eq 'Available On Shelf'
|
205
205
|
end
|
206
206
|
|
207
207
|
it 'should checkin the overdue item' do
|
208
208
|
post :create, params: { checkin: { item_identifier: '00014' }, basket_id: 9 }
|
209
209
|
response.should redirect_to(checkins_url(basket_id: assigns(:checkin).basket_id))
|
210
210
|
assigns(:checkin).checkout.should be_valid
|
211
|
-
assigns(:checkin).item.circulation_status.name.should eq 'Available On Shelf'
|
211
|
+
assigns(:checkin).checkout.item.circulation_status.name.should eq 'Available On Shelf'
|
212
212
|
end
|
213
213
|
end
|
214
214
|
end
|
@@ -249,14 +249,14 @@ describe CheckinsController do
|
|
249
249
|
it 'should show notification when it is reserved' do
|
250
250
|
post :create, params: { checkin: { item_identifier: '00008' }, basket_id: 9 }
|
251
251
|
flash[:message].to_s.index(I18n.t('item.this_item_is_reserved')).should be_truthy
|
252
|
-
assigns(:checkin).item.should be_retained
|
253
|
-
assigns(:checkin).item.circulation_status.name.should eq 'Available On Shelf'
|
252
|
+
assigns(:checkin).checkout.item.should be_retained
|
253
|
+
assigns(:checkin).checkout.item.circulation_status.name.should eq 'Available On Shelf'
|
254
254
|
response.should redirect_to(checkins_url(basket_id: assigns(:basket).id))
|
255
255
|
end
|
256
256
|
|
257
257
|
it 'should show notification when an item includes supplements' do
|
258
258
|
post :create, params: { checkin: { item_identifier: '00004' }, basket_id: 9 }
|
259
|
-
assigns(:checkin).item.circulation_status.name.should eq 'Available On Shelf'
|
259
|
+
assigns(:checkin).checkout.item.circulation_status.name.should eq 'Available On Shelf'
|
260
260
|
flash[:message].to_s.index(I18n.t('item.this_item_include_supplement')).should be_truthy
|
261
261
|
response.should redirect_to(checkins_url(basket_id: assigns(:basket).id))
|
262
262
|
end
|
@@ -306,6 +306,128 @@ describe CheckinsController do
|
|
306
306
|
end
|
307
307
|
end
|
308
308
|
|
309
|
+
describe 'POST create (json format)' do
|
310
|
+
before(:each) do
|
311
|
+
@attrs = { item_identifier: '00003' }
|
312
|
+
@invalid_attrs = { item_identifier: 'invalid' }
|
313
|
+
request.env["HTTP_ACCEPT"] = 'application/json'
|
314
|
+
end
|
315
|
+
|
316
|
+
describe 'When logged in as Administrator' do
|
317
|
+
login_fixture_admin
|
318
|
+
|
319
|
+
describe 'with valid params' do
|
320
|
+
it 'assigns a newly created checkin as @checkin' do
|
321
|
+
post :create, params: { checkin: @attrs }
|
322
|
+
assigns(:checkin).should be_nil
|
323
|
+
end
|
324
|
+
|
325
|
+
it 'should not create checkin without basket_id' do
|
326
|
+
post :create, params: { checkin: @attrs }
|
327
|
+
json = JSON.parse(response.body)
|
328
|
+
expect(json['error']).to eq('forbidden')
|
329
|
+
end
|
330
|
+
|
331
|
+
describe 'When basket_id is specified' do
|
332
|
+
it 'redirects to the created checkin' do
|
333
|
+
post :create, params: { checkin: @attrs, basket_id: 9 }
|
334
|
+
expect(response).to have_http_status(:created)
|
335
|
+
json = JSON.parse(response.body)
|
336
|
+
expect(json['result']['basket_id']).to eq(9)
|
337
|
+
assigns(:checkin).checkout.item.circulation_status.name.should eq 'Available On Shelf'
|
338
|
+
end
|
339
|
+
|
340
|
+
it 'should checkin the overdue item' do
|
341
|
+
post :create, params: { checkin: { item_identifier: '00014' }, basket_id: 9 }
|
342
|
+
expect(response).to have_http_status(:created)
|
343
|
+
assigns(:checkin).checkout.should be_valid
|
344
|
+
assigns(:checkin).checkout.item.circulation_status.name.should eq 'Available On Shelf'
|
345
|
+
end
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
describe 'with invalid params' do
|
350
|
+
it 'assigns a newly created but unsaved checkin as @checkin' do
|
351
|
+
post :create, params: { checkin: @invalid_attrs }
|
352
|
+
assigns(:checkin).should be_nil
|
353
|
+
end
|
354
|
+
|
355
|
+
it 'should be forbidden' do
|
356
|
+
post :create, params: { checkin: @invalid_attrs }
|
357
|
+
json = JSON.parse(response.body)
|
358
|
+
expect(json['error']).to eq('forbidden')
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
it 'should not create checkin without item_id' do
|
363
|
+
post :create, params: { checkin: { item_identifier: nil }, basket_id: 9 }
|
364
|
+
assigns(:checkin).should_not be_valid
|
365
|
+
expect(response).to have_http_status(:unprocessable_entity)
|
366
|
+
json = JSON.parse(response.body)
|
367
|
+
expect(json['messages']['base']).to match_array([I18n.t('checkin.item_not_found')])
|
368
|
+
expect(json['messages']['item_id']).to match_array([I18n.t('errors.messages.blank')])
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
describe 'When logged in as Librarian' do
|
373
|
+
login_fixture_librarian
|
374
|
+
|
375
|
+
describe 'with valid params' do
|
376
|
+
it 'assigns a newly created checkin as @checkin' do
|
377
|
+
post :create, params: { checkin: @attrs }
|
378
|
+
assigns(:checkin).should be_nil
|
379
|
+
end
|
380
|
+
|
381
|
+
it 'should not create checkin without basket_id' do
|
382
|
+
post :create, params: { checkin: @attrs }
|
383
|
+
json = JSON.parse(response.body)
|
384
|
+
expect(json['error']).to eq('forbidden')
|
385
|
+
end
|
386
|
+
|
387
|
+
it 'should show notification when it is reserved' do
|
388
|
+
post :create, params: { checkin: { item_identifier: '00008' }, basket_id: 9 }
|
389
|
+
flash[:message].to_s.index(I18n.t('item.this_item_is_reserved')).should be_truthy
|
390
|
+
assigns(:checkin).checkout.item.should be_retained
|
391
|
+
assigns(:checkin).checkout.item.circulation_status.name.should eq 'Available On Shelf'
|
392
|
+
expect(response).to have_http_status(:created)
|
393
|
+
end
|
394
|
+
|
395
|
+
it 'should show notification when an item includes supplements' do
|
396
|
+
post :create, params: { checkin: { item_identifier: '00004' }, basket_id: 9 }
|
397
|
+
assigns(:checkin).checkout.item.circulation_status.name.should eq 'Available On Shelf'
|
398
|
+
flash[:message].to_s.index(I18n.t('item.this_item_include_supplement')).should be_truthy
|
399
|
+
expect(response).to have_http_status(:created)
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
it "should show notice when other library's item is checked in" do
|
404
|
+
sign_in users(:librarian2)
|
405
|
+
post :create, params: { checkin: { item_identifier: '00009' }, basket_id: 9 }
|
406
|
+
assigns(:checkin).should be_valid
|
407
|
+
flash[:message].to_s.index(I18n.t('checkin.other_library_item')).should be_truthy
|
408
|
+
expect(response).to have_http_status(:created)
|
409
|
+
end
|
410
|
+
end
|
411
|
+
|
412
|
+
describe 'When not logged in' do
|
413
|
+
before(:each) do
|
414
|
+
@attrs = { item_identifier: '00003' }
|
415
|
+
@invalid_attrs = { item_identifier: 'invalid' }
|
416
|
+
end
|
417
|
+
|
418
|
+
describe 'with valid params' do
|
419
|
+
it 'assigns a newly created checkin as @checkin' do
|
420
|
+
post :create, params: { checkin: @attrs }
|
421
|
+
end
|
422
|
+
|
423
|
+
it 'should redirect to new session url' do
|
424
|
+
post :create, params: { checkin: @attrs }
|
425
|
+
expect(response).to have_http_status(:ok)
|
426
|
+
end
|
427
|
+
end
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
309
431
|
describe 'PUT update' do
|
310
432
|
before(:each) do
|
311
433
|
@checkin = checkins(:checkin_00001)
|
@@ -335,7 +457,7 @@ describe CheckinsController do
|
|
335
457
|
|
336
458
|
it "re-renders the 'edit' template" do
|
337
459
|
put :update, params: { id: @checkin.id, checkin: @invalid_attrs }
|
338
|
-
response.
|
460
|
+
expect(response).to be_successful
|
339
461
|
end
|
340
462
|
|
341
463
|
it 'should not update checkin without item_identifier' do
|
@@ -364,12 +486,12 @@ describe CheckinsController do
|
|
364
486
|
describe 'with invalid params' do
|
365
487
|
it 'assigns the checkin as @checkin' do
|
366
488
|
put :update, params: { id: @checkin.id, checkin: @invalid_attrs }
|
367
|
-
assigns(:checkin).
|
489
|
+
expect(assigns(:checkin)).not_to be_valid
|
368
490
|
end
|
369
491
|
|
370
492
|
it "re-renders the 'edit' template" do
|
371
493
|
put :update, params: { id: @checkin.id, checkin: @invalid_attrs }
|
372
|
-
response.
|
494
|
+
expect(response).to be_successful
|
373
495
|
end
|
374
496
|
end
|
375
497
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
describe WithdrawsController do
|
4
|
+
fixtures :all
|
5
|
+
let(:valid_attributes) do
|
6
|
+
FactoryBot.build(:withdraw).attributes.with_indifferent_access
|
7
|
+
end
|
8
|
+
let(:valid_create_attributes) do
|
9
|
+
{ basket_id: Basket.find(valid_attributes[:basket_id]).id,
|
10
|
+
withdraw: { item_identifier: Item.find(valid_attributes[:item_id]).item_identifier }}
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'POST create' do
|
14
|
+
describe 'When logged in as Administrator' do
|
15
|
+
login_fixture_admin
|
16
|
+
|
17
|
+
it 'should not withdraw a checked-out item' do
|
18
|
+
expect do
|
19
|
+
post :create, params: { basket_id: valid_create_attributes[:basket_id], withdraw: { item_identifier: reserves(:reserve_00014).item.item_identifier } }
|
20
|
+
end.to change(Withdraw, :count).by(0)
|
21
|
+
expect(assigns(:withdraw)).to be_a(Withdraw)
|
22
|
+
expect(response).to be_successful
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateManifestationCustomProperties < ActiveRecord::Migration[5.2]
|
2
|
+
def change
|
3
|
+
create_table :manifestation_custom_properties do |t|
|
4
|
+
t.string :name, null: false, comment: 'ラベル名', index: {unique: true}
|
5
|
+
t.text :display_name, null: false, comment: '表示名'
|
6
|
+
t.text :note, comment: '備考'
|
7
|
+
t.integer :position, default: 1, null: false
|
8
|
+
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateItemCustomProperties < ActiveRecord::Migration[5.2]
|
2
|
+
def change
|
3
|
+
create_table :item_custom_properties do |t|
|
4
|
+
t.string :name, null: false, comment: 'ラベル名', index: {unique: true}
|
5
|
+
t.text :display_name, null: false, comment: '表示名'
|
6
|
+
t.text :note, comment: '備考'
|
7
|
+
t.integer :position, default: 1, null: false
|
8
|
+
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|