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/OpenILS::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, $evt) = $apputils->checkses($user_session);
56 my $cats = $apputils->simple_scalar_request(
57 "open-ils.storage", $method, @sc);
59 return [ sort { $a->name cmp $b->name } @$cats ];
62 __PACKAGE__->register_method(
63 method => "retrieve_stat_cats",
64 api_name => "open-ils.circ.stat_cat.actor.retrieve.all");
66 __PACKAGE__->register_method(
67 method => "retrieve_stat_cats",
68 api_name => "open-ils.circ.stat_cat.asset.retrieve.all");
70 # retrieves all of the stat cats for a given org unit
71 # if no orgid, user_session->home_ou is used
73 sub retrieve_stat_cats {
74 my( $self, $client, $user_session, $orgid ) = @_;
76 my $method = "open-ils.storage.ranged.fleshed.actor.stat_cat.all.atomic";
77 if( $self->api_name =~ /asset/ ) {
78 $method = "open-ils.storage.ranged.fleshed.asset.stat_cat.all.atomic";
81 my($user_obj, $evt) = $apputils->checkses($user_session);
84 if(!$orgid) { $orgid = $user_obj->home_ou; }
85 my $cats = $apputils->simple_scalar_request(
86 "open-ils.storage", $method, $orgid );
88 return [ sort { $a->name cmp $b->name } @$cats ];
92 __PACKAGE__->register_method(
93 method => "retrieve_ranged_intersect_stat_cats",
94 api_name => "open-ils.circ.stat_cat.asset.multirange.intersect.retrieve");
96 sub retrieve_ranged_intersect_stat_cats {
97 my( $self, $client, $user_session, $orglist ) = @_;
99 my($user_obj, $evt) = $apputils->checkses($user_session);
102 if(!$orglist) { $orglist = [ $user_obj->home_ou ]; }
105 my %hash = map { ($_ => 1) } @$orglist;
106 $orglist = [ keys %hash ];
108 warn "range: @$orglist\n";
110 my $method = "open-ils.storage.multiranged.intersect.fleshed.asset.stat_cat.all.atomic";
111 return $apputils->simple_scalar_request(
112 "open-ils.storage", $method, $orglist );
116 __PACKAGE__->register_method(
117 method => "retrieve_ranged_union_stat_cats",
118 api_name => "open-ils.circ.stat_cat.asset.multirange.union.retrieve");
120 sub retrieve_ranged_union_stat_cats {
121 my( $self, $client, $user_session, $orglist ) = @_;
123 my $method = "open-ils.storage.multiranged.union.fleshed.asset.stat_cat.all.atomic";
125 warn "Retrieving stat_cats with method $method and orgs " . Dumper($orglist) . "\n";
127 my($user_obj, $evt) = $apputils->checkses($user_session);
130 if(!$orglist) { $orglist = [ $user_obj->home_ou ]; }
133 my %hash = map { ($_ => 1) } @$orglist;
134 $orglist = [ keys %hash ];
136 warn "range: @$orglist\n";
138 return $apputils->simple_scalar_request(
139 "open-ils.storage", $method, $orglist );
144 __PACKAGE__->register_method(
145 method => "stat_cat_create",
146 api_name => "open-ils.circ.stat_cat.asset.create");
148 __PACKAGE__->register_method(
149 method => "stat_cat_create",
150 api_name => "open-ils.circ.stat_cat.actor.create");
152 sub stat_cat_create {
153 my( $self, $client, $user_session, $stat_cat ) = @_;
155 my $method = "open-ils.storage.direct.actor.stat_cat.create";
156 my $entry_create = "open-ils.storage.direct.actor.stat_cat_entry.create";
157 my $perm = 'CREATE_PATRON_STAT_CAT';
158 my $eperm = 'CREATE_PATRON_STAT_CAT_ENTRY';
160 if($self->api_name =~ /asset/) {
161 $method = "open-ils.storage.direct.asset.stat_cat.create";
162 $entry_create = "open-ils.storage.direct.asset.stat_cat_entry.create";
163 $perm = 'CREATE_COPY_STAT_CAT_ENTRY';
166 #my $user_obj = $apputils->check_user_session($user_session);
167 #my $orgid = $user_obj->home_ou();
168 my( $user_obj, $evt ) = $apputils->checkses($user_session);
170 $evt = $apputils->check_perms($user_obj->id, $stat_cat->owner, $perm);
173 if($stat_cat->entries) {
174 $evt = $apputils->check_perms($user_obj->id, $stat_cat->owner, $eperm);
179 my $session = $apputils->start_db_session();
180 my $newid = _create_stat_cat($session, $stat_cat, $method);
182 if( ref($stat_cat->entries) ) {
183 for my $entry (@{$stat_cat->entries}) {
184 $entry->stat_cat($newid);
185 _create_stat_entry($session, $entry, $entry_create);
189 $apputils->commit_db_session($session);
191 $logger->debug("Stat cat creation successful with id $newid");
193 my $orgid = $user_obj->home_ou;
194 if( $self->api_name =~ /asset/ ) {
195 return _flesh_asset_cat($newid, $orgid);
197 return _flesh_user_cat($newid, $orgid);
202 sub _flesh_user_cat {
206 my $session = OpenSRF::AppSession->create("open-ils.storage");
207 my $cat = $session->request(
208 "open-ils.storage.direct.actor.stat_cat.retrieve",
213 "open-ils.storage.ranged.actor.stat_cat_entry.search.stat_cat.atomic",
214 $orgid, $id )->gather(1) );
220 sub _flesh_asset_cat {
224 my $session = OpenSRF::AppSession->create("open-ils.storage");
225 my $cat = $session->request(
226 "open-ils.storage.direct.asset.stat_cat.retrieve",
231 "open-ils.storage.ranged.asset.stat_cat_entry.search.stat_cat.atomic",
232 $orgid, $id )->gather(1) );
239 sub _create_stat_cat {
240 my( $session, $stat_cat, $method) = @_;
241 warn "Creating new stat cat with name " . $stat_cat->name . "\n";
242 $stat_cat->clear_id();
243 my $req = $session->request( $method, $stat_cat );
244 my $id = $req->gather(1);
246 throw OpenSRF::EX::ERROR
247 ("Error creating new statistical category"); }
249 warn "Stat cat create returned id $id\n";
254 sub _create_stat_entry {
255 my( $session, $stat_entry, $method) = @_;
257 warn "Creating new stat entry with value " . $stat_entry->value . "\n";
258 $stat_entry->clear_id();
260 my $req = $session->request($method, $stat_entry);
261 my $id = $req->gather(1);
263 warn "Stat entry " . Dumper($stat_entry) . "\n";
266 throw OpenSRF::EX::ERROR
267 ("Error creating new stat cat entry"); }
269 warn "Stat cat entry create returned id $id\n";
274 __PACKAGE__->register_method(
275 method => "update_stat_entry",
276 api_name => "open-ils.circ.stat_cat.actor.entry.update");
278 __PACKAGE__->register_method(
279 method => "update_stat_entry",
280 api_name => "open-ils.circ.stat_cat.asset.entry.update");
282 sub update_stat_entry {
283 my( $self, $client, $user_session, $entry ) = @_;
286 my $method = "open-ils.storage.direct.actor.stat_cat_entry.update";
287 my $perm = 'UPDATE_PATRON_STAT_CAT_ENTRY';
288 if($self->api_name =~ /asset/) {
289 $method = "open-ils.storage.direct.asset.stat_cat_entry.update";
290 $perm = 'UPDATE_COPY_STAT_CAT_ENTRY';
293 my( $user_obj, $evt ) = $apputils->checkses($user_session);
295 $evt = $apputils->check_perms( $user_obj->id, $entry->owner, $perm );
298 my $session = $apputils->start_db_session();
299 my $req = $session->request($method, $entry);
300 my $status = $req->gather(1);
301 $apputils->commit_db_session($session);
302 warn "stat cat entry with value " . $entry->value . " updated with status $status\n";
307 __PACKAGE__->register_method(
308 method => "update_stat",
309 api_name => "open-ils.circ.stat_cat.actor.update");
311 __PACKAGE__->register_method(
312 method => "update_stat",
313 api_name => "open-ils.circ.stat_cat.asset.update");
316 my( $self, $client, $user_session, $cat ) = @_;
318 my $method = "open-ils.storage.direct.actor.stat_cat.update";
319 my $perm = 'UPDATE_PATRON_STAT_CAT';
320 if($self->api_name =~ /asset/) {
321 $method = "open-ils.storage.direct.asset.stat_cat.update";
322 $perm = 'UPDATE_COPY_STAT_CAT';
325 my( $user_obj, $evt ) = $apputils->checkses($user_session);
327 $evt = $apputils->check_perms( $user_obj->id, $cat->owner, $perm );
330 my $session = $apputils->start_db_session();
331 my $req = $session->request($method, $cat);
332 my $status = $req->gather(1);
333 $apputils->commit_db_session($session);
334 warn "stat cat with id " . $cat->id . " updated with status $status\n";
339 __PACKAGE__->register_method(
340 method => "create_stat_entry",
341 api_name => "open-ils.circ.stat_cat.actor.entry.create");
343 __PACKAGE__->register_method(
344 method => "create_stat_entry",
345 api_name => "open-ils.circ.stat_cat.asset.entry.create");
347 sub create_stat_entry {
348 my( $self, $client, $user_session, $entry ) = @_;
350 my $method = "open-ils.storage.direct.actor.stat_cat_entry.create";
351 my $perm = 'CREATE_PATRON_STAT_CAT_ENTRY';
352 if($self->api_name =~ /asset/) {
353 $method = "open-ils.storage.direct.asset.stat_cat_entry.create";
354 $perm = 'CREATE_COPY_STAT_CAT_ENTRY';
357 my( $user_obj, $evt ) = $apputils->checkses($user_session);
359 $evt = $apputils->check_perms( $user_obj->id, $entry->owner, $perm );
363 my $session = $apputils->start_db_session();
364 my $req = $session->request($method, $entry);
365 my $status = $req->gather(1);
366 $apputils->commit_db_session($session);
368 $logger->info("created stat cat entry $status");
374 __PACKAGE__->register_method(
375 method => "create_stat_map",
376 api_name => "open-ils.circ.stat_cat.actor.user_map.create");
378 __PACKAGE__->register_method(
379 method => "create_stat_map",
380 api_name => "open-ils.circ.stat_cat.asset.copy_map.create");
382 sub create_stat_map {
383 my( $self, $client, $user_session, $map ) = @_;
386 my ( $evt, $copy, $volume, $patron, $user_obj );
388 my $method = "open-ils.storage.direct.actor.stat_cat_entry_user_map.create";
389 my $ret = "open-ils.storage.direct.actor.stat_cat_entry_user_map.retrieve";
390 my $perm = 'CREATE_PATRON_STAT_CAT_ENTRY_MAP';
393 if($self->api_name =~ /asset/) {
394 $method = "open-ils.storage.direct.asset.stat_cat_entry_copy_map.create";
395 $ret = "open-ils.storage.direct.asset.stat_cat_entry_copy_map.retrieve";
396 $perm = 'CREATE_COPY_STAT_CAT_ENTRY_MAP';
397 ( $copy, $evt ) = $apputils->fetch_copy($map->owning_copy);
399 ( $volume, $evt ) = $apputils->fetch_callnumber($copy->call_number);
401 $perm_org = $volume->owning_lib;
404 ($patron, $evt) = $apputils->fetch_user($map->target_usr);
406 $perm_org = $patron->home_ou;
409 ( $user_obj, $evt ) = $apputils->checkses($user_session);
411 $evt = $apputils->check_perms( $user_obj->id, $perm_org, $perm );
414 $logger->debug( $user_obj->id . " creating new stat cat map" );
418 my $session = $apputils->start_db_session();
419 my $req = $session->request($method, $map);
420 my $newid = $req->gather(1);
421 warn "Created new stat cat map with id $newid\n";
422 $apputils->commit_db_session($session);
424 return $apputils->simple_scalar_request( "open-ils.storage", $ret, $newid );
429 __PACKAGE__->register_method(
430 method => "update_stat_map",
431 api_name => "open-ils.circ.stat_cat.actor.user_map.update");
433 __PACKAGE__->register_method(
434 method => "update_stat_map",
435 api_name => "open-ils.circ.stat_cat.asset.copy_map.update");
437 sub update_stat_map {
438 my( $self, $client, $user_session, $map ) = @_;
440 my ( $evt, $copy, $volume, $patron, $user_obj );
442 my $method = "open-ils.storage.direct.actor.stat_cat_entry_user_map.update";
443 my $perm = 'UPDATE_PATRON_STAT_ENTRY_MAP';
446 if($self->api_name =~ /asset/) {
447 $method = "open-ils.storage.direct.asset.stat_cat_entry_copy_map.update";
448 $perm = 'UPDATE_COPY_STAT_ENTRY_MAP';
449 ( $copy, $evt ) = $apputils->fetch_copy($map->owning_copy);
451 ( $volume, $evt ) = $apputils->fetch_callnumber($copy->call_number);
453 $perm_org = $volume->owning_lib;
456 ($patron, $evt) = $apputils->fetch_user($map->target_usr);
458 $perm_org = $patron->home_ou;
462 ( $user_obj, $evt ) = $apputils->checkses($user_session);
464 $evt = $apputils->check_perms( $user_obj->id, $perm_org, $perm );
468 my $session = $apputils->start_db_session();
469 my $req = $session->request($method, $map);
470 my $newid = $req->gather(1);
471 warn "Updated new stat cat map with id $newid\n";
472 $apputils->commit_db_session($session);
479 __PACKAGE__->register_method(
480 method => "retrieve_maps",
481 api_name => "open-ils.circ.stat_cat.actor.user_map.retrieve");
483 __PACKAGE__->register_method(
484 method => "retrieve_maps",
485 api_name => "open-ils.circ.stat_cat.asset.copy_map.retrieve");
488 my( $self, $client, $user_session, $target ) = @_;
491 my( $user_obj, $evt ) = $apputils->checkses($user_session);
494 my $method = "open-ils.storage.direct.asset.stat_cat_entry_copy_map.search.owning_copy.atomic";
495 if($self->api_name =~ /actor/ ) {
496 if(!$target) { $target = $user_obj->id; }
497 $method = "open-ils.storage.direct.actor.stat_cat_entry_user_map.search.target_usr.atomic";
500 return $apputils->simple_scalar_request("open-ils.storage", $method, $target);
506 __PACKAGE__->register_method(
507 method => "delete_stats",
508 api_name => "open-ils.circ.stat_cat.actor.delete");
510 __PACKAGE__->register_method(
511 method => "delete_stats",
512 api_name => "open-ils.circ.stat_cat.asset.delete");
515 my( $self, $client, $user_session, $target ) = @_;
520 my $perm = 'DELETE_PATRON_STAT_CAT';
521 if($self->api_name =~ /asset/) {
523 $perm = 'DELETE_COPY_STAT_CAT';
526 my( $user_obj, $evt ) = $apputils->checkses($user_session);
529 ( $cat, $evt ) = $apputils->fetch_stat_cat( $type, $target );
532 $evt = $apputils->check_perms( $user_obj->id, $cat->owner, $perm );
535 my $session = OpenSRF::AppSession->create("open-ils.storage");
536 return _delete_stats($session, $target, $type);
540 my( $session, $stat, $type) = @_;
542 my $method = "open-ils.storage.direct.asset.stat_cat.delete";
543 if($type =~ /actor/ ) {
544 $method = "open-ils.storage.direct.actor.stat_cat.delete";
546 return $session->request($method, $stat)->gather(1);
551 __PACKAGE__->register_method(
552 method => "delete_entry",
553 api_name => "open-ils.circ.stat_cat.actor.entry.delete");
555 __PACKAGE__->register_method(
556 method => "delete_entry",
557 api_name => "open-ils.circ.stat_cat.asset.entry.delete");
560 my( $self, $client, $user_session, $target ) = @_;
563 my $perm = 'DELETE_PATRON_STAT_CAT_ENTRY';
564 if($self->api_name =~ /asset/) {
566 $perm = 'DELETE_COPY_STAT_CAT_ENTRY';
570 my( $user_obj, $evt ) = $apputils->checkses($user_session);
573 ( $entry, $evt ) = $apputils->fetch_stat_cat_entry( $type, $target );
576 $evt = $apputils->check_perms( $user_obj->id, $entry->owner, $perm );
579 my $session = OpenSRF::AppSession->create("open-ils.storage");
580 return _delete_entry($session, $target, $type);
584 my( $session, $stat_entry, $type) = @_;
586 my $method = "open-ils.storage.direct.asset.stat_cat_entry.delete";
587 if($type =~ /actor/ ) {
588 $method = "open-ils.storage.direct.actor.stat_cat_entry.delete";
591 return $session->request($method, $stat_entry)->gather(1);
595 __PACKAGE__->register_method(
596 method => 'fetch_stats_by_copy',
597 api_name => 'open-ils.circ.asset.stat_cat_entries.fleshed.retrieve_by_copy',
601 sub fetch_stats_by_copy {
602 my( $self, $conn, $args ) = @_;
606 if( $$args{public} ) {
607 my $maps = $U->cstorereq(
608 'open-ils.cstore.direct.asset.stat_cat_entry_copy_map.search.atomic', { owning_copy => $$args{copyid} });
612 for my $map (@$maps) {
614 warn "map ".$map->id."\n";
615 warn "map ".$map->stat_cat_entry."\n";
617 my $entry = $U->cstorereq(
618 'open-ils.cstore.direct.asset.stat_cat_entry.retrieve', $map->stat_cat_entry);
620 warn "Found entry ".$entry->id."\n";
622 my $cat = $U->cstorereq(
623 'open-ils.cstore.direct.asset.stat_cat.retrieve', $entry->stat_cat );
624 $entry->stat_cat( $cat );
625 push( @entries, $entry );