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";
11 __PACKAGE__->register_method(
12 api_name => 'open-ils.reporter.folder.create',
13 method => 'create_folder'
17 my( $self, $conn, $auth, $type, $folder ) = @_;
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');
23 return 0 if $folder->owner ne $e->requestor->id;
25 $folder->owner($e->requestor->id);
26 my $meth = "create_reporter_${type}_folder";
27 $e->$meth($folder) or return $e->die_event;
34 __PACKAGE__->register_method(
35 api_name => 'open-ils.reporter.folder.visible.retrieve',
36 method => 'retrieve_visible_folders'
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');
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']}};
50 my $meth = "search_reporter_${type}_folder";
51 my $fs = $e->$meth( [{ owner => $e->requestor->id }, $flesh] );
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;
63 owner => { '!=' => $e->requestor->id }
74 __PACKAGE__->register_method(
75 api_name => 'open-ils.reporter.folder_data.retrieve',
76 method => 'retrieve_folder_data'
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}";
86 $class = 'rt' if $type eq 'template';
89 flesh_fields => { $class => ['owner']},
90 order_by => { $class => 'create_time DESC'}
92 $flesh->{limit} = $limit if $limit;
93 return $e->$meth([{ folder => $folderid }, $flesh]);
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');
105 my $search = { folder => $folderId };
107 { folder => $folderId },
109 order_by => { rs => 'run_time DESC' } ,
111 flesh_fields => { rs => ['report'] }
115 $query->[1]->{limit} = $limit if $limit;
116 return $e->search_reporter_schedule($query);
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)
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);
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;
147 my $tmpl = $e->create_reporter_template($template)
148 or return $e->die_event;
154 __PACKAGE__->register_method(
155 api_name => 'open-ils.reporter.report.create',
156 method => '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);
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;
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;
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;
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)
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)
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;
238 __PACKAGE__->register_method(
239 api_name => 'open-ils.reporter.report.update',
240 method => '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 ) {
252 $e->update_reporter_report($report)
253 or return $e->die_event;
259 __PACKAGE__->register_method(
260 api_name => 'open-ils.reporter.folder.update',
261 method => '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;
277 __PACKAGE__->register_method(
278 api_name => 'open-ils.reporter.folder.delete',
279 method => '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;
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');
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;
312 __PACKAGE__->register_method(
313 api_name => 'open-ils.reporter.report.delete',
314 method => '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');
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;
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');
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;
348 __PACKAGE__->register_method(
349 api_name => 'open-ils.reporter.template_has_reports',
350 method => '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});
361 __PACKAGE__->register_method(
362 api_name => 'open-ils.reporter.report_has_output',
363 method => '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});
376 __PACKAGE__->register_method(
377 method => 'org_full_path',
378 api_name => 'open-ils.reporter.org_unit.full_path');
381 my( $self, $conn, $orgid ) = @_;
382 return $U->storagereq(
383 'open-ils.storage.actor.org_unit.full_path.atomic', $orgid );
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');
398 my $hint = $$args{hint};
399 my $org_col = $$args{org_column};
400 my $orgs = $$args{org};
402 # Find the class the iplements the given hint
404 $Fieldmapper::fieldmap->{$_}{hint} eq $hint } Fieldmapper->classes;
406 return undef unless $class->Selector;
408 $class =~ s/Fieldmapper:://og;
415 $method = "search_$class";
416 $margs = { $org_col => $orgs };
418 $method = "retrieve_all_$class";
421 $logger->info("reporter.magic_fetch => $method");
423 return $e->$method($margs);