enju_standalone_interface 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+