enju_trunk_ill 0.1
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.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +40 -0
- data/app/assets/javascripts/enju_trunk_ill/application.js +15 -0
- data/app/assets/stylesheets/enju_trunk_ill/application.css +13 -0
- data/app/controllers/enju_trunk_ill/application_controller.rb +4 -0
- data/app/controllers/inter_library_loans_controller.rb +310 -0
- data/app/helpers/enju_trunk_ill/application_helper.rb +4 -0
- data/app/models/inter_library_loan.rb +250 -0
- data/app/views/inter_library_loans/_accept_item.html.erb +5 -0
- data/app/views/inter_library_loans/accept.html.erb +57 -0
- data/app/views/inter_library_loans/edit.html.erb +92 -0
- data/app/views/inter_library_loans/export_loan_lists.html.erb +50 -0
- data/app/views/inter_library_loans/index.atom.builder +11 -0
- data/app/views/inter_library_loans/index.html.erb +116 -0
- data/app/views/inter_library_loans/index.rss.builder +31 -0
- data/app/views/inter_library_loans/loan_list.tlf +1 -0
- data/app/views/inter_library_loans/move_item.tlf +1 -0
- data/app/views/inter_library_loans/new.html.erb +52 -0
- data/app/views/inter_library_loans/pickup.html.erb +35 -0
- data/app/views/inter_library_loans/show.html.erb +61 -0
- data/app/views/layouts/enju_trunk_ill/application.html.erb +14 -0
- data/config/routes.rb +2 -0
- data/lib/enju_trunk_ill.rb +4 -0
- data/lib/enju_trunk_ill/engine.rb +5 -0
- data/lib/enju_trunk_ill/version.rb +3 -0
- data/lib/tasks/enju_trunk_ill_tasks.rake +4 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/enju_trunk_ill_test.rb +7 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +15 -0
- metadata +172 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2012 YOURNAME
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'EnjuTrunkIll'
|
18
|
+
rdoc.options << '--line-numbers'
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
24
|
+
load 'rails/tasks/engine.rake'
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
Bundler::GemHelper.install_tasks
|
29
|
+
|
30
|
+
require 'rake/testtask'
|
31
|
+
|
32
|
+
Rake::TestTask.new(:test) do |t|
|
33
|
+
t.libs << 'lib'
|
34
|
+
t.libs << 'test'
|
35
|
+
t.pattern = 'test/**/*_test.rb'
|
36
|
+
t.verbose = false
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
task :default => :test
|
@@ -0,0 +1,15 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// the compiled file.
|
9
|
+
//
|
10
|
+
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
|
11
|
+
// GO AFTER THE REQUIRES BELOW.
|
12
|
+
//
|
13
|
+
//= require jquery
|
14
|
+
//= require jquery_ujs
|
15
|
+
//= require_tree .
|
@@ -0,0 +1,13 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
|
+
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
+
*
|
11
|
+
*= require_self
|
12
|
+
*= require_tree .
|
13
|
+
*/
|
@@ -0,0 +1,310 @@
|
|
1
|
+
class InterLibraryLoansController < ApplicationController
|
2
|
+
before_filter :check_client_ip_address
|
3
|
+
load_and_authorize_resource
|
4
|
+
before_filter :get_item
|
5
|
+
before_filter :store_page, :only => :index
|
6
|
+
cache_sweeper :page_sweeper, :only => [:create, :update, :destroy]
|
7
|
+
|
8
|
+
# GET /inter_library_loans
|
9
|
+
# GET /inter_library_loans.json
|
10
|
+
def index
|
11
|
+
@from_library = @to_library = Library.real.all
|
12
|
+
@reasons = InterLibraryLoan.reasons
|
13
|
+
@selected_from_library = @selected_to_library = Library.real.all.inject([]){|ids, library| ids << library.id}
|
14
|
+
@selected_reason = InterLibraryLoan.reasons.inject([]){|ids, reason| ids << reason[1]}
|
15
|
+
if params[:commit]
|
16
|
+
@selected_from_library = params[:from_library] ? params[:from_library].inject([]){|ids, id| ids << id.to_i} : []
|
17
|
+
@selected_to_library = params[:to_library] ? params[:to_library].inject([]){|ids, id| ids << id.to_i} : []
|
18
|
+
@selected_reason = params[:reason] ? params[:reason].inject([]){|ids, id| ids << id.to_i} : []
|
19
|
+
end
|
20
|
+
from_library = @selected_from_library
|
21
|
+
to_library = @selected_to_library
|
22
|
+
reason = @selected_reason
|
23
|
+
# check conditions
|
24
|
+
flash[:notice] = t('item_list.no_list_condition') if @selected_from_library.blank? or @selected_to_library.blank? or @selected_reason.blank?
|
25
|
+
|
26
|
+
# query
|
27
|
+
query = params[:query].to_s.strip
|
28
|
+
@query = query.dup
|
29
|
+
query = "#{query}*" if query.size == 1
|
30
|
+
|
31
|
+
page = params[:page] || 1
|
32
|
+
if @item
|
33
|
+
if @query.present?
|
34
|
+
@inter_library_loans = @item.inter_library_loans.search do
|
35
|
+
fulltext query
|
36
|
+
with(:from_library_id, from_library_id)
|
37
|
+
with(:to_library_id, to_library)
|
38
|
+
with(:reason, reason)
|
39
|
+
paginate :page => page.to_i, :per_page => InterLibraryLoan.default_per_page
|
40
|
+
end.results
|
41
|
+
else
|
42
|
+
@inter_library_loans = @item.inter_library_loans.where(:from_library_id => @selected_from_library, :to_library_id => @selected_to_library, :reason => @selected_reason).page(page)
|
43
|
+
end
|
44
|
+
else
|
45
|
+
if @query.present?
|
46
|
+
@inter_library_loans = InterLibraryLoan.search do
|
47
|
+
fulltext query
|
48
|
+
with(:from_library_id, from_library)
|
49
|
+
with(:to_library_id, to_library)
|
50
|
+
with(:reason, reason)
|
51
|
+
#with(:reason).equal_to 2
|
52
|
+
paginate :page => page.to_i, :per_page => InterLibraryLoan.default_per_page
|
53
|
+
end.results
|
54
|
+
else
|
55
|
+
@inter_library_loans = InterLibraryLoan.where(:from_library_id => @selected_from_library, :to_library_id => @selected_to_library, :reason => @selected_reason).page(page)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
respond_to do |format|
|
59
|
+
format.html # index.html.erb
|
60
|
+
format.json { render :json => @inter_library_loans }
|
61
|
+
format.rss { render :layout => false }
|
62
|
+
format.atom
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# GET /inter_library_loans/1
|
67
|
+
# GET /inter_library_loans/1.json
|
68
|
+
def show
|
69
|
+
@inter_library_loan = InterLibraryLoan.find(params[:id])
|
70
|
+
|
71
|
+
respond_to do |format|
|
72
|
+
format.html # show.html.erb
|
73
|
+
format.json { render :json => @inter_library_loan }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# GET /inter_library_loans/new
|
78
|
+
# GET /inter_library_loans/new.json
|
79
|
+
def new
|
80
|
+
@inter_library_loan = InterLibraryLoan.new
|
81
|
+
@current_library = current_user.library
|
82
|
+
@libraries = LibraryGroup.first.real_libraries
|
83
|
+
@reasons = InterLibraryLoan.reasons
|
84
|
+
# @libraries.reject!{|library| library == current_user.library}
|
85
|
+
|
86
|
+
respond_to do |format|
|
87
|
+
format.html # new.html.erb
|
88
|
+
format.json { render :json => @inter_library_loan }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# GET /inter_library_loans/1/edit
|
93
|
+
def edit
|
94
|
+
@inter_library_loan = InterLibraryLoan.find(params[:id])
|
95
|
+
@libraries = LibraryGroup.first.real_libraries
|
96
|
+
@reasons = InterLibraryLoan.reasons
|
97
|
+
# @libraries.reject!{|library| library == current_user.library}
|
98
|
+
end
|
99
|
+
|
100
|
+
# POST /inter_library_loans
|
101
|
+
# POST /inter_library_loans.json
|
102
|
+
def create
|
103
|
+
@inter_library_loan = InterLibraryLoan.new(params[:inter_library_loan])
|
104
|
+
item = Item.where(:item_identifier => params[:inter_library_loan][:item_identifier]).first
|
105
|
+
@inter_library_loan.item = item
|
106
|
+
|
107
|
+
respond_to do |format|
|
108
|
+
if @inter_library_loan.save
|
109
|
+
@inter_library_loan.sm_request!
|
110
|
+
flash[:notice] = t('controller.successfully_created', :model => t('activerecord.models.inter_library_loan'))
|
111
|
+
format.html { redirect_to(@inter_library_loan) }
|
112
|
+
format.json { render :json => @inter_library_loan, :status => :created, :location => @inter_library_loan }
|
113
|
+
else
|
114
|
+
@current_library = @inter_library_loan.from_library
|
115
|
+
@libraries = LibraryGroup.first.real_libraries
|
116
|
+
@reasons = InterLibraryLoan.reasons
|
117
|
+
# @libraries.reject!{|library| library == current_user.library}
|
118
|
+
format.html { render :action => "new" }
|
119
|
+
format.json { render :json => @inter_library_loan.errors, :status => :unprocessable_entity }
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
# PUT /inter_library_loans/1
|
125
|
+
# PUT /inter_library_loans/1.json
|
126
|
+
def update
|
127
|
+
@inter_library_loan = InterLibraryLoan.find(params[:id])
|
128
|
+
@item = @inter_library_loan.item
|
129
|
+
|
130
|
+
respond_to do |format|
|
131
|
+
if @inter_library_loan.update_attributes(params[:inter_library_loan])
|
132
|
+
flash[:notice] = t('controller.successfully_updated', :model => t('activerecord.models.inter_library_loan'))
|
133
|
+
format.html { redirect_to(@inter_library_loan) }
|
134
|
+
format.json { head :no_content }
|
135
|
+
else
|
136
|
+
@inter_library_loan.item = @item
|
137
|
+
@libraries = LibraryGroup.first.real_libraries
|
138
|
+
@reasons = InterLibraryLoan.reasons
|
139
|
+
# @libraries.reject!{|library| library == current_user.library}
|
140
|
+
format.html { render :action => "edit" }
|
141
|
+
format.json { render :json => @inter_library_loan.errors, :status => :unprocessable_entity }
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# DELETE /inter_library_loans/1
|
147
|
+
# DELETE /inter_library_loans/1.json
|
148
|
+
def destroy
|
149
|
+
@inter_library_loan = InterLibraryLoan.find(params[:id])
|
150
|
+
@inter_library_loan.destroy
|
151
|
+
|
152
|
+
respond_to do |format|
|
153
|
+
if @item
|
154
|
+
format.html { redirect_to item_inter_library_loans_url(@item) }
|
155
|
+
format.json { head :no_content }
|
156
|
+
else
|
157
|
+
format.html { redirect_to(inter_library_loans_url) }
|
158
|
+
format.json { head :no_content }
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def export_loan_lists
|
164
|
+
@libraries = Library.real.all
|
165
|
+
@selected_library = params[:library] || [current_user.library.id]
|
166
|
+
end
|
167
|
+
|
168
|
+
def get_loan_lists
|
169
|
+
@selected_library = params[:library] || []
|
170
|
+
|
171
|
+
# check checked
|
172
|
+
if @selected_library.empty?
|
173
|
+
flash[:message] = t('inter_library_loan.no_library')
|
174
|
+
@libraries = Library.real.all
|
175
|
+
render :export_loan_lists; return false
|
176
|
+
end
|
177
|
+
# check date_exist?
|
178
|
+
@loans = InterLibraryLoan.loan_items
|
179
|
+
if @loans.blank?
|
180
|
+
flash[:message] = t('inter_library_loan.no_loan')
|
181
|
+
@libraries = Library.real.all
|
182
|
+
render :export_loan_lists; return false
|
183
|
+
end
|
184
|
+
|
185
|
+
begin
|
186
|
+
report = InterLibraryLoan.get_loan_lists(@loans, @selected_library)
|
187
|
+
if report.page
|
188
|
+
send_data report.generate, :filename => "loan_lists.pdf", :type => 'application/pdf', :disposition => 'attachment'
|
189
|
+
logger.error "created report: #{Time.now}"
|
190
|
+
return true
|
191
|
+
else
|
192
|
+
flash[:message] = t('inter_library_loan.no_loan')
|
193
|
+
@libraries = Library.real.all
|
194
|
+
render :export_loan_lists; return false
|
195
|
+
end
|
196
|
+
rescue Exception => e
|
197
|
+
logger.error "failed #{e}"
|
198
|
+
@libraries = Library.real.all
|
199
|
+
render :export_loan_lists; return false
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
def pickup_item
|
204
|
+
library = current_user.library
|
205
|
+
item_identifier = params[:item_identifier_tmp].strip
|
206
|
+
@pickup_item = Item.where(:item_identifier => item_identifier).first
|
207
|
+
|
208
|
+
# check item_exist?
|
209
|
+
unless @pickup_item
|
210
|
+
flash[:message] = t('inter_library_loan.no_item')
|
211
|
+
render :pickup and return false
|
212
|
+
end
|
213
|
+
# check loan_item_exist?
|
214
|
+
@loan = InterLibraryLoan.in_process.find(:first, :conditions => ['item_id = ?', @pickup_item.id])
|
215
|
+
unless @loan
|
216
|
+
flash[:message] = t('inter_library_loan.no_loan')
|
217
|
+
render :pickup and return false
|
218
|
+
end
|
219
|
+
|
220
|
+
begin
|
221
|
+
# pick up item
|
222
|
+
@pickup_item.circulation_status = CirculationStatus.find(:first, :conditions => ['name = ?', "In Transit Between Library Locations"])
|
223
|
+
@pickup_item.save
|
224
|
+
@loan.shipped_at = Time.zone.now
|
225
|
+
@loan.sm_ship!
|
226
|
+
@loan.save
|
227
|
+
|
228
|
+
report = InterLibraryLoan.get_pickup_item_file(@pickup_item, @loan)
|
229
|
+
# check dir
|
230
|
+
out_dir = "#{Rails.root}/private/system/inter_library_loans/"
|
231
|
+
FileUtils.mkdir_p(out_dir) unless FileTest.exist?(out_dir)
|
232
|
+
# make pdf
|
233
|
+
pdf = "loan_item.pdf"
|
234
|
+
report.generate_file(out_dir + pdf)
|
235
|
+
|
236
|
+
flash[:message] = t('inter_library_loan.successfully_pickup', :item_identifier => item_identifier)
|
237
|
+
flash[:path] = out_dir + pdf
|
238
|
+
|
239
|
+
logger.error "created report: #{Time.now}"
|
240
|
+
render :pickup
|
241
|
+
rescue Exception => e
|
242
|
+
logger.error "failed #{e}"
|
243
|
+
flash[:message] = t('inter_library_loan.failed_pickup')
|
244
|
+
render :pickup and return false
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
def accept
|
249
|
+
end
|
250
|
+
|
251
|
+
def accept_item
|
252
|
+
return nil unless request.xhr?
|
253
|
+
begin
|
254
|
+
library = current_user.library
|
255
|
+
item_identifier = params[:item_identifier]
|
256
|
+
@item = Item.where(:item_identifier => item_identifier).first
|
257
|
+
@loan = InterLibraryLoan.in_process.find(:first, :conditions => ['item_id = ? AND received_at IS NULL', @item.id]) if @item
|
258
|
+
if @item.nil? || @loan.nil?
|
259
|
+
render :json => {:error => t('inter_library_loan.no_loan')}
|
260
|
+
return false
|
261
|
+
end
|
262
|
+
unless @loan.to_library == current_user.library
|
263
|
+
render :json => {:error => t('inter_library_loan.wrong_library')}
|
264
|
+
return false
|
265
|
+
end
|
266
|
+
InterLibraryLoan.transaction do
|
267
|
+
@reserve = Reserve.waiting.find(:first, :conditions => ["item_id = ? AND state = ? AND receipt_library_id = ?", @item.id, "in_process", library.id])
|
268
|
+
if @reserve
|
269
|
+
@reserve.sm_retain!
|
270
|
+
else
|
271
|
+
@item.checkin!
|
272
|
+
@item.set_next_reservation
|
273
|
+
end
|
274
|
+
@loan.received_at = Time.zone.now
|
275
|
+
@loan.sm_receive!
|
276
|
+
@loan.save
|
277
|
+
end
|
278
|
+
if @item
|
279
|
+
message = t('inter_library_loan.successfully_accept', :item_identifier => item_identifier)
|
280
|
+
html = render_to_string :partial => "accept_item"
|
281
|
+
render :json => {:success => 1, :html => html, :message => message}
|
282
|
+
end
|
283
|
+
rescue Exception => e
|
284
|
+
logger.error "Failed to accept item: #{e}"
|
285
|
+
render :json => {:error => t('inter_library_loan.failed_accept')}
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def download_file
|
290
|
+
#TODO fullpath -> filename
|
291
|
+
path = params[:path]
|
292
|
+
if File.exist?(path)
|
293
|
+
#send_file path, :type => "application/pdf", :disposition => 'attachment'
|
294
|
+
send_file path, :type => "application/pdf", :disposition => 'inline'
|
295
|
+
else
|
296
|
+
logger.warn "not exist file. path:#{path}"
|
297
|
+
render :pickup and return
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
def output
|
302
|
+
@loan = InterLibraryLoan.find(params[:id])
|
303
|
+
if @loan.nil?
|
304
|
+
flash[:message] = t('inter_library_loan.no_loan')
|
305
|
+
return false
|
306
|
+
end
|
307
|
+
file = InterLibraryLoan.get_loan_report(@loan)
|
308
|
+
send_data file, :filename => "loan.pdf", :type => 'application/pdf', :disposition => 'attachment'
|
309
|
+
end
|
310
|
+
end
|
@@ -0,0 +1,250 @@
|
|
1
|
+
class InterLibraryLoan < ActiveRecord::Base
|
2
|
+
attr_accessible :item_id, :from_library_id, :to_library_id, :requested_at, :reason
|
3
|
+
|
4
|
+
self.extend ItemsHelper
|
5
|
+
default_scope :order => "created_at DESC"
|
6
|
+
scope :completed, where(:state => 'return_received')
|
7
|
+
#scope :processing, lambda {|item, to_library| {:conditions => ['item_id = ? AND to_library_id = ? AND state != ?', item.id, wto_library.id, 'return_received']}}
|
8
|
+
scope :processing, lambda {|item, to_library| {:conditions => ['item_id = ? AND to_library_id = ?', item.id, to_library.id]}}
|
9
|
+
scope :in_process, :order => "created_at ASC"
|
10
|
+
|
11
|
+
belongs_to :item, :validate => true
|
12
|
+
#belongs_to :reserve
|
13
|
+
belongs_to :to_library, :foreign_key => 'to_library_id', :class_name => 'Library', :validate => true
|
14
|
+
belongs_to :from_library, :foreign_key => 'from_library_id', :class_name => 'Library', :validate => true
|
15
|
+
|
16
|
+
validates_presence_of :item_id, :from_library_id, :to_library_id
|
17
|
+
validates_associated :item, :from_library, :to_library
|
18
|
+
|
19
|
+
paginates_per 10
|
20
|
+
|
21
|
+
attr_accessor :item_identifier
|
22
|
+
|
23
|
+
state_machine :initial => :pending do
|
24
|
+
before_transition :pending => :requested, :do => :do_request
|
25
|
+
before_transition :requested => :shipped, :do => :ship
|
26
|
+
before_transition :shipped => :received, :do => :receive
|
27
|
+
before_transition :received => :return_shipped, :do => :return_ship
|
28
|
+
before_transition :return_shipped => :return_received, :do => :return_receive
|
29
|
+
|
30
|
+
event :sm_request do
|
31
|
+
transition :pending => :requested
|
32
|
+
end
|
33
|
+
|
34
|
+
event :sm_ship do
|
35
|
+
transition :requested => :shipped
|
36
|
+
end
|
37
|
+
|
38
|
+
event :sm_receive do
|
39
|
+
transition :shipped => :received
|
40
|
+
end
|
41
|
+
|
42
|
+
event :sm_return_ship do
|
43
|
+
transition :received => :return_shipped
|
44
|
+
end
|
45
|
+
|
46
|
+
event :sm_return_receive do
|
47
|
+
transition :return_shipped => :return_received
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
searchable do
|
52
|
+
text :item_identifier do
|
53
|
+
self.item.item_identifier if self.item
|
54
|
+
end
|
55
|
+
text :title do
|
56
|
+
titles = []
|
57
|
+
titles << self.item.manifestation.original_title if self.item
|
58
|
+
titles << self.item.manifestation.title_transcription if self.item
|
59
|
+
end
|
60
|
+
string :state
|
61
|
+
integer :item_id
|
62
|
+
integer :to_library_id
|
63
|
+
integer :from_library_id
|
64
|
+
integer :reason
|
65
|
+
time :requested_at
|
66
|
+
time :shipped_at
|
67
|
+
time :received_at
|
68
|
+
time :return_shipped_at
|
69
|
+
time :return_received_at
|
70
|
+
time :created_at
|
71
|
+
time :updated_at
|
72
|
+
end
|
73
|
+
|
74
|
+
def do_request
|
75
|
+
InterLibraryLoan.transaction do
|
76
|
+
self.item.update_attribute(:circulation_status, CirculationStatus.where(:name => 'Recalled').first)
|
77
|
+
self.update_attribute(:requested_at, Time.zone.now)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def ship
|
82
|
+
InterLibraryLoan.transaction do
|
83
|
+
self.item.update_attributes({:circulation_status => CirculationStatus.where(:name => 'In Transit Between Library Locations').first})
|
84
|
+
self.update_attributes({:shipped_at => Time.zone.now})
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def receive
|
89
|
+
InterLibraryLoan.transaction do
|
90
|
+
# self.item.update_attributes({:circulation_status => CirculationStatus.where(:name => 'In Process').first})
|
91
|
+
self.update_attributes({:received_at => Time.zone.now})
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def return_ship
|
96
|
+
InterLibraryLoan.transaction do
|
97
|
+
self.item.update_attributes({:circulation_status => CirculationStatus.where(:name => 'In Transit Between Library Locations').first})
|
98
|
+
self.update_attributes({:return_shipped_at => Time.zone.now})
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def return_receive
|
103
|
+
InterLibraryLoan.transaction do
|
104
|
+
# TODO: 'Waiting To Be Reshelved'
|
105
|
+
self.item.update_attributes({:circulation_status => CirculationStatus.where(:name => 'Available On Shelf').first})
|
106
|
+
self.update_attributes({:return_received_at => Time.zone.now})
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def request_for_reserve(item, to_library)
|
111
|
+
self.update_attributes(:item_id => item.id, :to_library_id => to_library.id, :from_library_id => item.shelf.library.id, :requested_at => Time.zone.now, :reason => 1)
|
112
|
+
self.sm_request!
|
113
|
+
end
|
114
|
+
|
115
|
+
def request_for_checkin(item, from_library)
|
116
|
+
self.update_attributes(:item_id => item.id, :from_library_id => from_library.id, :to_library_id => item.shelf.library.id, :requested_at => Time.zone.now, :reason => 2)
|
117
|
+
self.sm_request!
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.loan_items
|
121
|
+
loans = []
|
122
|
+
item_ids = InterLibraryLoan.select(:item_id).where(:received_at => nil).inject([]){|ids, loan| ids << loan.item_id}.uniq
|
123
|
+
item_ids.each do |id|
|
124
|
+
loans << InterLibraryLoan.where(:item_id => id, :received_at => nil).order("reason DESC, created_at ASC").first
|
125
|
+
end
|
126
|
+
return loans
|
127
|
+
end
|
128
|
+
|
129
|
+
def self.reasons
|
130
|
+
reasons = [[I18n.t('inter_library_loan.checkout'), 1],
|
131
|
+
[I18n.t('inter_library_loan.checkin'), 2]]
|
132
|
+
return reasons
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.get_loan_report(inter_library_loan)
|
136
|
+
@loan = inter_library_loan
|
137
|
+
begin
|
138
|
+
report = ThinReports::Report.new :layout => "#{Rails.root.to_s}/app/views/inter_library_loans/move_item"
|
139
|
+
report.start_new_page
|
140
|
+
report.page.item(:export_date).value(Time.now)
|
141
|
+
report.page.item(:title).value(@loan.item.manifestation.original_title)
|
142
|
+
report.page.item(:call_number).value(call_numberformat(@loan.item))
|
143
|
+
report.page.item(:from_library).value(@loan.from_library.display_name.localize)
|
144
|
+
report.page.item(:to_library).value(@loan.to_library.display_name.localize)
|
145
|
+
report.page.item(:reason).value(I18n.t('inter_library_loan.checkout')) if @loan.reason == 1
|
146
|
+
report.page.item(:reason).value(I18n.t('inter_library_loan.checkin')) if @loan.reason == 2
|
147
|
+
reserve = Reserve.waiting.where(:item_id => @loan.item_id, :receipt_library_id => @loan.to_library_id, :state => 'in_process').first
|
148
|
+
if reserve
|
149
|
+
report.page.item(:user_title).show
|
150
|
+
report.page.item(:reserve_user).value(reserve.user.username) if reserve.user
|
151
|
+
report.page.item(:expire_date_title).show
|
152
|
+
report.page.item(:reserve_expire_date).value(reserve.expired_at)
|
153
|
+
end
|
154
|
+
logger.error "created report: #{Time.now}"
|
155
|
+
return report.generate
|
156
|
+
rescue Exception => e
|
157
|
+
logger.error "failed #{e}"
|
158
|
+
return false
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def self.get_loan_lists(loans, library_ids)
|
163
|
+
report = ThinReports::Report.new :layout => "#{Rails.root.to_s}/app/views/inter_library_loans/loan_list"
|
164
|
+
|
165
|
+
report.events.on :page_create do |e|
|
166
|
+
e.page.item(:page).value(e.page.no)
|
167
|
+
end
|
168
|
+
report.events.on :generate do |e|
|
169
|
+
e.pages.each do |page|
|
170
|
+
page.item(:total).value(e.report.page_count)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
library_ids.each do |library_id|
|
175
|
+
library = Library.find(library_id) rescue nil
|
176
|
+
to_libraries = InterLibraryLoan.where(:from_library_id => library_id).inject([]){|libraries, data| libraries << Library.find(data.to_library_id)}
|
177
|
+
next if to_libraries.blank?
|
178
|
+
to_libraries.uniq.each do |to_library|
|
179
|
+
report.start_new_page
|
180
|
+
report.page.item(:date).value(Time.now)
|
181
|
+
report.page.item(:library).value(library.display_name.localize)
|
182
|
+
report.page.item(:library_move_to).value(to_library.display_name.localize)
|
183
|
+
loans.each do |loan|
|
184
|
+
if loan.from_library_id == library.id && loan.to_library_id == to_library.id && loan.reason == 1
|
185
|
+
report.page.list(:list).add_row do |row|
|
186
|
+
row.item(:reason).value(I18n.t('inter_library_loan.checkout'))
|
187
|
+
row.item(:item_identifier).value(loan.item.item_identifier)
|
188
|
+
row.item(:shelf).value(loan.item.shelf.display_name) if loan.item.shelf
|
189
|
+
row.item(:call_number).value(call_numberformat(loan.item))
|
190
|
+
row.item(:title).value(loan.item.manifestation.original_title) if loan.item.manifestation
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
loans.each do |loan|
|
195
|
+
if loan.from_library_id == library.id && loan.to_library_id == to_library.id && loan.reason == 2
|
196
|
+
report.page.list(:list).add_row do |row|
|
197
|
+
row.item(:reason).value(I18n.t('inter_library_loan.checkin'))
|
198
|
+
row.item(:item_identifier).value(loan.item.item_identifier)
|
199
|
+
row.item(:shelf).value(loan.item.shelf.display_name) if loan.item.shelf
|
200
|
+
row.item(:call_number).value(call_numberformat(loan.item))
|
201
|
+
row.item(:title).value(loan.item.manifestation.original_title) if loan.item.manifestation
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
logger.error report.page
|
208
|
+
return report
|
209
|
+
end
|
210
|
+
|
211
|
+
def self.get_pickup_item_file(pickup_item, loan)
|
212
|
+
report = ThinReports::Report.new :layout => "#{Rails.root.to_s}/app/views/inter_library_loans/move_item"
|
213
|
+
report.start_new_page
|
214
|
+
report.page.item(:export_date).value(Time.now)
|
215
|
+
report.page.item(:title).value(pickup_item.manifestation.original_title)
|
216
|
+
report.page.item(:call_number).value(call_numberformat(pickup_item))
|
217
|
+
report.page.item(:from_library).value(loan.from_library.display_name.localize)
|
218
|
+
report.page.item(:to_library).value(loan.to_library.display_name.localize)
|
219
|
+
report.page.item(:reason).value(I18n.t('inter_library_loan.checkout')) if loan.reason == 1
|
220
|
+
report.page.item(:reason).value(I18n.t('inter_library_loan.checkin')) if loan.reason == 2
|
221
|
+
reserve = Reserve.waiting.where(:item_id => loan.item_id, :receipt_library_id => loan.to_library_id, :state => 'in_process').first
|
222
|
+
if reserve
|
223
|
+
report.page.item(:user_title).show
|
224
|
+
report.page.item(:reserve_user).value(reserve.user.username) if reserve.user
|
225
|
+
report.page.item(:expire_date_title).show
|
226
|
+
report.page.item(:reserve_expire_date).value(reserve.expired_at)
|
227
|
+
end
|
228
|
+
return report
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
# == Schema Information
|
233
|
+
#
|
234
|
+
# Table name: inter_library_loans
|
235
|
+
#
|
236
|
+
# id :integer not null, primary key
|
237
|
+
# item_id :integer not null
|
238
|
+
# to_library_id :integer not null
|
239
|
+
# requested_at :datetime
|
240
|
+
# shipped_at :datetime
|
241
|
+
# received_at :datetime
|
242
|
+
# return_shipped_at :datetime
|
243
|
+
# return_received_at :datetime
|
244
|
+
# deleted_at :datetime
|
245
|
+
# state :string(255)
|
246
|
+
# created_at :datetime
|
247
|
+
# updated_at :datetime
|
248
|
+
# from_library_id :integer not null
|
249
|
+
#
|
250
|
+
|