]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/Application/Reporter.pm
added some limiting and sorting support to folder data retrieval
[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                 { order_by => { rs => 'run_time DESC' } }
109         ];
110
111         $query->[1]->{limit} = $limit if $limit;
112         return $e->search_reporter_schedule($query);
113 }
114
115 __PACKAGE__->register_method(
116         api_name => 'open-ils.reporter.schedule.retrieve',
117         method => 'retrieve_schedules');
118 sub retrieve_schedule {
119         my( $self, $conn, $auth, $sched_id ) = @_;
120         my $e = new_rstore_editor(authtoken=>$auth);
121         return $e->event unless $e->checkauth;
122         return $e->event unless $e->allowed('RUN_REPORTS');
123         my $s = $e->retrieve_reporter_schedule($sched_id)
124                 or return $e->event;
125         return $s;
126 }
127
128
129 __PACKAGE__->register_method(
130         api_name => 'open-ils.reporter.template.create',
131         method => 'create_template');
132 sub create_template {
133         my( $self, $conn, $auth, $template ) = @_;
134         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
135         return $e->die_event unless $e->checkauth;
136         return $e->die_event unless $e->allowed('RUN_REPORTS');
137         $template->owner($e->requestor->id);
138         my $tmpl = $e->create_reporter_template($template)
139                 or return $e->die_event;
140         $e->commit;
141         return $tmpl;
142 }
143
144
145 __PACKAGE__->register_method(
146         api_name => 'open-ils.reporter.report.create',
147         method => 'create_report');
148 sub create_report {
149         my( $self, $conn, $auth, $report, $schedule ) = @_;
150         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
151         return $e->die_event unless $e->checkauth;
152         return $e->die_event unless $e->allowed('RUN_REPORTS');
153         $report->owner($e->requestor->id);
154         my $rpt = $e->create_reporter_report($report)
155                 or return $e->die_event;
156         $schedule->report($rpt->id);
157         $schedule->runner($e->requestor->id);
158         $e->create_reporter_schedule($schedule) or return $e->die_event;
159         $e->commit;
160         return $rpt;
161 }
162
163
164 __PACKAGE__->register_method(
165         api_name => 'open-ils.scheduleer.schedule.create',
166         method => 'create_schedule');
167 sub create_schedule {
168         my( $self, $conn, $auth, $schedule ) = @_;
169         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
170         return $e->die_event unless $e->checkauth;
171         return $e->die_event unless $e->allowed('RUN_REPORTS');
172         my $sched = $e->create_reporter_schedule($schedule)
173                 or return $e->die_event;
174         $e->commit;
175         return $sched;
176 }
177
178 __PACKAGE__->register_method(
179         api_name => 'open-ils.reporter.template.retrieve',
180         method => 'retrieve_template');
181 sub retrieve_template {
182         my( $self, $conn, $auth, $id ) = @_;
183         my $e = new_rstore_editor(authtoken=>$auth);
184         return $e->event unless $e->checkauth;
185         return $e->event unless $e->allowed('RUN_REPORTS');
186         my $t = $e->retrieve_reporter_template($id) 
187                 or return $e->event;
188         return $t;
189 }
190
191
192 __PACKAGE__->register_method(
193         api_name => 'open-ils.reporter.report.retrieve',
194         method => 'retrieve_report');
195 sub retrieve_report {
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 $r = $e->retrieve_reporter_report($id) 
201                 or return $e->event;
202         return $r;
203 }
204
205
206 __PACKAGE__->register_method(
207         api_name => 'open-ils.reporter.template.update',
208         method => 'update_template');
209 sub update_template {
210         my( $self, $conn, $auth, $tmpl ) = @_;
211         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
212         return $e->die_event unless $e->checkauth;
213         return $e->die_event unless $e->allowed('RUN_REPORTS');
214         my $t = $e->retrieve_reporter_template($tmpl->id)
215                 or return $e->die_event;
216         return 0 if $t->owner ne $e->requestor->id;
217         $e->update_reporter_template($tmpl)
218                 or return $e->die_event;
219         $e->commit;
220         return 1;
221 }
222
223
224 __PACKAGE__->register_method(
225         api_name => 'open-ils.reporter.report.update',
226         method => 'update_report');
227 sub update_report {
228         my( $self, $conn, $auth, $report ) = @_;
229         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
230         return $e->die_event unless $e->checkauth;
231         return $e->die_event unless $e->allowed('RUN_REPORTS');
232         my $r = $e->retrieve_reporter_report($report->id)
233                 or return $e->die_event;
234         if( $r->owner ne $e->requestor->id ) {
235                 $e->rollback;
236                 return 0;
237         }
238         $e->update_reporter_report($report)
239                 or return $e->die_event;
240         $e->commit;
241         return 1;
242 }
243
244
245 __PACKAGE__->register_method(
246         api_name => 'open-ils.reporter.folder.update',
247         method => 'update_folder');
248 sub update_folder {
249         my( $self, $conn, $auth, $type, $folder ) = @_;
250         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
251         return $e->die_event unless $e->checkauth;
252         return $e->die_event unless $e->allowed('RUN_REPORTS');
253         my $meth = "retrieve_reporter_${type}_folder";
254         my $f = $e->$meth($folder->id) or return $e->die_event;
255         return 0 if $f->owner ne $e->requestor->id;
256         $meth = "update_reporter_${type}_folder";
257         $e->$meth($folder) or return $e->die_event;
258         $e->commit;
259         return 1;
260 }
261
262
263 __PACKAGE__->register_method(
264         api_name => 'open-ils.reporter.folder.delete',
265         method => 'delete_folder');
266 sub delete_folder {
267         my( $self, $conn, $auth, $type, $folderId ) = @_;
268         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
269         return $e->die_event unless $e->checkauth;
270         return $e->die_event unless $e->allowed('RUN_REPORTS');
271         my $meth = "retrieve_reporter_${type}_folder";
272         my $f = $e->$meth($folderId) or return $e->die_event;
273         return 0 if $f->owner ne $e->requestor->id;
274         $meth = "delete_reporter_${type}_folder";
275         $e->$meth($f) or return $e->die_event;
276         $e->commit;
277         return 1;
278 }
279
280
281 __PACKAGE__->register_method(
282         api_name => 'open-ils.reporter.template.delete',
283         method => 'delete_template');
284 sub delete_template {
285         my( $self, $conn, $auth, $templateId ) = @_;
286         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
287         return $e->die_event unless $e->checkauth;
288         return $e->die_event unless $e->allowed('RUN_REPORTS');
289
290         my $t = $e->retrieve_reporter_template($templateId)
291                 or return $e->die_event;
292         return 0 if $t->owner ne $e->requestor->id;
293         $e->delete_reporter_template($t) or return $e->die_event;
294         $e->commit;
295         return 1;
296 }
297
298 __PACKAGE__->register_method(
299         api_name => 'open-ils.reporter.report.delete',
300         method => 'delete_report');
301 sub delete_report {
302         my( $self, $conn, $auth, $reportId ) = @_;
303         my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
304         return $e->die_event unless $e->checkauth;
305         return $e->die_event unless $e->allowed('RUN_REPORTS');
306
307         my $t = $e->retrieve_reporter_report($reportId)
308                 or return $e->die_event;
309         return 0 if $t->owner ne $e->requestor->id;
310         $e->delete_reporter_report($t) or return $e->die_event;
311         $e->commit;
312         return 1;
313 }
314
315
316 __PACKAGE__->register_method(
317         api_name => 'open-ils.reporter.template_has_reports',
318         method => 'has_reports');
319 sub has_reports {
320         my( $self, $conn, $auth, $templateId ) = @_;
321         my $e = new_rstore_editor(authtoken=>$auth);
322         return $e->die_event unless $e->checkauth;
323         return $e->die_event unless $e->allowed('RUN_REPORTS');
324         my $rpts = $e->search_reporter_report({template=>$templateId},{idlist=>1});
325         return 1 if @$rpts;
326         return 0;
327 }
328
329
330 __PACKAGE__->register_method(
331         method => 'org_full_path',
332         api_name => 'open-ils.reporter.org_unit.full_path');
333
334 sub org_full_path {
335         my( $self, $conn, $orgid ) = @_;
336         return $U->storagereq(
337                 'open-ils.storage.actor.org_unit.full_path.atomic', $orgid );
338 }
339
340
341
342
343 __PACKAGE__->register_method(
344         method => 'magic_fetch_all',
345         api_name => 'open-ils.reporter.magic_fetch');
346 sub magic_fetch_all {
347         my( $self, $conn, $auth, $args ) = @_;
348         my $e = new_editor(authtoken => $auth);
349         return $e->event unless $e->checkauth;
350         return $e->event unless $e->allowed('RUN_REPORTS');
351
352         my $hint = $$args{hint};
353
354         # Find the class the iplements the given hint
355         my ($class) = grep { 
356                 $Fieldmapper::fieldmap->{$_}{hint} eq $hint } Fieldmapper->classes;
357
358         return undef unless $class->Selector;
359
360         $class =~ s/Fieldmapper:://og;
361         $class =~ s/::/_/og;
362         my $method = "retrieve_all_$class";
363
364         $logger->info("reporter.magic_fetch => $method");
365
366         return $e->$method();
367 }
368
369
370 1;