1 package OpenILS::Application::Storage::Publisher::asset;
2 use base qw/OpenILS::Application::Storage/;
3 #use OpenILS::Application::Storage::CDBI::asset;
4 #use OpenSRF::Utils::Logger qw/:level/;
5 #use OpenILS::Utils::Fieldmapper;
7 #my $log = 'OpenSRF::Utils::Logger';
10 # see /home/miker/cn_browse-test.sql for page up and down sql ...
13 sub cn_browse_target {
19 my $cn = $args{label};
20 my $org = $args{org_unit};
21 my $depth = $args{depth};
22 my $size = $args{page_size} || 10;
26 my $table = asset::call_number->table;
28 my $descendants = "actor.org_unit_descendants($org)";
30 $descendants = "actor.org_unit_descendants($org,$depth)";
33 my $top_sql = <<" SQL";
43 on (d.id = cn.owning_lib)
46 order by 1 desc, 4, 2, 3
52 my $bottom_sql = <<" SQL";
61 on (d.id = cn.owning_lib)
68 my $sth = asset::call_number->db_Main->prepare($top_sql);
70 while ( my $row = $sth->fetchrow_hashref ) {
71 $client->respond($row);
75 $sth = asset::call_number->db_Main->prepare($bottom_sql);
77 while ( my $row = $sth->fetchrow_hashref ) {
78 $client->respond($row);
84 __PACKAGE__->register_method(
85 method => 'cn_browse_target',
86 api_name => 'open-ils.storage.asset.call_number.browse.target',
99 return unless ($cp && $org);
101 $cp = $cp->id if (ref $cp);
102 $cp = asset::copy->retrieve($cp);
103 return 999 unless $copy;
104 my $ol = $cp->call_number->owning_lib;
106 return asset::copy->db_Main->selectcol_arrayref('SELECT actor.org_unit_proximity(?,?)',{},"$ol","$org")->[0];
108 __PACKAGE__->register_method(
109 method => 'copy_proximity',
110 api_name => 'open-ils.storage.asset.copy.proximity',
115 sub asset_copy_location_all {
119 for my $rec ( asset::copy_location->retrieve_all ) {
120 $client->respond( $rec->to_fieldmapper );
125 __PACKAGE__->register_method(
126 method => 'asset_copy_location_all',
127 api_name => 'open-ils.storage.direct.asset.copy_location.retrieve.all',
137 return undef unless (@ids);
139 @ids = ($ids[0]) unless ($self->api_name =~ /batch/o);
141 for my $id ( @ids ) {
143 my $cp = asset::copy->retrieve($id);
145 my $cp_fm = $cp->to_fieldmapper;
146 $cp_fm->circ_lib( $cp->circ_lib->to_fieldmapper );
147 $cp_fm->location( $cp->location->to_fieldmapper );
148 $cp_fm->status( $cp->status->to_fieldmapper );
149 $cp_fm->stat_cat_entries( [ map { $_->to_fieldmapper } $cp->stat_cat_entries ] );
151 $client->respond( $cp_fm );
156 __PACKAGE__->register_method(
157 api_name => 'open-ils.storage.fleshed.asset.copy.batch.retrieve',
158 method => 'fleshed_copy',
162 __PACKAGE__->register_method(
163 api_name => 'open-ils.storage.fleshed.asset.copy.retrieve',
164 method => 'fleshed_copy',
168 sub fleshed_copy_by_barcode {
173 my ($cp) = asset::copy->search( { barcode => $bc } );
175 return undef unless ($cp);
177 my $cp_fm = $cp->to_fieldmapper;
178 $cp_fm->circ_lib( $cp->circ_lib->to_fieldmapper );
179 $cp_fm->location( $cp->location->to_fieldmapper );
180 $cp_fm->status( $cp->status->to_fieldmapper );
184 __PACKAGE__->register_method(
185 api_name => 'open-ils.storage.fleshed.asset.copy.search.barcode',
186 method => 'fleshed_copy_by_barcode',
191 #XXX Fix stored proc calls
192 sub ranged_asset_stat_cat {
197 return undef unless ($ou);
198 my $s_table = asset::stat_cat->table;
200 my $select = <<" SQL";
203 JOIN actor.org_unit_full_path(?) p ON (p.id = s.owner)
208 $fleshed = 1 if ($self->api_name =~ /fleshed/o);
210 my $sth = asset::stat_cat->db_Main->prepare_cached($select);
213 for my $sc ( map { asset::stat_cat->construct($_) } $sth->fetchall_hash ) {
214 my $sc_fm = $sc->to_fieldmapper;
216 [ $self->method_lookup( 'open-ils.storage.ranged.asset.stat_cat_entry.search.stat_cat' )->run($ou,$sc->id) ]
218 $client->respond( $sc_fm );
223 __PACKAGE__->register_method(
224 api_name => 'open-ils.storage.ranged.fleshed.asset.stat_cat.all',
227 method => 'ranged_asset_stat_cat',
230 __PACKAGE__->register_method(
231 api_name => 'open-ils.storage.ranged.asset.stat_cat.all',
234 method => 'ranged_asset_stat_cat',
238 #XXX Fix stored proc calls
239 sub multiranged_asset_stat_cat {
244 return undef unless (defined($ous) and @$ous);
245 my $s_table = asset::stat_cat->table;
247 my $select = <<" SQL";
250 WHERE s.owner IN ( XXX )
254 my $collector = ' INTERSECT ';
255 my $entry_method = 'open-ils.storage.multiranged.intersect.asset.stat_cat_entry.search.stat_cat';
256 if ($self->api_name =~ /union/o) {
257 $collector = ' UNION ';
258 $entry_method = 'open-ils.storage.multiranged.union.asset.stat_cat_entry.search.stat_cat';
261 my $binds = join($collector, map { 'SELECT id FROM actor.org_unit_full_path(?)' } grep {defined} @$ous);
262 $select =~ s/XXX/$binds/so;
265 $fleshed = 1 if ($self->api_name =~ /fleshed/o);
267 my $sth = asset::stat_cat->db_Main->prepare_cached($select);
268 $sth->execute(map { "$_" } grep {defined} @$ous);
270 for my $sc ( map { asset::stat_cat->construct($_) } $sth->fetchall_hash ) {
271 my $sc_fm = $sc->to_fieldmapper;
273 [ $self->method_lookup( $entry_method )->run($ous, $sc->id) ]
275 $client->respond( $sc_fm );
280 __PACKAGE__->register_method(
281 api_name => 'open-ils.storage.multiranged.intersect.fleshed.asset.stat_cat.all',
284 method => 'multiranged_asset_stat_cat',
286 __PACKAGE__->register_method(
287 api_name => 'open-ils.storage.multiranged.union.fleshed.asset.stat_cat.all',
290 method => 'multiranged_asset_stat_cat',
293 #XXX Fix stored proc calls
294 sub ranged_asset_stat_cat_entry {
300 return undef unless ($ou);
301 my $s_table = asset::stat_cat_entry->table;
303 my $select = <<" SQL";
306 JOIN actor.org_unit_full_path(?) p ON (p.id = s.owner)
311 my $sth = asset::stat_cat->db_Main->prepare_cached($select);
312 $sth->execute($ou,$sc);
314 for my $sce ( map { asset::stat_cat_entry->construct($_) } $sth->fetchall_hash ) {
315 $client->respond( $sce->to_fieldmapper );
320 __PACKAGE__->register_method(
321 api_name => 'open-ils.storage.ranged.asset.stat_cat_entry.search.stat_cat',
324 method => 'ranged_asset_stat_cat_entry',
327 #XXX Fix stored proc calls
328 sub multiranged_asset_stat_cat_entry {
334 return undef unless (defined($ous) and @$ous);
335 my $s_table = asset::stat_cat_entry->table;
337 my $collector = ' INTERSECT ';
338 $collector = ' UNION ' if ($self->api_name =~ /union/o);
340 my $select = <<" SQL";
343 WHERE s.owner IN ( XXX ) and s.stat_cat = ?
347 my $binds = join($collector, map { 'SELECT id FROM actor.org_unit_full_path(?)' } grep {defined} @$ous);
348 $select =~ s/XXX/$binds/so;
350 my $sth = asset::stat_cat->db_Main->prepare_cached($select);
351 $sth->execute(map {"$_"} @$ous,$sc);
353 for my $sce ( map { asset::stat_cat_entry->construct($_) } $sth->fetchall_hash ) {
354 $client->respond( $sce->to_fieldmapper );
359 __PACKAGE__->register_method(
360 api_name => 'open-ils.storage.multiranged.intersect.asset.stat_cat_entry.search.stat_cat',
363 method => 'multiranged_asset_stat_cat_entry',
365 __PACKAGE__->register_method(
366 api_name => 'open-ils.storage.multiranged.union.asset.stat_cat_entry.search.stat_cat',
369 method => 'multiranged_asset_stat_cat_entry',