enju_standalone_interface 0.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.
Files changed (114) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +35 -0
  4. data/app/assets/javascripts/enju_standalone_interface/application.js +15 -0
  5. data/app/assets/javascripts/enju_standalone_interface/batch_action.js +2 -0
  6. data/app/assets/stylesheets/enju_standalone_interface/application.css +13 -0
  7. data/app/assets/stylesheets/enju_standalone_interface/batch_action.css +4 -0
  8. data/app/controllers/application_controller.rb +4 -0
  9. data/app/controllers/batch_action_controller.rb +9 -0
  10. data/app/helpers/enju_standalone_interface/application_helper.rb +4 -0
  11. data/app/helpers/enju_standalone_interface/batch_action_helper.rb +4 -0
  12. data/app/views/enju_standalone_interface/batch_action/recept.html.erb +1 -0
  13. data/app/views/layouts/enju_standalone_interface/application.html.erb +14 -0
  14. data/config/routes.rb +3 -0
  15. data/lib/enju_standalone_interface.rb +233 -0
  16. data/lib/enju_standalone_interface/engine.rb +5 -0
  17. data/lib/enju_standalone_interface/version.rb +3 -0
  18. data/lib/tasks/enju_standalone_interface_tasks.rake +4 -0
  19. data/spec/controllers/enju_standalone_interface/batch_action_controller_spec.rb +21 -0
  20. data/spec/dummy/README.rdoc +261 -0
  21. data/spec/dummy/Rakefile +7 -0
  22. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  23. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  24. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  25. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  26. data/spec/dummy/app/helpers/users_helper.rb +36 -0
  27. data/spec/dummy/app/models/basket.rb +70 -0
  28. data/spec/dummy/app/models/carrier_type.rb +33 -0
  29. data/spec/dummy/app/models/checked_item.rb +177 -0
  30. data/spec/dummy/app/models/checkout.rb +307 -0
  31. data/spec/dummy/app/models/checkout_type.rb +33 -0
  32. data/spec/dummy/app/models/circulation_status.rb +23 -0
  33. data/spec/dummy/app/models/event.rb +124 -0
  34. data/spec/dummy/app/models/item.rb +1234 -0
  35. data/spec/dummy/app/models/item_has_use_restriction.rb +23 -0
  36. data/spec/dummy/app/models/lending_policy.rb +32 -0
  37. data/spec/dummy/app/models/library.rb +105 -0
  38. data/spec/dummy/app/models/library_group.rb +88 -0
  39. data/spec/dummy/app/models/manifestation.rb +698 -0
  40. data/spec/dummy/app/models/patron.rb +342 -0
  41. data/spec/dummy/app/models/role.rb +47 -0
  42. data/spec/dummy/app/models/shelf.rb +83 -0
  43. data/spec/dummy/app/models/use_restriction.rb +22 -0
  44. data/spec/dummy/app/models/user.rb +580 -0
  45. data/spec/dummy/app/models/user_group.rb +43 -0
  46. data/spec/dummy/app/models/user_group_has_checkout_type.rb +80 -0
  47. data/spec/dummy/app/models/user_has_role.rb +4 -0
  48. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  49. data/spec/dummy/config.ru +4 -0
  50. data/spec/dummy/config/application.rb +57 -0
  51. data/spec/dummy/config/boot.rb +10 -0
  52. data/spec/dummy/config/database.yml +25 -0
  53. data/spec/dummy/config/environment.rb +5 -0
  54. data/spec/dummy/config/environments/development.rb +37 -0
  55. data/spec/dummy/config/environments/production.rb +67 -0
  56. data/spec/dummy/config/environments/test.rb +37 -0
  57. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  58. data/spec/dummy/config/initializers/inflections.rb +15 -0
  59. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  60. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  61. data/spec/dummy/config/initializers/session_store.rb +8 -0
  62. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  63. data/spec/dummy/config/locales/en.yml +5 -0
  64. data/spec/dummy/config/locales/translation_en.yml +1724 -0
  65. data/spec/dummy/config/locales/validates_timeliness.en.yml +16 -0
  66. data/spec/dummy/config/routes.rb +4 -0
  67. data/spec/dummy/db/development.sqlite3 +0 -0
  68. data/spec/dummy/db/migrate/20120322223037_create_users.rb +71 -0
  69. data/spec/dummy/db/migrate/20120323053037_create_roles.rb +15 -0
  70. data/spec/dummy/db/migrate/20120323060718_create_user_has_roles.rb +10 -0
  71. data/spec/dummy/db/migrate/20120323062239_create_libraries.rb +37 -0
  72. data/spec/dummy/db/migrate/20120323063602_create_items.rb +33 -0
  73. data/spec/dummy/db/migrate/20120323064619_craete_circulation_statuses.rb +13 -0
  74. data/spec/dummy/db/migrate/20120323065157_craete_checkout_types.rb +13 -0
  75. data/spec/dummy/db/migrate/20120323070102_craete_shelves.rb +17 -0
  76. data/spec/dummy/db/migrate/20120323071616_craete_library_groups.rb +24 -0
  77. data/spec/dummy/db/migrate/20120323073022_craete_patrons.rb +72 -0
  78. data/spec/dummy/db/migrate/20120323141030_create_manifestations.rb +97 -0
  79. data/spec/dummy/db/migrate/20120323142330_create_carrier_types.rb +12 -0
  80. data/spec/dummy/db/migrate/20120324132708_create_baskets.rb +20 -0
  81. data/spec/dummy/db/migrate/20120324135409_checked_items.rb +16 -0
  82. data/spec/dummy/db/migrate/20120324141007_create_user_groups.rb +22 -0
  83. data/spec/dummy/db/migrate/20120324141950_create_user_group_has_checkout_type.rb +26 -0
  84. data/spec/dummy/db/migrate/20120324151951_create_lending_policies.rb +22 -0
  85. data/spec/dummy/db/migrate/20120324153756_create_use_restrictions.rb +15 -0
  86. data/spec/dummy/db/migrate/20120324154009_create_item_has_use_restrictions.rb +16 -0
  87. data/spec/dummy/db/migrate/20120324164815_create_checkouts.rb +26 -0
  88. data/spec/dummy/db/migrate/20120325160112_create_events.rb +23 -0
  89. data/spec/dummy/db/schema.rb +518 -0
  90. data/spec/dummy/db/test.sqlite3 +0 -0
  91. data/spec/dummy/lib/enju_leaf.rb +6 -0
  92. data/spec/dummy/lib/enju_leaf/master_model.rb +41 -0
  93. data/spec/dummy/lib/enju_leaf/url_validator.rb +10 -0
  94. data/spec/dummy/log/development.log +116 -0
  95. data/spec/dummy/log/test.log +17849 -0
  96. data/spec/dummy/public/404.html +26 -0
  97. data/spec/dummy/public/422.html +26 -0
  98. data/spec/dummy/public/500.html +25 -0
  99. data/spec/dummy/public/favicon.ico +0 -0
  100. data/spec/dummy/script/rails +6 -0
  101. data/spec/factories/item.rb +9 -0
  102. data/spec/factories/manifestation.rb +6 -0
  103. data/spec/factories/user.rb +27 -0
  104. data/spec/fixtures/carrier_types.yml +38 -0
  105. data/spec/fixtures/checkout_types.yml +34 -0
  106. data/spec/fixtures/circulation_statuses.yml +135 -0
  107. data/spec/fixtures/libraries.yml +40 -0
  108. data/spec/fixtures/roles.yml +21 -0
  109. data/spec/fixtures/shelves.yml +53 -0
  110. data/spec/fixtures/user_group_has_checkout_types.yml +14 -0
  111. data/spec/fixtures/user_groups.yml +7 -0
  112. data/spec/libs/enju_standalone_interface_spec.rb +133 -0
  113. data/spec/spec_helper.rb +36 -0
  114. metadata +358 -0
@@ -0,0 +1,33 @@
1
+ class CheckoutType < ActiveRecord::Base
2
+ include MasterModel
3
+ default_scope :order => "checkout_types.position"
4
+ scope :available_for_carrier_type, lambda {|carrier_type| {:include => :carrier_types, :conditions => ['carrier_types.name = ?', carrier_type.name], :order => 'carrier_types.position'}}
5
+ scope :available_for_user_group, lambda {|user_group| {:include => :user_groups, :conditions => ['user_groups.name = ?', user_group.name], :order => 'user_group.position'}}
6
+
7
+ has_many :user_group_has_checkout_types, :dependent => :destroy
8
+ has_many :user_groups, :through => :user_group_has_checkout_types
9
+ has_many :carrier_type_has_checkout_types, :dependent => :destroy
10
+ has_many :carrier_types, :through => :carrier_type_has_checkout_types
11
+ #has_many :item_has_checkout_types, :dependent => :destroy
12
+ #has_many :items, :through => :item_has_checkout_types
13
+ has_many :items
14
+ has_many :statistics
15
+
16
+ def self.per_page
17
+ 10
18
+ end
19
+ end
20
+
21
+ # == Schema Information
22
+ #
23
+ # Table name: checkout_types
24
+ #
25
+ # id :integer not null, primary key
26
+ # name :string(255) not null
27
+ # display_name :text
28
+ # note :text
29
+ # position :integer
30
+ # created_at :datetime
31
+ # updated_at :datetime
32
+ #
33
+
@@ -0,0 +1,23 @@
1
+ class CirculationStatus < ActiveRecord::Base
2
+ include MasterModel
3
+ default_scope :order => "position"
4
+ scope :available_for_checkout, where("name = 'Available On Shelf' OR name = 'Available For Pickup' OR name = 'On Loan'")
5
+ scope :available_for_retain, where("name = 'Available On Shelf'")
6
+ scope :not_found, where(["name IN (?)", ["Circulation Status Undefined", "Lost", "Missing", "Removed"]])
7
+ has_many :items
8
+ attr_protected :name
9
+ end
10
+
11
+ # == Schema Information
12
+ #
13
+ # Table name: circulation_statuses
14
+ #
15
+ # id :integer not null, primary key
16
+ # name :string(255) not null
17
+ # display_name :text
18
+ # note :text
19
+ # position :integer
20
+ # created_at :datetime
21
+ # updated_at :datetime
22
+ #
23
+
@@ -0,0 +1,124 @@
1
+ # -*- encoding: utf-8 -*-
2
+ class Event < ActiveRecord::Base
3
+ scope :closing_days, :include => :event_category, :conditions => ['event_categories.id = 2 OR event_categories.checkin_ng = ?', true]
4
+ scope :on, lambda {|datetime| where('start_at >= ? AND start_at < ?', datetime.beginning_of_day, datetime.tomorrow.beginning_of_day + 1)}
5
+ scope :past, lambda {|datetime| where('end_at <= ?', Time.zone.parse(datetime).beginning_of_day)}
6
+ scope :upcoming, lambda {|datetime| where('start_at >= ?', Time.zone.parse(datetime).beginning_of_day)}
7
+ scope :at, lambda {|library| where(:library_id => library.id)}
8
+
9
+ belongs_to :event_category, :validate => true
10
+ belongs_to :library, :validate => true
11
+ has_many :attachment_files, :as => :attachable
12
+ has_many :picture_files, :as => :picture_attachable
13
+ has_many :participates, :dependent => :destroy
14
+ has_many :patrons, :through => :participates
15
+ has_one :event_import_result
16
+
17
+ # has_event_calendar
18
+ =begin
19
+ searchable do
20
+ text :name, :note
21
+ integer :library_id
22
+ time :created_at
23
+ time :updated_at
24
+ time :start_at
25
+ time :end_at
26
+ end
27
+ =end
28
+
29
+ validates_presence_of :name, :library, :event_category
30
+ validates_associated :library, :event_category
31
+ validate :check_date
32
+ before_validation :set_date
33
+ before_validation :set_display_name, :on => :create
34
+
35
+ def self.per_page
36
+ 10
37
+ end
38
+
39
+ def set_date
40
+ if self.start_at.blank?
41
+ self.start_at = Time.zone.today.beginning_of_day
42
+ end
43
+ if self.end_at.blank?
44
+ self.end_at = Time.zone.today.end_of_day
45
+ end
46
+
47
+ set_all_day
48
+ end
49
+
50
+ def set_all_day
51
+ if self.all_day
52
+ self.start_at = self.start_at.beginning_of_day
53
+ self.end_at = self.end_at.end_of_day
54
+ end
55
+ end
56
+
57
+ def check_date
58
+ if self.start_at and self.end_at
59
+ if self.start_at >= self.end_at
60
+ errors.add(:start_at)
61
+ errors.add(:end_at)
62
+ end
63
+ end
64
+ end
65
+
66
+ def set_display_name
67
+ self.display_name = self.name if self.display_name.blank?
68
+ end
69
+
70
+ def self.get_event_list_tsv(events)
71
+ data = String.new
72
+ data << "\xEF\xBB\xBF".force_encoding("UTF-8") + "\n"
73
+ columns = [
74
+ [:library, 'activerecord.models.library'],
75
+ [:event, 'activerecord.attributes.event.name'],
76
+ [:note, 'activerecord.attributes.event.note'],
77
+ [:start_at, 'activerecord.attributes.event.start_at'],
78
+ [:end_at, 'activerecord.attributes.event.end_at'],
79
+ ]
80
+
81
+ # title column
82
+ row = columns.map {|column| I18n.t(column[1])}
83
+ data << '"'+row.join("\"\t\"")+"\"\n"
84
+
85
+ events.each do |event|
86
+ row = []
87
+ columns.each do |column|
88
+ case column[0]
89
+ when :library
90
+ row << event.library.display_name.gsub(/"/, '""')
91
+ when :event
92
+ row << event.display_name.localize.gsub(/"/, '""')
93
+ when :note
94
+ row << event.note.to_s.gsub(/"/, '""')
95
+ when :start_at
96
+ row << event.start_at.to_s.gsub(/"/, '""')
97
+ when :end_at
98
+ row << event.end_at.to_s.gsub(/"/, '""')
99
+ end
100
+ end
101
+ data << '"'+row.join("\"\t\"")+"\"\n"
102
+ end
103
+ return data
104
+ end
105
+ end
106
+
107
+ # == Schema Information
108
+ #
109
+ # Table name: events
110
+ #
111
+ # id :integer not null, primary key
112
+ # library_id :integer default(1), not null
113
+ # event_category_id :integer default(1), not null
114
+ # name :string(255)
115
+ # note :text
116
+ # start_at :datetime
117
+ # end_at :datetime
118
+ # all_day :boolean default(FALSE), not null
119
+ # deleted_at :datetime
120
+ # created_at :datetime
121
+ # updated_at :datetime
122
+ # display_name :text
123
+ #
124
+
@@ -0,0 +1,1234 @@
1
+ # -*- encoding: utf-8 -*-
2
+ class Item < ActiveRecord::Base
3
+ scope :for_checkout, where('item_identifier IS NOT NULL')
4
+ scope :not_for_checkout, where(:item_identifier => nil)
5
+ scope :on_shelf, where('shelf_id != 1')
6
+ scope :on_web, where(:shelf_id => 1)
7
+ scope :recent, where(['items.created_at >= ?', Time.zone.now.months_ago(1)])
8
+ scope :for_retain_from_own, lambda{|library| where('shelf_id IN (?)', library.excludescope_shelf_ids).order('created_at ASC')}
9
+ scope :for_retain_from_others, lambda{|library| where('shelf_id NOT IN (?)', library.excludescope_shelf_ids).order('created_at ASC')}
10
+ has_one :exemplify
11
+ has_one :manifestation, :through => :exemplify
12
+ has_many :checkouts
13
+ has_many :reserves
14
+ has_many :reserved_patrons, :through => :reserves, :class_name => 'Patron'
15
+ has_many :owns
16
+ has_many :patrons, :through => :owns
17
+ belongs_to :shelf, :counter_cache => true #, :validate => true
18
+ delegate :display_name, :to => :shelf, :prefix => true
19
+ has_many :checked_items, :dependent => :destroy
20
+ has_many :baskets, :through => :checked_items
21
+ belongs_to :circulation_status, :validate => true
22
+ belongs_to :bookstore, :validate => true
23
+ has_many :donates
24
+ has_many :donors, :through => :donates, :source => :patron
25
+ has_one :item_has_use_restriction, :dependent => :destroy
26
+ has_one :use_restriction, :through => :item_has_use_restriction
27
+ has_many :reserves
28
+ has_many :inter_library_loans, :dependent => :destroy
29
+ belongs_to :required_role, :class_name => 'Role', :foreign_key => 'required_role_id', :validate => true
30
+ belongs_to :checkout_type
31
+ has_many :inventories, :dependent => :destroy
32
+ has_many :inventory_files, :through => :inventories
33
+ has_many :lending_policies, :dependent => :destroy
34
+ has_many :answer_has_items, :dependent => :destroy
35
+ has_many :answers, :through => :answer_has_items
36
+ has_one :resource_import_result
37
+ has_many :libcheck_tmp_items
38
+ has_many :expenses
39
+
40
+ #validates_associated :circulation_status, :shelf, :bookstore, :checkout_type
41
+ validates_presence_of :circulation_status, :checkout_type
42
+ validates :item_identifier, :allow_blank => true, :uniqueness => true, :format => {:with => /\A[0-9A-Za-z_]+\Z/}
43
+ validates :url, :url => true, :allow_blank => true, :length => {:maximum => 255}
44
+ #validates_date :acquired_at, :allow_blank => true
45
+ before_validation :set_circulation_status, :on => :create
46
+ before_save :set_use_restriction, :check_remove_item
47
+ #after_save :check_price
48
+
49
+ #enju_union_catalog
50
+ #has_paper_trail
51
+ #normalize_attributes :item_identifier
52
+ =begin
53
+ searchable do
54
+ text :item_identifier, :note, :title, :creator, :contributor, :publisher, :library
55
+ string :item_identifier
56
+ string :library
57
+ integer :required_role_id
58
+ integer :circulation_status_id
59
+ integer :manifestation_id do
60
+ manifestation.id if manifestation
61
+ end
62
+ integer :shelf_id
63
+ integer :patron_ids, :multiple => true
64
+ integer :inventory_file_ids, :multiple => true
65
+ time :created_at
66
+ time :updated_at
67
+ end
68
+ =end
69
+
70
+ attr_accessor :library_id, :manifestation_id, :use_restriction_id
71
+
72
+ def self.per_page
73
+ 10
74
+ end
75
+
76
+ def set_circulation_status
77
+ self.circulation_status = CirculationStatus.where(:name => 'In Process').first if self.circulation_status.nil?
78
+ end
79
+
80
+ def set_use_restriction
81
+ if self.use_restriction_id
82
+ self.use_restriction = UseRestriction.where(:id => self.use_restriction_id).first
83
+ else
84
+ self.use_restriction = UseRestriction.where(:name => 'Limited Circulation, Normal Loan Period').first
85
+ end
86
+ end
87
+
88
+ def checkout_status(user)
89
+ user.user_group.user_group_has_checkout_types.find_by_checkout_type_id(self.checkout_type.id)
90
+ end
91
+
92
+ def next_reservation
93
+ Reserve.waiting.where(:manifestation_id => self.manifestation.id).first
94
+ end
95
+
96
+ def reserved?
97
+ return true unless Reserve.waiting.where(:item_id => self.id).blank?
98
+ false
99
+ # return true if self.next_reservation
100
+ # false
101
+ end
102
+
103
+ def reserve
104
+ Reserve.waiting.where(:item_id => self.id).first
105
+ end
106
+
107
+ def reservable?
108
+ return false if ['Lost', 'Missing', 'Claimed Returned Or Never Borrowed'].include?(self.circulation_status.name)
109
+ return false if self.item_identifier.blank?
110
+ true
111
+ end
112
+
113
+ def available_checkin?
114
+ return false if ['Circulation Status Undefined', 'Missing'].include?(self.circulation_status.name)
115
+ true
116
+ end
117
+
118
+ def rent?
119
+ return true if self.checkouts.not_returned.select(:item_id).detect{|checkout| checkout.item_id == self.id}
120
+ false
121
+ end
122
+
123
+ def reserved_by_user?(user)
124
+ if self.reserve
125
+ return true if self.reserve.user == user
126
+ end
127
+ false
128
+ end
129
+
130
+ def checkout_reserved_item(user)
131
+ reservation = Reserve.waiting.where(:user_id => user.id, :manifestation_id => self.manifestation.id).first rescue nil
132
+ if reservation
133
+ logger.error "checkouts reservation: #{reservation.id}"
134
+ reservation.item = self
135
+ reservation.sm_complete!
136
+ reservation.update_attributes(:checked_out_at => Time.zone.now)
137
+ return reservation
138
+ end
139
+ end
140
+
141
+ def available_for_checkout?
142
+ circulation_statuses = CirculationStatus.available_for_checkout.select(:id)
143
+ return true if circulation_statuses.include?(self.circulation_status) && self.item_identifier
144
+ false
145
+ end
146
+
147
+ def available_for_retain?
148
+ circulation_statuses = CirculationStatus.available_for_retain.select(:id)
149
+ return true if circulation_statuses.include?(self.circulation_status) && self.item_identifier
150
+ false
151
+ end
152
+
153
+ def available_for_reserve_with_config?
154
+ c = CirculationStatus.where(:name => 'On Loan').first
155
+ return true if c.id == self.circulation_status.id
156
+ false
157
+ end
158
+
159
+ def checkout!(user, librarian = nil)
160
+ circulation_status_on_loan = CirculationStatus.where(:name => 'On Loan').first
161
+ if self.circulation_status == circulation_status_on_loan
162
+ @basket = Basket.new(:user => librarian)
163
+ @basket.save(:validate => false)
164
+ @checkin = @basket.checkins.new(:item_id => self.id, :librarian_id => librarian.id)
165
+ @checkin.save(:validate => false)
166
+ @checkin.item_checkin(user, true)
167
+ end
168
+ self.circulation_status = circulation_status_on_loan
169
+ reservation = checkout_reserved_item(user)
170
+ # if self.reserved_by_user?(user)
171
+ # reservation = self.reserve
172
+ # reservation.sm_complete!
173
+ # reservation.update_attributes(:checked_out_at => Time.zone.now)
174
+ # end
175
+ if save!
176
+ reservation.position_update(reservation.manifestation) if reservation
177
+ true
178
+ end
179
+ end
180
+
181
+ def checkin!
182
+ self.circulation_status = CirculationStatus.where(:name => 'Available On Shelf').first
183
+ save(:validate => false)
184
+ end
185
+
186
+ def retain(librarian)
187
+ Item.transaction do
188
+ reservation = self.manifestation.next_reservation
189
+ unless reservation.nil?
190
+ reservation.item = self
191
+ reservation.sm_retain!
192
+ reservation.update_attributes({:request_status_type => RequestStatusType.find_by_name('In Process')})
193
+ request = MessageRequest.new(:sender_id => librarian.id, :receiver_id => reservation.user_id)
194
+ message_template = MessageTemplate.localized_template('item_received', reservation.user.locale)
195
+ request.message_template = message_template
196
+ request.save!
197
+ end
198
+ end
199
+ end
200
+
201
+ def retain_item!
202
+ self.circulation_status = CirculationStatus.find(:first, :conditions => ["name = ?", 'Available For Pickup'])
203
+ self.save
204
+ end
205
+
206
+ def cancel_retain!
207
+ self.circulation_status = CirculationStatus.find(:first, :conditions => ["name = ?", 'Available On Shelf'])
208
+ self.save
209
+ end
210
+
211
+ def inter_library_loaned?
212
+ true if self.inter_library_loans.size > 0
213
+ end
214
+
215
+ def title
216
+ manifestation.try(:original_title)
217
+ end
218
+
219
+ def creator
220
+ manifestation.try(:creator)
221
+ end
222
+
223
+ def contributor
224
+ manifestation.try(:contributor)
225
+ end
226
+
227
+ def publisher
228
+ manifestation.try(:publisher)
229
+ end
230
+
231
+ def library
232
+ shelf.library.name if shelf
233
+ end
234
+
235
+ def shelf_name
236
+ shelf.name
237
+ end
238
+
239
+ def hold?(library)
240
+ return true if self.shelf.library == library
241
+ false
242
+ end
243
+
244
+ def self.inventory_items(inventory_file, mode = 'not_on_shelf')
245
+ item_ids = Item.select(:id).collect(&:id)
246
+ inventory_item_ids = inventory_file.items.select('items.id').collect(&:id)
247
+ case mode
248
+ when 'not_on_shelf'
249
+ Item.where(:id => (item_ids - inventory_item_ids))
250
+ when 'not_in_catalog'
251
+ Item.where(:id => (inventory_item_ids - item_ids))
252
+ end
253
+ rescue
254
+ nil
255
+ end
256
+
257
+ def lending_rule(user)
258
+ lending_policies.where(:user_group_id => user.user_group.id).first
259
+ end
260
+
261
+ def owned(patron)
262
+ owns.where(:patron_id => patron.id).first
263
+ end
264
+
265
+ def library_url
266
+ "#{LibraryGroup.site_config.url}libraries/#{self.shelf.library.name}"
267
+ end
268
+
269
+ def manifestation_url
270
+ Addressable::URI.parse("#{LibraryGroup.site_config.url}manifestations/#{self.manifestation.id}").normalize.to_s if self.manifestation
271
+ end
272
+
273
+ def deletable?
274
+ checkouts.not_returned.empty? && (self.manifestation.items.size > 1 || self.circulation_status.name == "Removed" || SystemConfiguration.get("items.confirm_destroy") == false)
275
+ end
276
+
277
+ def not_for_loan?
278
+ if use_restriction.try(:name) == 'Not For Loan'
279
+ true
280
+ else
281
+ false
282
+ end
283
+ end
284
+
285
+ def check_remove_item
286
+ if self.circulation_status_id == CirculationStatus.find(:first, :conditions => ["name = ?", 'Removed']).id
287
+ self.removed_at = Time.zone.now if self.removed_at.nil?
288
+ else
289
+ self.removed_at = nil
290
+ end
291
+ end
292
+
293
+ def select_acquired_at
294
+ if self.acquired_at
295
+ return self.acquired_at.strftime("%Y%m")
296
+ else
297
+ return Time.now.strftime("%Y%m")
298
+ end
299
+ end
300
+
301
+ def check_price
302
+ record = Expense.where(:item_id => self.id).order("id DESC").first
303
+ begin
304
+ unless record.nil?
305
+ record.acquired_at_ym = select_acquired_at
306
+ record.acquired_at = self.acquired_at
307
+ record.save!
308
+
309
+ original_library_id = record.budget.library_id rescue nil
310
+ logger.info "@@@@@"
311
+ logger.info "price=#{self.price} / record_price=#{record.price} , library_id=#{self.library_id} / original_library_id=#{original_library_id}"
312
+
313
+ if self.price == record.price && self.library_id == original_library_id
314
+ logger.info "no change. price and library_id"
315
+ return
316
+ end
317
+ Expense.transaction do
318
+ Expense.create!(:item_id => self.id, :budget_id => record.budget_id, :price => record.price*-1, :acquired_at_ym => select_acquired_at, :acquired_at => self.acquired_at)
319
+ #TODO
320
+ budget = Budget.joins(:term).where(:library_id => self.shelf.library.id).order("terms.start_at DESC").first
321
+ if budget
322
+ budget_id = budget.id
323
+ else
324
+ budget_id = nil
325
+ end
326
+ Expense.create!(:item_id => self.id, :budget_id => budget_id, :price => self.price, :acquired_at_ym => select_acquired_at, :acquired_at => self.acquired_at)
327
+ end
328
+ else
329
+ return true if self.price.nil?
330
+ budget = Budget.joins(:term).where(:library_id => self.shelf.library.id).order("terms.start_at DESC").first
331
+ yyyymm = select_acquired_at
332
+ Expense.create!(:item => self, :budget => budget, :price => self.price, :acquired_at_ym => yyyymm, :acquired_at => self.acquired_at)
333
+ end
334
+ rescue Exception => e
335
+ logger.error "Failed to update expense: #{e}"
336
+ logger.error $@
337
+ end
338
+ end
339
+
340
+ def self.export_removing_list(out_dir, file_type = nil)
341
+ raise "invalid parameter: no path" if out_dir.nil? || out_dir.length < 1
342
+ tsv_file = out_dir + "removing_list.tsv"
343
+ pdf_file = out_dir + "removing_list.pdf"
344
+ logger.info "output removing_list tsv: #{tsv_file} pdf: #{pdf_file}"
345
+ # create output path
346
+ FileUtils.mkdir_p(out_dir) unless FileTest.exist?(out_dir)
347
+
348
+ items = Item.where('removed_at IS NOT NULL').order('removed_at ASC, id ASC')
349
+ if items
350
+ # tsv
351
+ if file_type.nil? || file_type == "tsv"
352
+ columns = [
353
+ ['item_identifier','activerecord.attributes.item.item_identifier'],
354
+ ['acquired_at', 'activerecord.attributes.item.acquired_at'],
355
+ [:original_title,'activerecord.attributes.manifestation.original_title'],
356
+ ['removed_at', 'activerecord.attributes.item.removed_at'],
357
+ ['price', 'activerecord.attributes.item.price'],
358
+ [:patron_publisher,'patron.publisher'],
359
+ [:patron_creator, 'patron.creator'],
360
+ [:date_of_publication, 'activerecord.attributes.manifestation.date_of_publication'],
361
+ ['note', 'activerecord.attributes.item.note']
362
+ ]
363
+ File.open(tsv_file, "w") do |output|
364
+ # add UTF-8 BOM for excel
365
+ output.print "\xEF\xBB\xBF".force_encoding("UTF-8")
366
+
367
+ # タイトル行
368
+ row = []
369
+ columns.each do |column|
370
+ row << I18n.t(column[1])
371
+ end
372
+ output.print '"'+row.join("\"\t\"")+"\n"
373
+
374
+ items.each do |item|
375
+ row = []
376
+ columns.each do |column|
377
+ case column[0]
378
+ when "removed_at"
379
+ row << item.removed_at.strftime("%Y/%m/%d") rescue ""
380
+ when "acquired at"
381
+ row << item.acquired_at.strftime("%Y/%m/%d") rescue ""
382
+ when :original_title
383
+ row << item.manifestation.original_title
384
+ when :date_of_publication
385
+ if item.manifestation.date_of_publication.nil?
386
+ row << ""
387
+ else
388
+ row << item.manifestation.date_of_publication.strftime("%Y/%m/%d") rescue ""
389
+ end
390
+ when :patron_creator
391
+ row << patrons_list(item.manifestation.creators)
392
+ when :patron_publisher
393
+ row << patrons_list(item.manifestation.publishers)
394
+ else
395
+ row << get_object_method(item, column[0].split('.')).to_s.gsub(/\r\n|\r|\n/," ").gsub(/\"/,"\"\"")
396
+ end # end of case column[0]
397
+ end #end of columns.each
398
+ output.print '"'+row.join("\"\t\"")+"\"\n"
399
+ end # end of items.each
400
+ end
401
+ end
402
+ # pdf
403
+ if file_type.nil? || file_type == "pdf"
404
+ report = ThinReports::Report.new :layout => File.join(Rails.root, 'report', 'removing_list.tlf')
405
+ report.events.on :page_create do |e|
406
+ e.page.item(:page).value(e.page.no)
407
+ end
408
+ report.events.on :generate do |e|
409
+ e.pages.each do |page|
410
+ page.item(:total).value(e.report.page_count)
411
+ end
412
+ end
413
+
414
+ report.start_new_page do |page|
415
+ page.item(:date).value(Time.now)
416
+ items.each do |item|
417
+ page.list(:list).add_row do |row|
418
+ row.item(:item_identifier).value(item.item_identifier)
419
+ unless item.acquired_at.nil?
420
+ row.item(:acquired_at).value(item.acquired_at.strftime("%Y/%m/%d"))
421
+ end
422
+ unless item.removed_at.nil?
423
+ row.item(:removed_at).value(item.removed_at.strftime("%Y/%m/%d"))
424
+ end
425
+ row.item(:title).value(item.manifestation.original_title)
426
+ unless item.manifestation.date_of_publication.nil?
427
+ #row.item(:date_of_publication).value(item.manifestation.date_of_publication.strftime("%Y/%m/%d"))
428
+ end
429
+ row.item(:price).value(to_format(item.price))
430
+ row.item(:patron_creator).value(patrons_list(item.manifestation.creators))
431
+ row.item(:patron_publisher).value(patrons_list(item.manifestation.publishers))
432
+ row.item(:date_of_publication).value(item.manifestation.date_of_publication.strftime("%Y/%m/%d")) rescue nil
433
+ end
434
+ end
435
+ end
436
+ report.generate_file(pdf_file)
437
+ end
438
+ end #end of method
439
+ end
440
+
441
+ def self.export_item_register(out_dir, file_type = nil)
442
+ raise "invalid parameter: no path" if out_dir.nil? || out_dir.length < 1
443
+ tsv_file = out_dir + "item_register.tsv"
444
+ pdf_file = out_dir + "item_register.pdf"
445
+ logger.info "output item_register tsv: #{tsv_file} pdf: #{pdf_file}"
446
+ # create output path
447
+ FileUtils.mkdir_p(out_dir) unless FileTest.exist?(out_dir)
448
+ # get item
449
+ @items = Item.order("bookstore_id DESC, acquired_at ASC, item_identifier ASC").all
450
+ # make tsv
451
+ make_item_register_tsv(tsv_file, @items) if file_type.nil? || file_type == "tsv"
452
+ # make pdf
453
+ make_item_register_pdf(pdf_file, @items) if file_type.nil? || file_type == "pdf"
454
+ end
455
+
456
+ def self.export_audio_list(out_dir, file_type = nil)
457
+ raise "invalid parameter: no path" if out_dir.nil? || out_dir.length < 1
458
+ tsv_file = out_dir + "audio_list.tsv"
459
+ pdf_file = out_dir + "audio_list.pdf"
460
+ logger.info "output audio_list tsv: #{tsv_file} pdf: #{pdf_file}"
461
+ # create output path
462
+ FileUtils.mkdir_p(out_dir) unless FileTest.exist?(out_dir)
463
+ # get item
464
+ carrier_type_ids = CarrierType.audio.inject([]){|ids, c| ids << c.id}
465
+ @items = Item.joins(:manifestation).where(["manifestations.carrier_type_id IN (?)", carrier_type_ids]).order("bookstore_id DESC, acquired_at ASC, item_identifier ASC").all
466
+ # make tsv
467
+ make_audio_list_tsv(tsv_file, @items) if file_type.nil? || file_type == "tsv"
468
+ # make pdf
469
+ make_audio_list_pdf(pdf_file, @items) if file_type.nil? || file_type == "pdf"
470
+ end
471
+
472
+ private
473
+ def self.to_format(num)
474
+ num.to_s.gsub(/(\d)(?=(\d{3})+(?!\d))/, '\1,')
475
+ end
476
+
477
+ def self.patrons_list(patrons)
478
+ ApplicationController.helpers.patrons_list(patrons, {:nolink => true})
479
+ end
480
+
481
+ def self.get_object_method(obj,array)
482
+ _obj = obj.send(array.shift)
483
+ return get_object_method(_obj, array) if array.present?
484
+ return _obj
485
+ end
486
+
487
+ def self.make_item_register_tsv(tsvfile, items)
488
+ columns = [
489
+ [:bookstore, 'activerecord.models.bookstore'],
490
+ ['item_identifier', 'activerecord.attributes.item.item_identifier'],
491
+ ['acquired_at', 'activerecord.attributes.item.acquired_at'],
492
+ [:creator, 'patron.creator'],
493
+ [:original_title, 'activerecord.attributes.manifestation.original_title'],
494
+ [:pub_year, 'activerecord.attributes.manifestation.pub_year'],
495
+ [:publisher, 'patron.publisher'],
496
+ [:price, 'activerecord.attributes.manifestation.price'],
497
+ ['call_number', 'activerecord.attributes.item.call_number'],
498
+ [:marc_number, 'activerecord.attributes.manifestation.marc_number'],
499
+ ['note', 'activerecord.attributes.item.note']
500
+ ]
501
+
502
+ File.open(tsvfile, "w") do |output|
503
+ # add UTF-8 BOM for excel
504
+ output.print "\xEF\xBB\xBF".force_encoding("UTF-8")
505
+
506
+ # タイトル行
507
+ row = []
508
+ columns.each do |column|
509
+ row << I18n.t(column[1])
510
+ end
511
+ output.print '"'+row.join("\"\t\"")+"\"\n"
512
+ if items.nil? || items.size < 1
513
+ logger.warn "item data is empty"
514
+ else
515
+ items.each do |item|
516
+ row = []
517
+ columns.each do |column|
518
+ case column[0]
519
+ when :bookstore
520
+ if item.bookstore
521
+ row << item.bookstore.name
522
+ else
523
+ row << ""
524
+ end
525
+ when :creator
526
+ if item.manifestation && item.manifestation.creators
527
+ row << item.manifestation.creators.inject([]){|names, creator| names << creator.full_name if creator.full_name; names}.join("\t")
528
+ else
529
+ row << ""
530
+ end
531
+ when :original_title
532
+ if item.manifestation
533
+ row << item.manifestation.original_title
534
+ else
535
+ row << ""
536
+ end
537
+ when :pub_year
538
+ if item.manifestation && item.manifestation.date_of_publication
539
+ row << item.manifestation.date_of_publication.strftime("%Y")
540
+ else
541
+ row << ""
542
+ end
543
+ when :publisher
544
+ if item.publisher
545
+ row << item.publisher.delete_if{|p|p.blank?}.join("\t")
546
+ else
547
+ row << ""
548
+ end
549
+ when :price
550
+ if item.manifestation && item.manifestation.price
551
+ row << item.manifestation.price
552
+ else
553
+ row << ""
554
+ end
555
+ when :marc_number
556
+ if item.manifestation && item.manifestation.marc_number
557
+ row << item.manifestation.marc_number[0, 10]
558
+ else
559
+ row << ""
560
+ end
561
+ else
562
+ row << get_object_method(item, column[0].split('.')).to_s.gsub(/\r\n|\r|\n/," ").gsub(/\"/,"\"\"")
563
+ end
564
+ end
565
+ output.print '"'+row.join("\"\t\"")+"\"\n"
566
+ end
567
+ end
568
+ end
569
+ end
570
+
571
+ def self.make_audio_list_tsv(tsvfile, items)
572
+ columns = [
573
+ [:library, 'activerecord.models.library'],
574
+ [:carrier_type, 'activerecord.models.carrier_type'],
575
+ [:shelf, 'activerecord.models.shelf'],
576
+ ['item_identifier', 'activerecord.attributes.item.item_identifier'],
577
+ ['acquired_at', 'activerecord.attributes.item.acquired_at'],
578
+ [:original_title, 'activerecord.attributes.manifestation.original_title'],
579
+ [:creator, 'patron.creator'],
580
+ [:pub_year, 'activerecord.attributes.manifestation.pub_year'],
581
+ [:publisher, 'patron.publisher'],
582
+ ['call_number', 'activerecord.attributes.item.call_number'],
583
+ ['note', 'activerecord.attributes.item.note']
584
+ ]
585
+
586
+ File.open(tsvfile, "w") do |output|
587
+ # add UTF-8 BOM for excel
588
+ output.print "\xEF\xBB\xBF".force_encoding("UTF-8")
589
+
590
+ # タイトル行
591
+ row = []
592
+ columns.each do |column|
593
+ row << I18n.t(column[1])
594
+ end
595
+ output.print '"'+row.join("\"\t\"")+"\"\n"
596
+ if items.nil? || items.size < 1
597
+ logger.warn "item data is empty"
598
+ else
599
+ items.each do |item|
600
+ row = []
601
+ columns.each do |column|
602
+ case column[0]
603
+ when :library
604
+ if item.shelf && item.shelf.library
605
+ row << item.shelf.library.display_name.localize
606
+ else
607
+ row << ""
608
+ end
609
+ when :creator
610
+ if item.manifestation && item.manifestation.creators
611
+ row << item.manifestation.creators.inject([]){|names, creator| names << creator.full_name if creator.full_name; names}.join("\t")
612
+ else
613
+ row << ""
614
+ end
615
+ when :original_title
616
+ if item.manifestation
617
+ row << item.manifestation.original_title
618
+ else
619
+ row << ""
620
+ end
621
+ when :pub_year
622
+ if item.manifestation && item.manifestation.date_of_publication
623
+ row << item.manifestation.date_of_publication.strftime("%Y")
624
+ else
625
+ row << ""
626
+ end
627
+ when :publisher
628
+ if item.publisher
629
+ row << item.publisher.delete_if{|p|p.blank?}.join("\t")
630
+ else
631
+ row << ""
632
+ end
633
+ when :carrier_type
634
+ if item.manifestation && item.manifestation.carrier_type
635
+ row << item.manifestation.carrier_type.display_name.localize
636
+ else
637
+ row << ""
638
+ end
639
+ when :shelf
640
+ if item.shelf
641
+ row << item.shelf.display_name.localize
642
+ else
643
+ row << ""
644
+ end
645
+ else
646
+ row << get_object_method(item, column[0].split('.')).to_s.gsub(/\r\n|\r|\n/," ").gsub(/\"/,"\"\"")
647
+ end
648
+ end
649
+ output.print '"'+row.join("\"\t\"")+"\"\n"
650
+ end
651
+ end
652
+ end
653
+ end
654
+
655
+ def self.make_item_register_pdf(pdf_file, items)
656
+ report = ThinReports::Report.new :layout => File.join(Rails.root, 'report', 'libcheck_items.tlf')
657
+ report.events.on :page_create do |e|
658
+ e.page.item(:page).value(e.page.no)
659
+ end
660
+ report.events.on :generate do |e|
661
+ e.pages.each do |page|
662
+ page.item(:total).value(e.report.page_count)
663
+ end
664
+ end
665
+
666
+ bookstore_ids = items.inject([]){|ids, item| ids << item.bookstore_id; ids}.uniq!
667
+ if bookstore_ids
668
+ bookstore_ids.each do |bookstore_id|
669
+ report.start_new_page do |page|
670
+ page.item(:date).value(Time.now)
671
+ page.item(:bookstore).value(Bookstore.find(bookstore_id).name) rescue nil
672
+ items.each do |item|
673
+ if item.bookstore_id == bookstore_id
674
+ page.list(:list).add_row do |row|
675
+ row.item(:item_identifier).value(item.item_identifier)
676
+ row.item(:acquired_at).value(item.acquired_at.strftime("%Y%m%d")) if item.acquired_at
677
+ row.item(:patron).value(item.manifestation.creators[0].full_name) if item.manifestation && item.manifestation.creators[0]
678
+ row.item(:title).value(item.manifestation.original_title) if item.manifestation
679
+ row.item(:pub_year).value(item.manifestation.date_of_publication.strftime("%Y")) if item.manifestation && item.manifestation.date_of_publication
680
+ row.item(:publisher).value(item.publisher.delete_if{|p|p.blank?}[0]) if item.publisher
681
+ row.item(:price).value(to_format(item.price)) if item.price
682
+ row.item(:call_number).value(item.call_number)
683
+ row.item(:marc_number).value(item.manifestation.marc_number[0,10]) if item.manifestation && item.manifestation.marc_number
684
+ row.item(:note).value(item.note.split("\r\n")[0]) if item.note
685
+ end
686
+ end
687
+ end
688
+ end
689
+ end
690
+ else
691
+ report.start_new_page do |page|
692
+ page.item(:date).value(Time.now)
693
+ page.item(:bookstore).value(nil)
694
+ end
695
+ end
696
+ report.generate_file(pdf_file)
697
+ end
698
+
699
+ def self.make_audio_list_pdf(pdf_file, items)
700
+ filename = I18n.t('item_register.audio_list')
701
+ report = ThinReports::Report.new :layout => "#{Rails.root.to_s}/report/item_list"
702
+
703
+ report.events.on :page_create do |e|
704
+ e.page.item(:page).value(e.page.no)
705
+ end
706
+ report.events.on :generate do |e|
707
+ e.pages.each do |page|
708
+ page.item(:total).value(e.report.page_count)
709
+ end
710
+ end
711
+
712
+ report.start_new_page
713
+ report.page.item(:date).value(Time.now)
714
+ report.page.item(:list_name).value(filename)
715
+ @items.each do |item|
716
+ report.page.list(:list).add_row do |row|
717
+ row.item(:library).value(item.shelf.library.display_name.localize) if item.shelf && item.shelf.library
718
+ row.item(:carrier_type).value(item.manifestation.carrier_type.display_name.localize) if item.manifestation && item.manifestation.carrier_type
719
+ row.item(:shelf).value(item.shelf.display_name) if item.shelf
720
+ row.item(:ndc).value(item.manifestation.ndc) if item.manifestation
721
+ row.item(:item_identifier).value(item.item_identifier)
722
+ row.item(:call_number).value(item.call_number)
723
+ row.item(:title).value(item.manifestation.original_title) if item.manifestation
724
+ end
725
+ end
726
+ report.generate_file(pdf_file)
727
+ logger.error "created report: #{Time.now}"
728
+ end
729
+
730
+ def self.make_export_item_list_pdf(items, filename)
731
+ return false if items.blank?
732
+ report = ThinReports::Report.new :layout => "#{Rails.root.to_s}/report/item_list"
733
+
734
+ report.events.on :page_create do |e|
735
+ e.page.item(:page).value(e.page.no)
736
+ end
737
+ report.events.on :generate do |e|
738
+ e.pages.each do |page|
739
+ page.item(:total).value(e.report.page_count)
740
+ end
741
+ end
742
+ report.start_new_page
743
+ report.page.item(:date).value(Time.now)
744
+ report.page.item(:list_name).value(filename)
745
+ items.each do |item|
746
+ report.page.list(:list).add_row do |row|
747
+ row.item(:library).value(item.shelf.library.display_name.localize) if item.shelf && item.shelf.library
748
+ row.item(:carrier_type).value(item.manifestation.carrier_type.display_name.localize) if item.manifestation && item.manifestation.carrier_type
749
+ row.item(:shelf).value(item.shelf.display_name) if item.shelf
750
+ row.item(:ndc).value(item.manifestation.ndc) if item.manifestation
751
+ row.item(:item_identifier).value(item.item_identifier)
752
+ row.item(:call_number).value(item.call_number)
753
+ row.item(:title).value(item.manifestation.original_title) if item.manifestation
754
+ end
755
+ end
756
+ return report
757
+ end
758
+
759
+ def self.make_export_item_list_tsv(items)
760
+ data = String.new
761
+ data << "\xEF\xBB\xBF".force_encoding("UTF-8") + "\n"
762
+ columns = [
763
+ [:library, 'activerecord.models.library'],
764
+ [:carrier_type, 'activerecord.models.carrier_type'],
765
+ [:shelf, 'activerecord.models.shelf'],
766
+ [:ndc, 'activerecord.attributes.manifestation.ndc'],
767
+ ['item_identifier', 'activerecord.attributes.item.item_identifier'],
768
+ ['call_number', 'activerecord.attributes.item.call_number'],
769
+ [:title, 'activerecord.attributes.manifestation.original_title'],
770
+ ]
771
+
772
+ # title column
773
+ row = columns.map {|column| I18n.t(column[1])}
774
+ data << '"'+row.join("\"\t\"")+"\"\n"
775
+
776
+ items.each do |item|
777
+ row = []
778
+ columns.each do |column|
779
+ case column[0]
780
+ when :library
781
+ row << item.shelf.library.display_name.localize
782
+ when :carrier_type
783
+ row << item.manifestation.carrier_type.display_name.localize
784
+ when :shelf
785
+ row << item.shelf.display_name
786
+ when :ndc
787
+ row << item.manifestation.ndc
788
+ when :title
789
+ row << item.manifestation.original_title
790
+ else
791
+ row << get_object_method(item, column[0].split('.')).to_s.gsub(/\r\n|\r|\n/," ").gsub(/\"/,"\"\"")
792
+ end
793
+ end
794
+ data << '"'+row.join("\"\t\"")+"\"\n"
795
+ end
796
+ return data
797
+ end
798
+
799
+ def self.make_export_new_item_list_pdf(items)
800
+ return false if items.blank?
801
+ report = ThinReports::Report.new :layout => "#{Rails.root.to_s}/report/new_item_list"
802
+
803
+ report.events.on :page_create do |e|
804
+ e.page.item(:page).value(e.page.no)
805
+ end
806
+ report.events.on :generate do |e|
807
+ e.pages.each do |page|
808
+ page.item(:total).value(e.report.page_count)
809
+ end
810
+ end
811
+ report.start_new_page
812
+ report.page.item(:date).value(Time.now)
813
+ term = Time.zone.now.months_ago(1).strftime("%Y/%m/%d").to_s + ' - ' + Time.now.strftime("%Y/%m/%d").to_s
814
+ report.page.item(:term).value(term)
815
+ items.each do |item|
816
+ report.page.list(:list).add_row do |row|
817
+ row.item(:library).value(item.shelf.library.display_name.localize) if item.shelf && item.shelf.library
818
+ row.item(:carrier_type).value(item.manifestation.carrier_type.display_name.localize) if item.manifestation && item.manifestation.carrier_type
819
+ row.item(:shelf).value(item.shelf.display_name) if item.shelf
820
+ row.item(:ndc).value(item.manifestation.ndc) if item.manifestation
821
+ row.item(:item_identifier).value(item.item_identifier)
822
+ row.item(:call_number).value(item.call_number)
823
+ row.item(:created_at).value(item.created_at.strftime("%Y/%m/%d"))
824
+ row.item(:title).value(item.manifestation.original_title) if item.manifestation
825
+ end
826
+ end
827
+ return report
828
+ end
829
+
830
+ def self.make_export_new_item_list_tsv(items)
831
+ data = String.new
832
+ data << "\xEF\xBB\xBF".force_encoding("UTF-8") + "\n"
833
+
834
+ # set term
835
+ term = Time.zone.now.months_ago(1).strftime("%Y/%m/%d").to_s + ' - ' + Time.now.strftime("%Y/%m/%d").to_s
836
+ data << '"' + term + "\"\n"
837
+
838
+ columns = [
839
+ [:library, 'activerecord.models.library'],
840
+ [:carrier_type, 'activerecord.models.carrier_type'],
841
+ [:shelf, 'activerecord.models.shelf'],
842
+ [:ndc, 'activerecord.attributes.manifestation.ndc'],
843
+ ['item_identifier', 'activerecord.attributes.item.item_identifier'],
844
+ ['call_number', 'activerecord.attributes.item.call_number'],
845
+ [:created_at, 'activerecord.attributes.item.created_at'],
846
+ [:title, 'activerecord.attributes.manifestation.original_title'],
847
+ ]
848
+
849
+ # title column
850
+ row = columns.map {|column| I18n.t(column[1])}
851
+ data << '"'+row.join("\"\t\"")+"\"\n"
852
+
853
+ items.each do |item|
854
+ row = []
855
+ columns.each do |column|
856
+ case column[0]
857
+ when :library
858
+ row << item.shelf.library.display_name.localize
859
+ when :carrier_type
860
+ row << item.manifestation.carrier_type.display_name.localize
861
+ when :shelf
862
+ row << item.shelf.display_name
863
+ when :ndc
864
+ row << item.manifestation.ndc
865
+ when :title
866
+ row << item.manifestation.original_title
867
+ when :created_at
868
+ row << item.created_at.strftime("%Y/%m/%d") if item.created_at
869
+ else
870
+ row << get_object_method(item, column[0].split('.')).to_s.gsub(/\r\n|\r|\n/," ").gsub(/\"/,"\"\"")
871
+ end
872
+ end
873
+ data << '"'+row.join("\"\t\"")+"\"\n"
874
+ end
875
+ return data
876
+ end
877
+
878
+ def self.make_export_removed_list_pdf(items)
879
+ return false if items.blank?
880
+ report = ThinReports::Report.new :layout => "#{Rails.root.to_s}/report/removed_list"
881
+
882
+ report.events.on :page_create do |e|
883
+ e.page.item(:page).value(e.page.no)
884
+ end
885
+ report.events.on :generate do |e|
886
+ e.pages.each do |page|
887
+ page.item(:total).value(e.report.page_count)
888
+ end
889
+ end
890
+ report.start_new_page
891
+ report.page.item(:date).value(Time.now)
892
+ items.each do |item|
893
+ report.page.list(:list).add_row do |row|
894
+ row.item(:library).value(item.shelf.library.display_name.localize) if item.shelf && item.shelf.library
895
+ row.item(:carrier_type).value(item.manifestation.carrier_type.display_name.localize) if item.manifestation && item.manifestation.carrier_type
896
+ row.item(:shelf).value(item.shelf.display_name) if item.shelf
897
+ row.item(:ndc).value(item.manifestation.ndc) if item.manifestation
898
+ row.item(:item_identifier).value(item.item_identifier)
899
+ row.item(:call_number).value(item.call_number)
900
+ row.item(:removed_at).value(item.removed_at.strftime("%Y/%m/%d")) if item.removed_at
901
+ row.item(:title).value(item.manifestation.original_title) if item.manifestation
902
+ end
903
+ end
904
+ return report
905
+ end
906
+
907
+ def self.make_export_removed_list_tsv(items)
908
+ data = String.new
909
+ data << "\xEF\xBB\xBF".force_encoding("UTF-8") + "\n"
910
+
911
+ columns = [
912
+ [:library, 'activerecord.models.library'],
913
+ [:carrier_type, 'activerecord.models.carrier_type'],
914
+ [:shelf, 'activerecord.models.shelf'],
915
+ [:ndc, 'activerecord.attributes.manifestation.ndc'],
916
+ ['item_identifier', 'activerecord.attributes.item.item_identifier'],
917
+ ['call_number', 'activerecord.attributes.item.call_number'],
918
+ [:removed_at, 'activerecord.attributes.item.removed_at'],
919
+ [:title, 'activerecord.attributes.manifestation.original_title'],
920
+ ]
921
+
922
+ # title column
923
+ row = columns.map {|column| I18n.t(column[1])}
924
+ data << '"'+row.join("\"\t\"")+"\"\n"
925
+
926
+ items.each do |item|
927
+ row = []
928
+ columns.each do |column|
929
+ case column[0]
930
+ when :library
931
+ row << item.shelf.library.display_name.localize
932
+ when :carrier_type
933
+ row << item.manifestation.carrier_type.display_name.localize
934
+ when :shelf
935
+ row << item.shelf.display_name
936
+ when :ndc
937
+ row << item.manifestation.ndc
938
+ when :title
939
+ row << item.manifestation.original_title
940
+ when :removed_at
941
+ row << item.removed_at.strftime("%Y/%m/%d") if item.removed_at
942
+ else
943
+ row << get_object_method(item, column[0].split('.')).to_s.gsub(/\r\n|\r|\n/," ").gsub(/\"/,"\"\"")
944
+ end
945
+ end
946
+ data << '"'+row.join("\"\t\"")+"\"\n"
947
+ end
948
+ return data
949
+ end
950
+
951
+ def self.make_export_new_book_list_pdf(items)
952
+ return false if items.blank?
953
+ report = ThinReports::Report.new :layout => "#{Rails.root.to_s}/report/new_book_list"
954
+
955
+ report.events.on :page_create do |e|
956
+ e.page.item(:page).value(e.page.no)
957
+ end
958
+ report.events.on :generate do |e|
959
+ e.pages.each do |page|
960
+ page.item(:total).value(e.report.page_count)
961
+ end
962
+ end
963
+ report.start_new_page
964
+ report.page.item(:date).value(Time.now)
965
+ date_ago = Time.zone.now - SystemConfiguration.get("new_book_term").day
966
+ term = date_ago.strftime("%Y/%m/%d").to_s + ' - '
967
+ report.page.item(:term).value(term)
968
+ items.each do |item|
969
+ report.page.list(:list).add_row do |row|
970
+ row.item(:library).value(item.shelf.library.display_name.localize) if item.shelf && item.shelf.library
971
+ row.item(:carrier_type).value(item.manifestation.carrier_type.display_name.localize) if item.manifestation && item.manifestation.carrier_type
972
+ row.item(:shelf).value(item.shelf.display_name) if item.shelf
973
+ row.item(:ndc).value(item.manifestation.ndc) if item.manifestation
974
+ row.item(:item_identifier).value(item.item_identifier)
975
+ row.item(:pub_date).value(item.manifestation.pub_date)
976
+ row.item(:acquired_at).value(item.acquired_at.strftime("%Y/%m/%d")) if item.acquired_at
977
+ row.item(:title).value(item.manifestation.original_title) if item.manifestation
978
+ end
979
+ end
980
+ return report
981
+ end
982
+
983
+ def self.make_export_new_book_list_tsv(items)
984
+ data = String.new
985
+ data << "\xEF\xBB\xBF".force_encoding("UTF-8") + "\n"
986
+
987
+ # set term
988
+ date_ago = Time.zone.now - SystemConfiguration.get("new_book_term").day
989
+ term = date_ago.strftime("%Y/%m/%d").to_s + ' - '
990
+ data << '"' + term + "\"\n"
991
+
992
+ columns = [
993
+ [:library, 'activerecord.models.library'],
994
+ [:carrier_type, 'activerecord.models.carrier_type'],
995
+ [:shelf, 'activerecord.models.shelf'],
996
+ [:ndc, 'activerecord.attributes.manifestation.ndc'],
997
+ ['item_identifier', 'activerecord.attributes.item.item_identifier'],
998
+ [:pub_date, 'activerecord.attributes.manifestation.pub_date'],
999
+ [:acquired_at, 'activerecord.attributes.item.acquired_at'],
1000
+ [:title, 'activerecord.attributes.manifestation.original_title'],
1001
+ ]
1002
+
1003
+ # title column
1004
+ row = columns.map {|column| I18n.t(column[1])}
1005
+ data << '"'+row.join("\"\t\"")+"\"\n"
1006
+
1007
+ items.each do |item|
1008
+ row = []
1009
+ columns.each do |column|
1010
+ case column[0]
1011
+ when :library
1012
+ row << item.shelf.library.display_name.localize
1013
+ when :carrier_type
1014
+ row << item.manifestation.carrier_type.display_name.localize
1015
+ when :shelf
1016
+ row << item.shelf.display_name
1017
+ when :ndc
1018
+ row << item.manifestation.ndc
1019
+ when :title
1020
+ row << item.manifestation.original_title
1021
+ when :pub_date
1022
+ row << item.manifestation.pub_date
1023
+ when :acquired_at
1024
+ acquired_at = ""
1025
+ acquired_at = item.acquired_at.strftime("%Y/%m/%d") if item.acquired_at
1026
+ row << acquired_at
1027
+ else
1028
+ row << get_object_method(item, column[0].split('.')).to_s.gsub(/\r\n|\r|\n/," ").gsub(/\"/,"\"\"")
1029
+ end
1030
+ end
1031
+ data << '"'+row.join("\"\t\"")+"\"\n"
1032
+ end
1033
+ return data
1034
+ end
1035
+
1036
+ def self.make_export_series_statements_latest_list_pdf(items)
1037
+ return false if items.blank?
1038
+ report = ThinReports::Report.new :layout => "#{Rails.root.to_s}/report/series_statements_latest_list"
1039
+
1040
+ report.events.on :page_create do |e|
1041
+ e.page.item(:page).value(e.page.no)
1042
+ end
1043
+ report.events.on :generate do |e|
1044
+ e.pages.each do |page|
1045
+ page.item(:total).value(e.report.page_count)
1046
+ end
1047
+ end
1048
+ report.start_new_page
1049
+ report.page.item(:date).value(Time.now)
1050
+ items.each do |item|
1051
+ report.page.list(:list).add_row do |row|
1052
+ row.item(:library).value(item.shelf.library.display_name.localize) if item.shelf && item.shelf.library
1053
+ row.item(:acquired_at).value(item.acquired_at.strftime("%Y/%m/%d")) if item.acquired_at
1054
+ row.item(:bookstore).value(item.bookstore.name) if item.bookstore
1055
+ row.item(:item_identifier).value(item.item_identifier)
1056
+ row.item(:volume_number_string).value(item.manifestation.volume_number_string) if item.manifestation
1057
+ row.item(:issue_number_string).value(item.manifestation.issue_number_string) if item.manifestation
1058
+ row.item(:serial_number_string).value(item.manifestation.serial_number_string) if item.manifestation
1059
+ row.item(:title).value(item.manifestation.original_title) if item.manifestation
1060
+ end
1061
+ end
1062
+ return report
1063
+ end
1064
+
1065
+ def self.make_export_series_statements_latest_list_tsv(items)
1066
+ data = String.new
1067
+ data << "\xEF\xBB\xBF".force_encoding("UTF-8") + "\n"
1068
+
1069
+ columns = [
1070
+ [:library, 'activerecord.models.library'],
1071
+ [:acquired_at, 'activerecord.attributes.item.acquired_at'],
1072
+ [:bookstore, 'activerecord.models.bookstore'],
1073
+ ['item_identifier', 'activerecord.attributes.item.item_identifier'],
1074
+ [:volume_number_string, 'activerecord.attributes.manifestation.volume_number_string'],
1075
+ [:issue_number_string, 'activerecord.attributes.manifestation.issue_number_string'],
1076
+ [:serial_number_string, 'activerecord.attributes.manifestation.serial_number_string'],
1077
+ [:title, 'activerecord.attributes.manifestation.original_title'],
1078
+ ]
1079
+
1080
+ # title column
1081
+ row = columns.map {|column| I18n.t(column[1])}
1082
+ data << '"'+row.join("\"\t\"")+"\"\n"
1083
+
1084
+ items.each do |item|
1085
+ row = []
1086
+ columns.each do |column|
1087
+ case column[0]
1088
+ when :library
1089
+ row << item.shelf.library.display_name.localize
1090
+ when :acquired_at
1091
+ row << item.acquired_at.strftime("%Y/%m/%d") if item.acquired_at
1092
+ when :bookstore
1093
+ bookstore = ""
1094
+ bookstore = item.bookstore.name if item.bookstore and item.bookstore.name
1095
+ row << bookstore
1096
+ when :volume_number_string
1097
+ row << item.manifestation.volume_number_string
1098
+ when :issue_number_string
1099
+ row << item.manifestation.issue_number_string
1100
+ when :serial_number_string
1101
+ row << item.manifestation.serial_number_string
1102
+ when :title
1103
+ row << item.manifestation.original_title
1104
+ else
1105
+ row << get_object_method(item, column[0].split('.')).to_s.gsub(/\r\n|\r|\n/," ").gsub(/\"/,"\"\"")
1106
+ end
1107
+ end
1108
+ data << '"'+row.join("\"\t\"")+"\"\n"
1109
+ end
1110
+ return data
1111
+ end
1112
+
1113
+ def self.make_export_series_statements_list_pdf(items, acquired_at)
1114
+ return false if items.blank?
1115
+ report = ThinReports::Report.new :layout => "#{Rails.root.to_s}/report/series_statements_list"
1116
+
1117
+ report.events.on :page_create do |e|
1118
+ e.page.item(:page).value(e.page.no)
1119
+ end
1120
+ report.events.on :generate do |e|
1121
+ e.pages.each do |page|
1122
+ page.item(:total).value(e.report.page_count)
1123
+ end
1124
+ end
1125
+ report.start_new_page
1126
+ report.page.item(:date).value(Time.now)
1127
+ if acquired_at.size > 0
1128
+ start_date = Time.zone.parse(acquired_at).strftime("%Y/%m/%d").to_s
1129
+ else
1130
+ start_date = ""
1131
+ end
1132
+ term = start_date + ' - ' + Time.now.strftime("%Y/%m/%d").to_s
1133
+ report.page.item(:term).value(term)
1134
+ items.each do |item|
1135
+ report.page.list(:list).add_row do |row|
1136
+ row.item(:library).value(item.shelf.library.display_name.localize) if item.shelf && item.shelf.library
1137
+ row.item(:acquired_at).value(item.acquired_at.strftime("%Y/%m/%d")) if item.acquired_at
1138
+ row.item(:bookstore).value(item.bookstore.name) if item.bookstore
1139
+ row.item(:item_identifier).value(item.item_identifier)
1140
+ row.item(:volume_number_string).value(item.manifestation.volume_number_string) if item.manifestation
1141
+ row.item(:issue_number_string).value(item.manifestation.issue_number_string) if item.manifestation
1142
+ row.item(:serial_number_string).value(item.manifestation.serial_number_string) if item.manifestation
1143
+ row.item(:title).value(item.manifestation.original_title) if item.manifestation
1144
+ end
1145
+ end
1146
+ return report
1147
+ end
1148
+
1149
+ def self.make_export_series_statements_list_tsv(items, acquired_at)
1150
+ data = String.new
1151
+ data << "\xEF\xBB\xBF".force_encoding("UTF-8") + "\n"
1152
+
1153
+ # set term
1154
+ if acquired_at.size > 0
1155
+ start_date = Time.zone.parse(acquired_at).strftime("%Y/%m/%d").to_s
1156
+ else
1157
+ start_date = ""
1158
+ end
1159
+ term = start_date + ' - ' + Time.now.strftime("%Y/%m/%d").to_s
1160
+ data << '"' + term + "\"\n"
1161
+
1162
+ columns = [
1163
+ [:library, 'activerecord.models.library'],
1164
+ [:acquired_at, 'activerecord.attributes.item.acquired_at'],
1165
+ [:bookstore, 'activerecord.models.bookstore'],
1166
+ ['item_identifier', 'activerecord.attributes.item.item_identifier'],
1167
+ [:volume_number_string, 'activerecord.attributes.manifestation.volume_number_string'],
1168
+ [:issue_number_string, 'activerecord.attributes.manifestation.issue_number_string'],
1169
+ [:serial_number_string, 'activerecord.attributes.manifestation.serial_number_string'],
1170
+ [:title, 'activerecord.attributes.manifestation.original_title'],
1171
+ ]
1172
+
1173
+ # title column
1174
+ row = columns.map {|column| I18n.t(column[1])}
1175
+ data << '"'+row.join("\"\t\"")+"\"\n"
1176
+
1177
+ items.each do |item|
1178
+ row = []
1179
+ columns.each do |column|
1180
+ case column[0]
1181
+ when :library
1182
+ row << item.shelf.library.display_name.localize
1183
+ when :acquired_at
1184
+ row << item.acquired_at.strftime("%Y/%m/%d") if item.acquired_at
1185
+ when :bookstore
1186
+ bookstore = ""
1187
+ bookstore = item.bookstore.name if item.bookstore and item.bookstore.name
1188
+ row << bookstore
1189
+ when :volume_number_string
1190
+ row << item.manifestation.volume_number_string
1191
+ when :issue_number_string
1192
+ row << item.manifestation.issue_number_string
1193
+ when :serial_number_string
1194
+ row << item.manifestation.serial_number_string
1195
+ when :title
1196
+ row << item.manifestation.original_title
1197
+ else
1198
+ row << get_object_method(item, column[0].split('.')).to_s.gsub(/\r\n|\r|\n/," ").gsub(/\"/,"\"\"")
1199
+ end
1200
+ end
1201
+ data << '"'+row.join("\"\t\"")+"\"\n"
1202
+ end
1203
+ return data
1204
+ end
1205
+ end
1206
+
1207
+ # == Schema Information
1208
+ #
1209
+ # Table name: items
1210
+ #
1211
+ # id :integer not null, primary key
1212
+ # call_number :string(255)
1213
+ # item_identifier :string(255)
1214
+ # circulation_status_id :integer not null
1215
+ # checkout_type_id :integer default(1), not null
1216
+ # created_at :datetime
1217
+ # updated_at :datetime
1218
+ # deleted_at :datetime
1219
+ # shelf_id :integer default(1), not null
1220
+ # include_supplements :boolean default(FALSE), not null
1221
+ # checkouts_count :integer default(0), not null
1222
+ # owns_count :integer default(0), not null
1223
+ # resource_has_subjects_count :integer default(0), not null
1224
+ # note :text
1225
+ # curl :string(255)
1226
+ # price :integer
1227
+ # lock_version :integer default(0), not null
1228
+ # required_role_id :integer default(1), not null
1229
+ # state :string(255)
1230
+ # required_score :integer default(0), not null
1231
+ # acquired_at :datetime
1232
+ # bookstore_id :integer
1233
+ #
1234
+