1 # ---------------------------------------------------------------
2 # Copyright (C) 2006 Georgia Public Library Service
3 # Bill Erickson <billserickson@gmail.com>
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 # ---------------------------------------------------------------
16 package OpenILS::Application::Circ::StatCat;
17 use base qw/OpenSRF::Application/;
18 use strict; use warnings;
20 use OpenSRF::Utils::Logger qw($logger);
21 use OpenSRF::EX qw/:try/;
22 use OpenILS::Application::AppUtils;
23 my $apputils = "OpenILS::Application::AppUtils";
28 __PACKAGE__->register_method(
29 method => "retrieve_stat_cat_list",
31 api_name => "open-ils.circ.stat_cat.actor.retrieve.batch");
33 __PACKAGE__->register_method(
34 method => "retrieve_stat_cat_list",
36 api_name => "open-ils.circ.stat_cat.asset.retrieve.batch");
38 # retrieves all of the stat cats for a given org unit
39 # if no orgid, user_session->home_ou is used
41 sub retrieve_stat_cat_list {
42 my( $self, $client, $user_session, @sc ) = @_;
48 my $method = "open-ils.storage.fleshed.actor.stat_cat.retrieve.batch.atomic";
49 if( $self->api_name =~ /asset/ ) {
50 $method = "open-ils.storage.fleshed.asset.stat_cat.retrieve.batch.atomic";
53 my $user_obj = $apputils->check_user_session($user_session);
55 my $cats = $apputils->simple_scalar_request(
56 "open-ils.storage", $method, @sc);
58 return [ sort { $a->name cmp $b->name } @$cats ];
61 __PACKAGE__->register_method(
62 method => "retrieve_stat_cats",
63 api_name => "open-ils.circ.stat_cat.actor.retrieve.all");
65 __PACKAGE__->register_method(
66 method => "retrieve_stat_cats",
67 api_name => "open-ils.circ.stat_cat.asset.retrieve.all");
69 # retrieves all of the stat cats for a given org unit
70 # if no orgid, user_session->home_ou is used
72 sub retrieve_stat_cats {
73 my( $self, $client, $user_session, $orgid ) = @_;
75 my $method = "open-ils.storage.ranged.fleshed.actor.stat_cat.all.atomic";
76 if( $self->api_name =~ /asset/ ) {
77 $method = "open-ils.storage.ranged.fleshed.asset.stat_cat.all.atomic";
80 my $user_obj = $apputils->check_user_session($user_session);
81 if(!$orgid) { $orgid = $user_obj->home_ou; }
82 my $cats = $apputils->simple_scalar_request(
83 "open-ils.storage", $method, $orgid );
85 return [ sort { $a->name cmp $b->name } @$cats ];
89 __PACKAGE__->register_method(
90 method => "retrieve_ranged_intersect_stat_cats",
91 api_name => "open-ils.circ.stat_cat.asset.multirange.intersect.retrieve");
93 sub retrieve_ranged_intersect_stat_cats {
94 my( $self, $client, $user_session, $orglist ) = @_;
96 my $user_obj = $apputils->check_user_session($user_session);
97 if(!$orglist) { $orglist = [ $user_obj->home_ou ]; }
100 my %hash = map { ($_ => 1) } @$orglist;
101 $orglist = [ keys %hash ];
103 warn "range: @$orglist\n";
105 my $method = "open-ils.storage.multiranged.intersect.fleshed.asset.stat_cat.all.atomic";
106 return $apputils->simple_scalar_request(
107 "open-ils.storage", $method, $orglist );
111 __PACKAGE__->register_method(
112 method => "retrieve_ranged_union_stat_cats",
113 api_name => "open-ils.circ.stat_cat.asset.multirange.union.retrieve");
115 sub retrieve_ranged_union_stat_cats {
116 my( $self, $client, $user_session, $orglist ) = @_;
118 my $method = "open-ils.storage.multiranged.union.fleshed.asset.stat_cat.all.atomic";
120 warn "Retrieving stat_cats with method $method and orgs " . Dumper($orglist) . "\n";
122 my $user_obj = $apputils->check_user_session($user_session);
123 if(!$orglist) { $orglist = [ $user_obj->home_ou ]; }
126 my %hash = map { ($_ => 1) } @$orglist;
127 $orglist = [ keys %hash ];
129 warn "range: @$orglist\n";
131 return $apputils->simple_scalar_request(
132 "open-ils.storage", $method, $orglist );
137 __PACKAGE__->register_method(
138 method => "stat_cat_create",
139 api_name => "open-ils.circ.stat_cat.asset.create");
141 __PACKAGE__->register_method(
142 method => "stat_cat_create",
143 api_name => "open-ils.circ.stat_cat.actor.create");
145 sub stat_cat_create {
146 my( $self, $client, $user_session, $stat_cat ) = @_;
148 my $method = "open-ils.storage.direct.actor.stat_cat.create";
149 my $entry_create = "open-ils.storage.direct.actor.stat_cat_entry.create";
150 my $perm = 'CREATE_PATRON_STAT_CAT';
151 my $eperm = 'CREATE_PATRON_STAT_CAT_ENTRY';
153 if($self->api_name =~ /asset/) {
154 $method = "open-ils.storage.direct.asset.stat_cat.create";
155 $entry_create = "open-ils.storage.direct.asset.stat_cat_entry.create";
156 $perm = 'CREATE_COPY_STAT_CAT_ENTRY';
159 #my $user_obj = $apputils->check_user_session($user_session);
160 #my $orgid = $user_obj->home_ou();
161 my( $user_obj, $evt ) = $apputils->checkses($user_session);
163 $evt = $apputils->check_perms($user_obj->id, $stat_cat->owner, $perm);
166 if($stat_cat->entries) {
167 $evt = $apputils->check_perms($user_obj->id, $stat_cat->owner, $eperm);
172 my $session = $apputils->start_db_session();
173 my $newid = _create_stat_cat($session, $stat_cat, $method);
175 if( ref($stat_cat->entries) ) {
176 for my $entry (@{$stat_cat->entries}) {
177 $entry->stat_cat($newid);
178 _create_stat_entry($session, $entry, $entry_create);
182 $apputils->commit_db_session($session);
184 $logger->debug("Stat cat creation successful with id $newid");
186 my $orgid = $user_obj->home_ou;
187 if( $self->api_name =~ /asset/ ) {
188 return _flesh_asset_cat($newid, $orgid);
190 return _flesh_user_cat($newid, $orgid);
195 sub _flesh_user_cat {
199 my $session = OpenSRF::AppSession->create("open-ils.storage");
200 my $cat = $session->request(
201 "open-ils.storage.direct.actor.stat_cat.retrieve",
206 "open-ils.storage.ranged.actor.stat_cat_entry.search.stat_cat.atomic",
207 $orgid, $id )->gather(1) );
213 sub _flesh_asset_cat {
217 my $session = OpenSRF::AppSession->create("open-ils.storage");
218 my $cat = $session->request(
219 "open-ils.storage.direct.asset.stat_cat.retrieve",
224 "open-ils.storage.ranged.asset.stat_cat_entry.search.stat_cat.atomic",
225 $orgid, $id )->gather(1) );
232 sub _create_stat_cat {
233 my( $session, $stat_cat, $method) = @_;
234 warn "Creating new stat cat with name " . $stat_cat->name . "\n";
235 $stat_cat->clear_id();
236 my $req = $session->request( $method, $stat_cat );
237 my $id = $req->gather(1);
239 throw OpenSRF::EX::ERROR
240 ("Error creating new statistical category"); }
242 warn "Stat cat create returned id $id\n";
247 sub _create_stat_entry {
248 my( $session, $stat_entry, $method) = @_;
250 warn "Creating new stat entry with value " . $stat_entry->value . "\n";
251 $stat_entry->clear_id();
253 my $req = $session->request($method, $stat_entry);
254 my $id = $req->gather(1);
256 warn "Stat entry " . Dumper($stat_entry) . "\n";
259 throw OpenSRF::EX::ERROR
260 ("Error creating new stat cat entry"); }
262 warn "Stat cat entry create returned id $id\n";
267 __PACKAGE__->register_method(
268 method => "update_stat_entry",
269 api_name => "open-ils.circ.stat_cat.actor.entry.update");
271 __PACKAGE__->register_method(
272 method => "update_stat_entry",
273 api_name => "open-ils.circ.stat_cat.asset.entry.update");
275 sub update_stat_entry {
276 my( $self, $client, $user_session, $entry ) = @_;
279 my $method = "open-ils.storage.direct.actor.stat_cat_entry.update";
280 my $perm = 'UPDATE_PATRON_STAT_CAT_ENTRY';
281 if($self->api_name =~ /asset/) {
282 $method = "open-ils.storage.direct.asset.stat_cat_entry.update";
283 $perm = 'UPDATE_COPY_STAT_CAT_ENTRY';
286 my( $user_obj, $evt ) = $apputils->checkses($user_session);
288 $evt = $apputils->check_perms( $user_obj->id, $entry->owner, $perm );
291 my $session = $apputils->start_db_session();
292 my $req = $session->request($method, $entry);
293 my $status = $req->gather(1);
294 $apputils->commit_db_session($session);
295 warn "stat cat entry with value " . $entry->value . " updated with status $status\n";
300 __PACKAGE__->register_method(
301 method => "update_stat",
302 api_name => "open-ils.circ.stat_cat.actor.update");
304 __PACKAGE__->register_method(
305 method => "update_stat",
306 api_name => "open-ils.circ.stat_cat.asset.update");
309 my( $self, $client, $user_session, $cat ) = @_;
311 my $method = "open-ils.storage.direct.actor.stat_cat.update";
312 my $perm = 'UPDATE_PATRON_STAT_CAT';
313 if($self->api_name =~ /asset/) {
314 $method = "open-ils.storage.direct.asset.stat_cat.update";
315 $perm = 'UPDATE_COPY_STAT_CAT';
318 my( $user_obj, $evt ) = $apputils->checkses($user_session);
320 $evt = $apputils->check_perms( $user_obj->id, $cat->owner, $perm );
323 my $session = $apputils->start_db_session();
324 my $req = $session->request($method, $cat);
325 my $status = $req->gather(1);
326 $apputils->commit_db_session($session);
327 warn "stat cat with id " . $cat->id . " updated with status $status\n";
332 __PACKAGE__->register_method(
333 method => "create_stat_entry",
334 api_name => "open-ils.circ.stat_cat.actor.entry.create");
336 __PACKAGE__->register_method(
337 method => "create_stat_entry",
338 api_name => "open-ils.circ.stat_cat.asset.entry.create");
340 sub create_stat_entry {
341 my( $self, $client, $user_session, $entry ) = @_;
343 my $method = "open-ils.storage.direct.actor.stat_cat_entry.create";
344 my $perm = 'CREATE_PATRON_STAT_CAT_ENTRY';
345 if($self->api_name =~ /asset/) {
346 $method = "open-ils.storage.direct.asset.stat_cat_entry.create";
347 $perm = 'CREATE_COPY_STAT_CAT_ENTRY';
350 my( $user_obj, $evt ) = $apputils->checkses($user_session);
352 $evt = $apputils->check_perms( $user_obj->id, $entry->owner, $perm );
356 my $session = $apputils->start_db_session();
357 my $req = $session->request($method, $entry);
358 my $status = $req->gather(1);
359 $apputils->commit_db_session($session);
361 warn "stat cat entry with id " . $status . " updated with status $status\n";
367 __PACKAGE__->register_method(
368 method => "create_stat_map",
369 api_name => "open-ils.circ.stat_cat.actor.user_map.create");
371 __PACKAGE__->register_method(
372 method => "create_stat_map",
373 api_name => "open-ils.circ.stat_cat.asset.copy_map.create");
375 sub create_stat_map {
376 my( $self, $client, $user_session, $map ) = @_;
379 my ( $evt, $copy, $volume, $patron, $user_obj );
381 my $method = "open-ils.storage.direct.actor.stat_cat_entry_user_map.create";
382 my $ret = "open-ils.storage.direct.actor.stat_cat_entry_user_map.retrieve";
383 my $perm = 'CREATE_PATRON_STAT_CAT_ENTRY_MAP';
386 if($self->api_name =~ /asset/) {
387 $method = "open-ils.storage.direct.asset.stat_cat_entry_copy_map.create";
388 $ret = "open-ils.storage.direct.asset.stat_cat_entry_copy_map.retrieve";
389 $perm = 'CREATE_COPY_STAT_CAT_ENTRY_MAP';
390 ( $copy, $evt ) = $apputils->fetch_copy($map->owning_copy);
392 ( $volume, $evt ) = $apputils->fetch_callnumber($copy->call_number);
394 $perm_org = $volume->owning_lib;
397 ($patron, $evt) = $apputils->fetch_user($map->target_usr);
399 $perm_org = $patron->home_ou;
402 ( $user_obj, $evt ) = $apputils->checkses($user_session);
404 $evt = $apputils->check_perms( $user_obj->id, $perm_org, $perm );
407 $logger->debug( $user_obj->id . " creating new stat cat map" );
411 my $session = $apputils->start_db_session();
412 my $req = $session->request($method, $map);
413 my $newid = $req->gather(1);
414 warn "Created new stat cat map with id $newid\n";
415 $apputils->commit_db_session($session);
417 return $apputils->simple_scalar_request( "open-ils.storage", $ret, $newid );
422 __PACKAGE__->register_method(
423 method => "update_stat_map",
424 api_name => "open-ils.circ.stat_cat.actor.user_map.update");
426 __PACKAGE__->register_method(
427 method => "update_stat_map",
428 api_name => "open-ils.circ.stat_cat.asset.copy_map.update");
430 sub update_stat_map {
431 my( $self, $client, $user_session, $map ) = @_;
433 my ( $evt, $copy, $volume, $patron, $user_obj );
435 my $method = "open-ils.storage.direct.actor.stat_cat_entry_user_map.update";
436 my $perm = 'UPDATE_PATRON_STAT_ENTRY_MAP';
439 if($self->api_name =~ /asset/) {
440 $method = "open-ils.storage.direct.asset.stat_cat_entry_copy_map.update";
441 $perm = 'UPDATE_COPY_STAT_ENTRY_MAP';
442 ( $copy, $evt ) = $apputils->fetch_copy($map->owning_copy);
444 ( $volume, $evt ) = $apputils->fetch_callnumber($copy->call_number);
446 $perm_org = $volume->owning_lib;
449 ($patron, $evt) = $apputils->fetch_user($map->target_usr);
451 $perm_org = $patron->home_ou;
455 ( $user_obj, $evt ) = $apputils->checkses($user_session);
457 $evt = $apputils->check_perms( $user_obj->id, $perm_org, $perm );
461 my $session = $apputils->start_db_session();
462 my $req = $session->request($method, $map);
463 my $newid = $req->gather(1);
464 warn "Updated new stat cat map with id $newid\n";
465 $apputils->commit_db_session($session);
472 __PACKAGE__->register_method(
473 method => "retrieve_maps",
474 api_name => "open-ils.circ.stat_cat.actor.user_map.retrieve");
476 __PACKAGE__->register_method(
477 method => "retrieve_maps",
478 api_name => "open-ils.circ.stat_cat.asset.copy_map.retrieve");
481 my( $self, $client, $user_session, $target ) = @_;
484 my( $user_obj, $evt ) = $apputils->checkses($user_session);
487 my $method = "open-ils.storage.direct.asset.stat_cat_entry_copy_map.search.owning_copy.atomic";
488 if($self->api_name =~ /actor/ ) {
489 if(!$target) { $target = $user_obj->id; }
490 $method = "open-ils.storage.direct.actor.stat_cat_entry_user_map.search.target_usr.atomic";
493 return $apputils->simple_scalar_request("open-ils.storage", $method, $target);
499 __PACKAGE__->register_method(
500 method => "delete_stats",
501 api_name => "open-ils.circ.stat_cat.actor.delete");
503 __PACKAGE__->register_method(
504 method => "delete_stats",
505 api_name => "open-ils.circ.stat_cat.asset.delete");
508 my( $self, $client, $user_session, $target ) = @_;
513 my $perm = 'DELETE_PATRON_STAT_CAT';
514 if($self->api_name =~ /asset/) {
516 $perm = 'DELETE_COPY_STAT_CAT';
519 my( $user_obj, $evt ) = $apputils->checkses($user_session);
522 ( $cat, $evt ) = $apputils->fetch_stat_cat( $type, $target );
525 $evt = $apputils->check_perms( $user_obj->id, $cat->owner, $perm );
528 my $session = OpenSRF::AppSession->create("open-ils.storage");
529 return _delete_stats($session, $target, $type);
533 my( $session, $stat, $type) = @_;
535 my $method = "open-ils.storage.direct.asset.stat_cat.delete";
536 if($type =~ /actor/ ) {
537 $method = "open-ils.storage.direct.actor.stat_cat.delete";
539 return $session->request($method, $stat)->gather(1);
544 __PACKAGE__->register_method(
545 method => "delete_entry",
546 api_name => "open-ils.circ.stat_cat.actor.entry.delete");
548 __PACKAGE__->register_method(
549 method => "delete_entry",
550 api_name => "open-ils.circ.stat_cat.asset.entry.delete");
553 my( $self, $client, $user_session, $target ) = @_;
556 my $perm = 'DELETE_PATRON_STAT_CAT_ENTRY';
557 if($self->api_name =~ /asset/) {
559 $perm = 'DELETE_COPY_STAT_CAT_ENTRY';
563 my( $user_obj, $evt ) = $apputils->checkses($user_session);
566 ( $entry, $evt ) = $apputils->fetch_stat_cat_entry( $type, $target );
569 $evt = $apputils->check_perms( $user_obj->id, $entry->owner, $perm );
572 my $session = OpenSRF::AppSession->create("open-ils.storage");
573 return _delete_entry($session, $target, $type);
577 my( $session, $stat_entry, $type) = @_;
579 my $method = "open-ils.storage.direct.asset.stat_cat_entry.delete";
580 if($type =~ /actor/ ) {
581 $method = "open-ils.storage.direct.actor.stat_cat_entry.delete";
584 return $session->request($method, $stat_entry)->gather(1);
588 __PACKAGE__->register_method(
589 method => 'fetch_stats_by_copy',
590 api_name => 'open-ils.circ.asset.stat_cat_entries.fleshed.retrieve_by_copy',
594 sub fetch_stats_by_copy {
595 my( $self, $conn, $args ) = @_;
599 if( $$args{public} ) {
600 my $maps = $U->cstorereq(
601 'open-ils.cstore.direct.asset.stat_cat_entry_copy_map.search.atomic', { owning_copy => $$args{copyid} });
605 for my $map (@$maps) {
607 warn "map ".$map->id."\n";
608 warn "map ".$map->stat_cat_entry."\n";
610 my $entry = $U->cstorereq(
611 'open-ils.cstore.direct.asset.stat_cat_entry.retrieve', $map->stat_cat_entry);
613 warn "Found entry ".$entry->id."\n";
615 my $cat = $U->cstorereq(
616 'open-ils.cstore.direct.asset.stat_cat.retrieve', $entry->stat_cat );
617 $entry->stat_cat( $cat );
618 push( @entries, $entry );