Bug 2400 [17/18]: fixing pod syntax in C4/SIP/ILS/Item.pm
[koha-equinox.git] / C4 / SIP / 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 use C4::Debug;
18 use C4::Context;
19 use C4::Biblio;
20 use C4::Items;
21 use C4::Circulation;
22 use C4::Members;
23 use C4::Reserves;
24
25 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
26
27 BEGIN {
28         $VERSION = 2.00;
29         require Exporter;
30         @ISA = qw(Exporter);
31         @EXPORT_OK = qw();
32 }
33
34 =head2 EXAMPLE
35
36 our %item_db = (
37                 '1565921879' => {
38                                  title => "Perl 5 desktop reference",
39                                  id => '1565921879',
40                                  sip_media_type => '001',
41                                  magnetic_media => 0,
42                                  hold_queue => [],
43                                 },
44                 '0440242746' => {
45                                  title => "The deep blue alibi",
46                                  id => '0440242746',
47                                  sip_media_type => '001',
48                                  magnetic_media => 0,
49                                  hold_queue => [],
50                 },
51                 '660' => {
52                                  title => "Harry Potter y el cáliz de fuego",
53                                  id => '660',
54                                  sip_media_type => '001',
55                                  magnetic_media => 0,
56                                  hold_queue => [],
57                          },
58                 );
59 =cut
60
61 sub priority_sort {
62         defined $a->{priority} or return -1;
63         defined $b->{priority} or return 1;
64         return $a->{priority} <=> $b->{priority};
65 }
66
67 sub new {
68         my ($class, $item_id) = @_;
69         my $type = ref($class) || $class;
70         my $self;
71         my $item = GetBiblioFromItemNumber( GetItemnumberFromBarcode($item_id) );
72         
73         if (! $item) {
74                 syslog("LOG_DEBUG", "new ILS::Item('%s'): not found", $item_id);
75                 warn "new ILS::Item($item_id) : No item '$item_id'.";
76                 return undef;
77         }
78     $item->{'id'} = $item->{'barcode'};
79         # check if its on issue and if so get the borrower
80         my $issue = GetItemIssue($item->{'itemnumber'});
81         my $borrower = GetMember($issue->{'borrowernumber'},'borrowernumber');
82         $item->{patron} = $borrower->{'cardnumber'};
83         my @reserves = (@{ GetReservesFromBiblionumber($item->{biblionumber}) });
84         $item->{hold_queue} = [ sort priority_sort @reserves ];
85         $item->{joetest} = 111;
86         $self = $item;
87         bless $self, $type;
88
89     syslog("LOG_DEBUG", "new ILS::Item('%s'): found with title '%s'",
90            $item_id, $self->{title});
91
92     return $self;
93 }
94
95 sub magnetic {
96     my $self = shift;
97     return $self->{magnetic_media};
98 }
99 sub sip_media_type {
100     my $self = shift;
101     return $self->{sip_media_type};
102 }
103 sub sip_item_properties {
104     my $self = shift;
105     return $self->{sip_item_properties};
106 }
107
108 sub status_update {
109     my ($self, $props) = @_;
110     my $status = new ILS::Transaction;
111     $self->{sip_item_properties} = $props;
112     $status->{ok} = 1;
113     return $status;
114 }
115     
116 sub id {
117     my $self = shift;
118     return $self->{id};
119 }
120 sub title_id {
121     my $self = shift;
122     return $self->{title};
123 }
124 sub permanent_location {
125     my $self = shift;
126     return $self->{permanent_location} || '';
127 }
128 sub current_location {
129     my $self = shift;
130     return $self->{current_location} || '';
131 }
132
133 sub sip_circulation_status {
134     my $self = shift;
135     if ($self->{patron}) {
136                 return '04';
137     } elsif (scalar @{$self->{hold_queue}}) {
138                 return '08';
139     } else {
140                 return '03';
141     }
142 }
143
144 sub sip_security_marker {
145     return '02';
146 }
147 sub sip_fee_type {
148     return '01';
149 }
150
151 sub fee {
152     my $self = shift;
153     return $self->{fee} || 0;
154 }
155 sub fee_currency {
156     my $self = shift;
157     return $self->{currency} || 'USD';
158 }
159 sub owner {
160     my $self = shift;
161     return 'CPL';       # FIXME: UWOLS was hardcoded 
162 }
163 sub hold_queue {
164     my $self = shift;
165         (defined $self->{hold_queue}) or return [];
166     return $self->{hold_queue};
167 }
168
169 sub hold_queue_position {
170         my ($self, $patron_id) = @_;
171         ($self->{hold_queue}) or return 0;
172         my $i = 0;
173         foreach (@{$self->{hold_queue}}) {
174                 $i++;
175                 $_->{patron_id} or next;
176                 if ($_->{patron_id} eq $patron_id) {
177                         return $i;
178                 }
179         }
180     return 0;
181 }
182
183 sub due_date {
184     my $self = shift;
185     return $self->{due_date} || 0;
186 }
187 sub recall_date {
188     my $self = shift;
189     return $self->{recall_date} || 0;
190 }
191 sub hold_pickup_date {
192     my $self = shift;
193     return $self->{hold_pickup_date} || 0;
194 }
195 sub screen_msg {
196     my $self = shift;
197     return $self->{screen_msg} || '';
198 }
199 sub print_line {
200         my $self = shift;
201         return $self->{print_line} || '';
202 }
203
204 # An item is available for a patron if it is:
205 # 1) checked out to the same patron and there's no hold queue
206 # OR
207 # 2) not checked out and (there's no hold queue OR patron
208 #    is at the front of the queue)
209 sub available {
210         my ($self, $for_patron) = @_;
211         my $count = (defined $self->{hold_queue}) ? scalar @{$self->{hold_queue}} : 0;
212         print STDERR "availability check: hold_queue size $count\n";
213     if (defined($self->{patron_id})) {
214                 ($self->{patron_id} eq $for_patron) or return 0;
215                 return ($count ? 0 : 1);
216         } else {        # not checked out
217                 ($count) or return 1;
218                 ($self->{hold_queue}[0] eq $for_patron) and return 1;
219         }
220         return 0;
221 }
222
223 1;
224 __END__
225