]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/SIP/Item.pm
Enable the SIP server to speak UTF8 or ASCII, defaulting to ASCII
[working/Evergreen.git] / Open-ILS / src / perlmods / OpenILS / SIP / Item.pm
1 package OpenILS::SIP::Item;
2 use strict; use warnings;
3
4 use Sys::Syslog qw(syslog);
5
6 use OpenILS::SIP;
7 use OpenILS::SIP::Transaction;
8 use OpenILS::Application::AppUtils;
9 use OpenILS::Application::Circ::ScriptBuilder;
10 use Data::Dumper;
11 use OpenILS::Const qw/:const/;
12 use OpenSRF::Utils qw/:datetime/;
13 use DateTime::Format::ISO8601;
14 my $U = 'OpenILS::Application::AppUtils';
15
16 my %item_db;
17
18 sub new {
19     my ($class, $item_id) = @_;
20     my $type = ref($class) || $class;
21     my $self = bless( {}, $type );
22
23         syslog('LOG_DEBUG', "OILS: Loading item $item_id...");
24         return undef unless $item_id;
25
26         my $e = OpenILS::SIP->editor();
27
28         my $copy = $e->search_asset_copy(
29                 [
30                         { barcode => $item_id, deleted => 'f' },
31                         {
32                                 flesh => 3,
33                                 flesh_fields => {
34                                         acp => [ 'circ_lib', 'call_number', 'status' ],
35                                         acn => [ 'owning_lib', 'record' ],
36                                 }
37                         }
38                 ]
39         );
40
41
42         $copy = $$copy[0];
43
44         if(!$copy) {
45                 syslog("LOG_DEBUG", "OILS: Item '%s' : not found", $item_id);
46                 return undef;
47         }
48
49         my ($circ) = $U->fetch_open_circulation($copy->id);
50         if($circ) {
51                 # if i am checked out, set $self->{patron} to the user's barcode
52                 my $user = $e->retrieve_actor_user(
53                         [
54                                 $circ->usr,
55                                 { flesh => 1, flesh_fields => { "au" => [ 'card' ] } }
56                         ]
57                 );
58
59                 my $bc = ($user) ? $user->card->barcode : "";
60                 $self->{patron} = $bc;
61                 $self->{patron_object} = $user;
62
63                 syslog('LOG_DEBUG', "OILS: Open circulation exists on $item_id : user = $bc");
64         }
65
66         $self->{id}                     = $item_id;
67         $self->{copy}           = $copy;
68         $self->{volume} = $copy->call_number;
69         $self->{record} = $copy->call_number->record;
70         $self->{mods}           = $U->record_to_mvr($self->{record}) if $self->{record}->marc;
71
72         syslog("LOG_DEBUG", "OILS: Item('$item_id'): found with title '%s'", $self->title_id);
73
74         return $self;
75 }
76
77 sub run_attr_script {
78         my $self = shift;
79         return 1 if $self->{ran_script};
80         $self->{ran_script} = 1;
81
82         my $config = OpenILS::SIP->config();
83         my $path = $config->{implementation_config}->{scripts}->{path};
84         my $item_config_script = $config->{implementation_config}->{scripts}->{item_config};
85
86         $path = ref($path) eq 'ARRAY' ? $path : [$path];
87
88         syslog('LOG_DEBUG', "OILS: Script path = $path, Item config script = $item_config_script");
89
90         my $runner = 
91                 OpenILS::Application::Circ::ScriptBuilder->build(
92                         {
93                                 copy => $self->{copy},
94                                 editor => OpenILS::SIP->editor(),
95                         }
96                 );
97
98         $runner->add_path($_) for @$path;
99         $runner->load($item_config_script);
100
101         unless( $self->{item_config_result} = $runner->run ) {
102                 $runner->cleanup;
103                 warn "Item config script [$path : $item_config_script] failed to run: $@\n";
104                 syslog('LOG_ERR', "OILS: Item config script [$path : $item_config_script] failed to run: $@");
105                 return undef;
106         }
107
108         $runner->cleanup;
109         return 1;
110 }
111
112 sub magnetic {
113     my $self = shift;
114          return 0 unless $self->run_attr_script;
115          my $mag = $self->{item_config_result}->{item_config}->{magneticMedia};
116          syslog('LOG_DEBUG', "OILS: magnetic = $mag");
117          return ($mag and $mag eq 't') ? 1 : 0;
118 }
119
120 sub sip_media_type {
121     my $self = shift;
122          return 0 unless $self->run_attr_script;
123          my $media = $self->{item_config_result}->{item_config}->{SIPMediaType};
124          syslog('LOG_DEBUG', "OILS: media type = $media");
125          return ($media) ? $media : '001';
126 }
127
128 sub sip_item_properties {
129     my $self = shift;
130          return "";
131 }
132
133 sub status_update {
134     my ($self, $props) = @_;
135     my $status = OpenILS::SIP::Transaction->new;
136     $self->{sip_item_properties} = $props;
137     $status->{ok} = 1;
138     return $status;
139 }
140
141
142 sub id {
143     my $self = shift;
144     return $self->{id};
145 }
146
147 sub title_id {
148     my $self = shift;
149     my $t =  ($self->{mods}) ? $self->{mods}->title : $self->{copy}->dummy_title;
150     $t = OpenILS::SIP::clean_text($t);
151
152     return $t;
153 }
154
155 sub permanent_location {
156     my $self = shift;
157     return OpenILS::SIP::clean_text($self->{volume}->owning_lib->name);
158 }
159
160 sub current_location {
161     my $self = shift;
162     return OpenILS::SIP::clean_text($self->{copy}->circ_lib->name);
163 }
164
165
166 # 2 chars 0-99 
167 # 01 Other
168 # 02 On order
169 # 03 Available
170 # 04 Charged
171 # 05 Charged; not to be recalled until earliest recall date
172 # 06 In process
173 # 07 Recalled
174 # 08 Waiting on hold shelf
175 # 09 Waiting to be re-shelved
176 # 10 In transit between library locations
177 # 11 Claimed returned
178 # 12 Lost
179 # 13 Missing 
180 sub sip_circulation_status {
181         my $self = shift;
182         my $stat = $self->{copy}->status->id;
183
184         return '02' if $stat == OILS_COPY_STATUS_ON_ORDER;
185         return '03' if $stat == OILS_COPY_STATUS_AVAILABLE;
186         return '04' if $stat == OILS_COPY_STATUS_CHECKED_OUT;
187         return '06' if $stat == OILS_COPY_STATUS_IN_PROCESS;
188         return '08' if $stat == OILS_COPY_STATUS_ON_HOLDS_SHELF;
189         return '09' if $stat == OILS_COPY_STATUS_RESHELVING;
190         return '10' if $stat == OILS_COPY_STATUS_IN_TRANSIT;
191         return '12' if $stat == OILS_COPY_STATUS_LOST;
192         return '13' if $stat == OILS_COPY_STATUS_MISSING;
193                 
194         return 01;
195 }
196
197 sub sip_security_marker {
198     return '02';
199 }
200
201 sub sip_fee_type {
202     return '01';
203 }
204
205 sub fee {
206     my $self = shift;
207          return 0;
208 }
209
210
211 sub fee_currency {
212         my $self = shift;
213         return OpenILS::SIP->config()->{implementation_config}->{currency};
214 }
215
216 sub owner {
217     my $self = shift;
218     return OpenILS::SIP::clean_text($self->{volume}->owning_lib->name);
219 }
220
221 sub hold_queue {
222     my $self = shift;
223          return [];
224 }
225
226 sub hold_queue_position {
227     my ($self, $patron_id) = @_;
228          return 1;
229 }
230
231 sub due_date {
232         my $self = shift;
233
234         # this should force correct circ fetching
235         require OpenILS::Utils::CStoreEditor;
236         my $e = OpenILS::Utils::CStoreEditor->new(xact => 1);
237         #my $e = OpenILS::SIP->editor();
238
239         my $circ = $e->search_action_circulation(
240                 { target_copy => $self->{copy}->id, checkin_time => undef } )->[0];
241
242         $e->rollback;
243
244         if( !$circ ) {
245                 syslog('LOG_INFO', "OILS: No open circ found for copy");
246                 return 0;
247         }
248
249         my $due = OpenILS::SIP->format_date($circ->due_date, 'due');
250         syslog('LOG_DEBUG', "OILS: Found item due date = $due");
251         return $due;
252 }
253
254 sub recall_date {
255     my $self = shift;
256     return 0;
257 }
258
259 sub hold_pickup_date {
260     my $self = shift;
261          return 0;
262 }
263
264 # message to display on console
265 sub screen_msg {
266     my $self = shift;
267     return OpenILS::SIP::clean_text($self->{screen_msg}) || '';
268 }
269
270
271 # reciept printer
272 sub print_line {
273      my $self = shift;
274      return OpenILS::SIP::clean_text($self->{print_line}) || '';
275 }
276
277
278 # An item is available for a patron if
279 # 1) It's not checked out and (there's no hold queue OR patron
280 #    is at the front of the queue)
281 # OR
282 # 2) It's checked out to the patron and there's no hold queue
283 sub available {
284         my ($self, $for_patron) = @_;
285
286         my $stat = $self->{copy}->status->id;
287         return 1 if 
288                 $stat == OILS_COPY_STATUS_AVAILABLE or
289                 $stat == OILS_COPY_STATUS_RESHELVING;
290         
291         return 0;
292 }
293
294
295 1;