f533679e886d808d5b08e79400ad80517fb6e5e6
[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                 );
33
34 sub new {
35     my ($class, $item_id) = @_;
36     my $type = ref($class) || $class;
37     my $self;
38
39
40     if (!exists($item_db{$item_id})) {
41         syslog("LOG_DEBUG", "new ILS::Item('%s'): not found", $item_id);
42         return undef;
43     }
44
45     $self = $item_db{$item_id};
46     bless $self, $type;
47
48     syslog("LOG_DEBUG", "new ILS::Item('%s'): found with title '%s'",
49            $item_id, $self->{title});
50
51     return $self;
52 }
53
54 sub magnetic {
55     my $self = shift;
56
57     return $self->{magnetic_media};
58 }
59
60 sub sip_media_type {
61     my $self = shift;
62
63     return $self->{sip_media_type};
64 }
65
66 sub sip_item_properties {
67     my $self = shift;
68
69     return $self->{sip_item_properties};
70 }
71
72 sub status_update {
73     my ($self, $props) = @_;
74     my $status = new ILS::Transaction;
75
76     $self->{sip_item_properties} = $props;
77     $status->{ok} = 1;
78
79     return $status;
80 }
81
82     
83 sub id {
84     my $self = shift;
85
86     return $self->{id};
87 }
88
89 sub title_id {
90     my $self = shift;
91
92     return $self->{title};
93 }
94
95 sub permanent_location {
96     my $self = shift;
97
98     return $self->{permanent_location} || '';
99 }
100
101 sub current_location {
102     my $self = shift;
103
104     return $self->{current_location} || '';
105 }
106
107 sub sip_circulation_status {
108     my $self = shift;
109
110     if ($self->{patron}) {
111         return '04';
112     } elsif (scalar @{$self->{hold_queue}}) {
113         return '08';
114     } else {
115         return '03';
116     }
117 }
118
119 sub sip_security_marker {
120     return '02';
121 }
122
123 sub sip_fee_type {
124     return '01';
125 }
126
127 sub fee {
128     my $self = shift;
129
130     return $self->{fee} || 0;
131 }
132
133 sub fee_currency {
134     my $self = shift;
135
136     return $self->{currency} || 'CAD';
137 }
138
139 sub owner {
140     my $self = shift;
141
142     return 'UWOLS';
143 }
144
145 sub hold_queue {
146     my $self = shift;
147
148     return $self->{hold_queue};
149 }
150
151 sub hold_queue_position {
152     my ($self, $patron_id) = @_;
153     my $i;
154
155     for ($i = 0; $i < scalar @{$self->{hold_queue}}; $i += 1) {
156         if ($self->{hold_queue}[$i]->{patron_id} eq $patron_id) {
157             return $i + 1;
158         }
159     }
160     return 0;
161 }
162
163 sub due_date {
164     my $self = shift;
165
166     return $self->{due_date} || 0;
167 }
168
169 sub recall_date {
170     my $self = shift;
171
172     return $self->{recall_date} || 0;
173 }
174
175 sub hold_pickup_date {
176     my $self = shift;
177
178     return $self->{hold_pickup_date} || 0;
179 }
180
181 sub screen_msg {
182     my $self = shift;
183
184     return $self->{screen_msg} || '';
185 }
186
187 sub print_line {
188      my $self = shift;
189
190      return $self->{print_line} || '';
191 }
192
193 # An item is available for a patron if
194 # 1) It's not checked out and (there's no hold queue OR patron
195 #    is at the front of the queue)
196 # OR
197 # 2) It's checked out to the patron and there's no hold queue
198 sub available {
199      my ($self, $for_patron) = @_;
200
201      return ((!defined($self->{patron_id}) && (!scalar @{$self->{hold_queue}}
202                                                || ($self->{hold_queue}[0] eq $for_patron)))
203              || ($self->{patron_id} && ($self->{patron_id} eq $for_patron)
204                  && !scalar @{$self->{hold_queue}}));
205 }
206
207 1;