]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/Application/Reporter.pm
fetch the full my-orgs list from the passed ou
[Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Application / Reporter.pm
1 package OpenILS::Application::Reporter;
2 use base qw/OpenSRF::Application/;
3 use strict; use warnings;
4 use OpenSRF::Utils::Logger qw/$logger/;
5 use OpenILS::Utils::CStoreEditor qw/:funcs/;
6 use OpenILS::Utils::Fieldmapper;
7 use OpenILS::Application::AppUtils;
8 my $U = "OpenILS::Application::AppUtils";
9
10
11 __PACKAGE__->register_method(
12         api_name => 'open-ils.reporter.folder.create',
13         method => 'create_folder'
14 );
15
16 sub create_folder {
17         my( $self, $conn, $auth, $type, $folder ) = @_;
18
19         my $e = new_rstore_editor(xact=>1, authtoken=>$auth);
20         return $e->die_event unless $e->checkauth;
21         return $e->die_event unless $e->allowed('RUN_REPORTS');
22
23         return 0 if $folder->owner ne $e->requestor->id;
24
25         $folder->owner($e->requestor->id);
26         my $meth = "create_reporter_${type}_folder";
27         $e->$meth($folder) or return $e->die_event;
28         $e->commit;
29
30         return $folder->id;
31 }
32
33
34 __PACKAGE__->register_method(
35         api_name => 'open-ils.reporter.folder.visible.retrieve',
36         method => 'retrieve_visible_folders'
37 );
38
39 sub retrieve_visible_folders {
40         my( $self, $conn, $auth, $type ) = @_;
41         my $e = new_rstore_editor(authtoken=>$auth);
42         return $e->event unless $e->checkauth;
43         return $e->event unless $e->allowed('RUN_REPORTS');
44
45         my $class = 'rrf';
46         $class = 'rtf' if $type eq 'template';
47         $class = 'rof' if $type eq 'output';
48         my $flesh = {flesh => 1,flesh_fields => { $class => ['owner', 'share_with']}};
49
50         my $meth = "search_reporter_${type}_folder";
51         my $fs = $e->$meth( [{ owner => $e->requestor->id }, $flesh] );
52
53         my @orgs;
54         my $o = $U->storagereq(
55                 'open-ils.storage.actor.org_unit.full_path.atomic', $e->requestor->ws_ou);
56         push( @orgs, $_->id ) for @$o;
57
58         my $fs2 = $e->$meth(
59                 [
60                         {
61                                 shared => 't', 
62                                 share_with => \@orgs, 
63                                 owner => { '!=' => $e->requestor->id } 
64                         }, 
65                         $flesh
66                 ]
67         );
68         push( @$fs, @$fs2);
69         return $fs;
70 }
71
72
73
74 __PACKAGE__->register_method(
75         api_name => 'open-ils.reporter.folder_data.retrieve',
76         method => 'retrieve_folder_data'
77 );
78
79 sub retrieve_folder_data {
80         my( $self, $conn, $auth, $type, $folderid, $limit ) = @_;
81         my $e = new_rstore_editor(authtoken=>$auth);
82         return $e->event unless $e->checkauth;
83         return $e->event unless $e->allowed('RUN_REPORTS');
84         my $meth = "search_reporter_${type}";
85         my $class = 'rr';
86         $class = 'rt' if $type eq 'template';
87         my $flesh = {
88                 flesh => 1,
89                 flesh_fields => { $class => ['owner']}, 
90                 order_by => { $class => 'create_time DESC'} 
91         };
92         $flesh->{limit} = $limit if $limit;
93         return $e->$meth([{ folder => $folderid }, $flesh]); 
94 }
95
96 __PACKAGE__->register_method(
97         api_name => 'open-ils.reporter.schedule.retrieve_by_folder',
98         method => 'retrieve_schedules');
99 sub retrieve_schedules {
100         my( $self, $conn, $auth, $folderId, $limit ) = @_;
101         my $e = new_rstore_editor(authtoken=>$auth);
102         return $e->event unless $e->checkauth;
103         return $e->event unless $e->allowed('RUN_REPORTS');
104
105         my $search = { folder => $folderId };
106         my $query = [
107                 { folder => $folderId },
108                 { 
109                         order_by => { rs => 'run_time DESC' } ,
110                         flesh => 1,
111                         flesh_fields => { rs => ['report'] }
112                 }
113         ];
114
115         $query->[1]->{limit} = $limit if $limit;
116         return $e->search_reporter_schedule($query);
117 }
118
119 __PACKAGE__->register_method(
120         api_name => 'open-ils.reporter.schedule.retrieve',
121         method => 'retrieve_schedules');
122 sub retrieve_schedule {
123         my( $self, $conn, $auth, $sched_id ) = @_;
124         my $e = new_rstore_editor(authtoken=>$auth);
125         return $e->event unless $e->checkauth;
126         return $e->event unless $e->allowed('RUN_REPORTS');
127         my $s = $e->retrieve_reporter_schedule($sched_id)
128                 or return $e->event;
129         return $s;
130 }
131
132
133 __PACKAGE__->register_method(
134         api_name => 'open-ils.reporter.template.create',
135         method => 'create_template');
136 sub create_template {
137         my( $self, $conn, $auth, $template ) = @_;
138         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
139         return $e->die_event unless $e->checkauth;
140         return $e->die_event unless $e->allowed('RUN_REPORTS');
141         $template->owner($e->requestor->id);
142
143         my $existing = $e->search_reporter_template( {owner=>$template->owner, 
144                         folder=>$template->folder, name=>$template->name},{idlist=>1});
145         return OpenILS::Event->new('REPORT_TEMPLATE_EXISTS') if @$existing;
146
147         my $tmpl = $e->create_reporter_template($template)
148                 or return $e->die_event;
149         $e->commit;
150         return $tmpl;
151 }
152
153
154 __PACKAGE__->register_method(
155         api_name => 'open-ils.reporter.report.create',
156         method => 'create_report');
157 sub create_report {
158         my( $self, $conn, $auth, $report, $schedule ) = @_;
159         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
160         return $e->die_event unless $e->checkauth;
161         return $e->die_event unless $e->allowed('RUN_REPORTS');
162         $report->owner($e->requestor->id);
163
164         my $existing = $e->search_reporter_report( {owner=>$report->owner, 
165                         folder=>$report->folder, name=>$report->name},{idlist=>1});
166         return OpenILS::Event->new('REPORT_REPORT_EXISTS') if @$existing;
167
168         my $rpt = $e->create_reporter_report($report)
169                 or return $e->die_event;
170         $schedule->report($rpt->id);
171         $schedule->runner($e->requestor->id);
172         $e->create_reporter_schedule($schedule) or return $e->die_event;
173         $e->commit;
174         return $rpt;
175 }
176
177
178 __PACKAGE__->register_method(
179         api_name => 'open-ils.scheduleer.schedule.create',
180         method => 'create_schedule');
181 sub create_schedule {
182         my( $self, $conn, $auth, $schedule ) = @_;
183         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
184         return $e->die_event unless $e->checkauth;
185         return $e->die_event unless $e->allowed('RUN_REPORTS');
186         my $sched = $e->create_reporter_schedule($schedule)
187                 or return $e->die_event;
188         $e->commit;
189         return $sched;
190 }
191
192 __PACKAGE__->register_method(
193         api_name => 'open-ils.reporter.template.retrieve',
194         method => 'retrieve_template');
195 sub retrieve_template {
196         my( $self, $conn, $auth, $id ) = @_;
197         my $e = new_rstore_editor(authtoken=>$auth);
198         return $e->event unless $e->checkauth;
199         return $e->event unless $e->allowed('RUN_REPORTS');
200         my $t = $e->retrieve_reporter_template($id) 
201                 or return $e->event;
202         return $t;
203 }
204
205
206 __PACKAGE__->register_method(
207         api_name => 'open-ils.reporter.report.retrieve',
208         method => 'retrieve_report');
209 sub retrieve_report {
210         my( $self, $conn, $auth, $id ) = @_;
211         my $e = new_rstore_editor(authtoken=>$auth);
212         return $e->event unless $e->checkauth;
213         return $e->event unless $e->allowed('RUN_REPORTS');
214         my $r = $e->retrieve_reporter_report($id) 
215                 or return $e->event;
216         return $r;
217 }
218
219
220 __PACKAGE__->register_method(
221         api_name => 'open-ils.reporter.template.update',
222         method => 'update_template');
223 sub update_template {
224         my( $self, $conn, $auth, $tmpl ) = @_;
225         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
226         return $e->die_event unless $e->checkauth;
227         return $e->die_event unless $e->allowed('RUN_REPORTS');
228         my $t = $e->retrieve_reporter_template($tmpl->id)
229                 or return $e->die_event;
230         return 0 if $t->owner ne $e->requestor->id;
231         $e->update_reporter_template($tmpl)
232                 or return $e->die_event;
233         $e->commit;
234         return 1;
235 }
236
237
238 __PACKAGE__->register_method(
239         api_name => 'open-ils.reporter.report.update',
240         method => 'update_report');
241 sub update_report {
242         my( $self, $conn, $auth, $report ) = @_;
243         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
244         return $e->die_event unless $e->checkauth;
245         return $e->die_event unless $e->allowed('RUN_REPORTS');
246         my $r = $e->retrieve_reporter_report($report->id)
247                 or return $e->die_event;
248         if( $r->owner ne $e->requestor->id ) {
249                 $e->rollback;
250                 return 0;
251         }
252         $e->update_reporter_report($report)
253                 or return $e->die_event;
254         $e->commit;
255         return 1;
256 }
257
258
259 __PACKAGE__->register_method(
260         api_name => 'open-ils.reporter.folder.update',
261         method => 'update_folder');
262 sub update_folder {
263         my( $self, $conn, $auth, $type, $folder ) = @_;
264         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
265         return $e->die_event unless $e->checkauth;
266         return $e->die_event unless $e->allowed('RUN_REPORTS');
267         my $meth = "retrieve_reporter_${type}_folder";
268         my $f = $e->$meth($folder->id) or return $e->die_event;
269         return 0 if $f->owner ne $e->requestor->id;
270         $meth = "update_reporter_${type}_folder";
271         $e->$meth($folder) or return $e->die_event;
272         $e->commit;
273         return 1;
274 }
275
276
277 __PACKAGE__->register_method(
278         api_name => 'open-ils.reporter.folder.delete',
279         method => 'delete_folder');
280 sub delete_folder {
281         my( $self, $conn, $auth, $type, $folderId ) = @_;
282         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
283         return $e->die_event unless $e->checkauth;
284         return $e->die_event unless $e->allowed('RUN_REPORTS');
285         my $meth = "retrieve_reporter_${type}_folder";
286         my $f = $e->$meth($folderId) or return $e->die_event;
287         return 0 if $f->owner ne $e->requestor->id;
288         $meth = "delete_reporter_${type}_folder";
289         $e->$meth($f) or return $e->die_event;
290         $e->commit;
291         return 1;
292 }
293
294
295 __PACKAGE__->register_method(
296         api_name => 'open-ils.reporter.template.delete',
297         method => 'delete_template');
298 sub delete_template {
299         my( $self, $conn, $auth, $templateId ) = @_;
300         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
301         return $e->die_event unless $e->checkauth;
302         return $e->die_event unless $e->allowed('RUN_REPORTS');
303
304         my $t = $e->retrieve_reporter_template($templateId)
305                 or return $e->die_event;
306         return 0 if $t->owner ne $e->requestor->id;
307         $e->delete_reporter_template($t) or return $e->die_event;
308         $e->commit;
309         return 1;
310 }
311
312 __PACKAGE__->register_method(
313         api_name => 'open-ils.reporter.report.delete',
314         method => 'delete_report');
315 sub delete_report {
316         my( $self, $conn, $auth, $reportId ) = @_;
317         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
318         return $e->die_event unless $e->checkauth;
319         return $e->die_event unless $e->allowed('RUN_REPORTS');
320
321         my $t = $e->retrieve_reporter_report($reportId)
322                 or return $e->die_event;
323         return 0 if $t->owner ne $e->requestor->id;
324         $e->delete_reporter_report($t) or return $e->die_event;
325         $e->commit;
326         return 1;
327 }
328
329
330 __PACKAGE__->register_method(
331         api_name => 'open-ils.reporter.schedule.delete',
332         method => 'delete_schedule');
333 sub delete_schedule {
334         my( $self, $conn, $auth, $scheduleId ) = @_;
335         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
336         return $e->die_event unless $e->checkauth;
337         return $e->die_event unless $e->allowed('RUN_REPORTS');
338
339         my $t = $e->retrieve_reporter_schedule($scheduleId)
340                 or return $e->die_event;
341         return 0 if $t->runner ne $e->requestor->id;
342         $e->delete_reporter_schedule($t) or return $e->die_event;
343         $e->commit;
344         return 1;
345 }
346
347
348 __PACKAGE__->register_method(
349         api_name => 'open-ils.reporter.template_has_reports',
350         method => 'has_reports');
351 sub has_reports {
352         my( $self, $conn, $auth, $templateId ) = @_;
353         my $e = new_rstore_editor(authtoken=>$auth);
354         return $e->die_event unless $e->checkauth;
355         return $e->die_event unless $e->allowed('RUN_REPORTS');
356         my $rpts = $e->search_reporter_report({template=>$templateId},{idlist=>1});
357         return 1 if @$rpts;
358         return 0;
359 }
360
361 __PACKAGE__->register_method(
362         api_name => 'open-ils.reporter.report_has_output',
363         method => 'has_output');
364 sub has_output {
365         my( $self, $conn, $auth, $reportId ) = @_;
366         my $e = new_rstore_editor(authtoken=>$auth);
367         return $e->die_event unless $e->checkauth;
368         return $e->die_event unless $e->allowed('RUN_REPORTS');
369         my $outs = $e->search_reporter_schedule({report=>$reportId},{idlist=>1});
370         return 1 if @$outs;
371         return 0;
372 }
373
374
375
376 __PACKAGE__->register_method(
377         method => 'org_full_path',
378         api_name => 'open-ils.reporter.org_unit.full_path');
379
380 sub org_full_path {
381         my( $self, $conn, $orgid ) = @_;
382         return $U->storagereq(
383                 'open-ils.storage.actor.org_unit.full_path.atomic', $orgid );
384 }
385
386
387
388
389 __PACKAGE__->register_method(
390         method => 'magic_fetch_all',
391         api_name => 'open-ils.reporter.magic_fetch');
392 sub magic_fetch_all {
393         my( $self, $conn, $auth, $args ) = @_;
394         my $e = new_editor(authtoken => $auth);
395         return $e->event unless $e->checkauth;
396         return $e->event unless $e->allowed('RUN_REPORTS');
397
398         my $hint = $$args{hint};
399         my $org_col = $$args{org_column};
400         my $orgs = $$args{org};
401         
402         if ($orgs && !$$args{no_fetch}) {
403                 ($orgs) = $self
404                                 ->method_lookup( 'open-ils.reporter.org_unit.full_path' )
405                                 ->run( @$orgs );
406                 $orgs = [ map {$_->id} @$orgs ];
407         }
408
409         # Find the class the iplements the given hint
410         my ($class) = grep { 
411                 $Fieldmapper::fieldmap->{$_}{hint} eq $hint } Fieldmapper->classes;
412
413         return undef unless $class->Selector;
414
415         $class =~ s/Fieldmapper:://og;
416         $class =~ s/::/_/og;
417         
418         my $method;
419         my $margs;
420
421         if( $org_col ) {
422                 $method = "search_$class";
423                 $margs = { $org_col => $orgs };
424         } else {
425                 $method = "retrieve_all_$class";
426         }
427
428         $logger->info("reporter.magic_fetch => $method");
429
430         return $e->$method($margs);
431 }
432
433
434 1;