Add entry to "catalogue" that has a diacritical in the title, for
[sitka/SIPServer.git] / ILS / Item.pm
1 #
2 # ILS::Item.pm
3
4 # A Class for hiding the ILS's concept of the item from the OpenSIP
5 # system
6 #
7
8 package ILS::Item;
9
10 use strict;
11 use warnings;
12
13 use Sys::Syslog qw(syslog);
14
15 use ILS::Transaction;
16
17 our %item_db = (
18                 '1565921879' => {
19                                  title => "Perl 5 desktop reference",
20                                  id => '1565921879',
21                                  sip_media_type => '001',
22                                  magnetic_media => 0,
23                                  hold_queue => [],
24                                 },
25                 '0440242746' => {
26                                  title => "The deep blue alibi",
27                                  id => '0440242746',
28                                  sip_media_type => '001',
29                                  magnetic_media => 0,
30                                  hold_queue => [],
31                 },
32                 '660' => {
33                                  title => "Harry Potter y el c´┐Żliz de fuego",
34                                  id => '660',
35                                  sip_media_type => '001',
36                                  magnetic_media => 0,
37                                  hold_queue => [],
38                          },
39                 );
40
41 sub new {
42     my ($class, $item_id) = @_;
43     my $type = ref($class) || $class;
44     my $self;
45
46
47     if (!exists($item_db{$item_id})) {
48         syslog("LOG_DEBUG", "new ILS::Item('%s'): not found", $item_id);
49         return undef;
50     }
51
52     $self = $item_db{$item_id};
53     bless $self, $type;
54
55     syslog("LOG_DEBUG", "new ILS::Item('%s'): found with title '%s'",
56            $item_id, $self->{title});
57
58     return $self;
59 }
60
61 sub magnetic {
62     my $self = shift;
63
64     return $self->{magnetic_media};
65 }
66
67 sub sip_media_type {
68     my $self = shift;
69
70     return $self->{sip_media_type};
71 }
72
73 sub sip_item_properties {
74     my $self = shift;
75
76     return $self->{sip_item_properties};
77 }
78
79 sub status_update {
80     my ($self, $props) = @_;
81     my $status = new ILS::Transaction;
82
83     $self->{sip_item_properties} = $props;
84     $status->{ok} = 1;
85
86     return $status;
87 }
88
89     
90 sub id {
91     my $self = shift;
92
93     return $self->{id};
94 }
95
96 sub title_id {
97     my $self = shift;
98
99     return $self->{title};
100 }
101
102 sub permanent_location {
103     my $self = shift;
104
105     return $self->{permanent_location} || '';
106 }
107
108 sub current_location {
109     my $self = shift;
110
111     return $self->{current_location} || '';
112 }
113
114 sub sip_circulation_status {
115     my $self = shift;
116
117     if ($self->{patron}) {
118         return '04';
119     } elsif (scalar @{$self->{hold_queue}}) {
120         return '08';
121     } else {
122         return '03';
123     }
124 }
125
126 sub sip_security_marker {
127     return '02';
128 }
129
130 sub sip_fee_type {
131     return '01';
132 }
133
134 sub fee {
135     my $self = shift;
136
137     return $self->{fee} || 0;
138 }
139
140 sub fee_currency {
141     my $self = shift;
142
143     return $self->{currency} || 'CAD';
144 }
145
146 sub owner {
147     my $self = shift;
148
149     return 'UWOLS';
150 }
151
152 sub hold_queue {
153     my $self = shift;
154
155     return $self->{hold_queue};
156 }
157
158 sub hold_queue_position {
159     my ($self, $patron_id) = @_;
160     my $i;
161
162     for ($i = 0; $i < scalar @{$self->{hold_queue}}; $i += 1) {
163         if ($self->{hold_queue}[$i]->{patron_id} eq $patron_id) {
164             return $i + 1;
165         }
166     }
167     return 0;
168 }
169
170 sub due_date {
171     my $self = shift;
172
173     return $self->{due_date} || 0;
174 }
175
176 sub recall_date {
177     my $self = shift;
178
179     return $self->{recall_date} || 0;
180 }
181
182 sub hold_pickup_date {
183     my $self = shift;
184
185     return $self->{hold_pickup_date} || 0;
186 }
187
188 sub screen_msg {
189     my $self = shift;
190
191     return $self->{screen_msg} || '';
192 }
193
194 sub print_line {
195      my $self = shift;
196
197      return $self->{print_line} || '';
198 }
199
200 # An item is available for a patron if
201 # 1) It's not checked out and (there's no hold queue OR patron
202 #    is at the front of the queue)
203 # OR
204 # 2) It's checked out to the patron and there's no hold queue
205 sub available {
206      my ($self, $for_patron) = @_;
207
208      return ((!defined($self->{patron_id}) && (!scalar @{$self->{hold_queue}}
209                                                || ($self->{hold_queue}[0] eq $for_patron)))
210              || ($self->{patron_id} && ($self->{patron_id} eq $for_patron)
211                  && !scalar @{$self->{hold_queue}}));
212 }
213
214 1;