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 },
108 { order_by => { rs => 'run_time DESC' } }
111 $query->[1]->{limit} = $limit if $limit;
112 return $e->search_reporter_schedule($query);
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)
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);
139 my $existing = $e->search_reporter_template( {owner=>$template->owner,
140 folder=>$template->folder, name=>$template->name},{idlist=>1});
141 return OpenILS::Event->new('REPORT_TEMPLATE_EXISTS') if @$existing;
143 my $tmpl = $e->create_reporter_template($template)
144 or return $e->die_event;
150 __PACKAGE__->register_method(
151 api_name => 'open-ils.reporter.report.create',
152 method => 'create_report');
154 my( $self, $conn, $auth, $report, $schedule ) = @_;
155 my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
156 return $e->die_event unless $e->checkauth;
157 return $e->die_event unless $e->allowed('RUN_REPORTS');
158 $report->owner($e->requestor->id);
160 my $existing = $e->search_reporter_report( {owner=>$report->owner,
161 folder=>$report->folder, name=>$report->name},{idlist=>1});
162 return OpenILS::Event->new('REPORT_REPORT_EXISTS') if @$existing;
164 my $rpt = $e->create_reporter_report($report)
165 or return $e->die_event;
166 $schedule->report($rpt->id);
167 $schedule->runner($e->requestor->id);
168 $e->create_reporter_schedule($schedule) or return $e->die_event;
174 __PACKAGE__->register_method(
175 api_name => 'open-ils.scheduleer.schedule.create',
176 method => 'create_schedule');
177 sub create_schedule {
178 my( $self, $conn, $auth, $schedule ) = @_;
179 my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
180 return $e->die_event unless $e->checkauth;
181 return $e->die_event unless $e->allowed('RUN_REPORTS');
182 my $sched = $e->create_reporter_schedule($schedule)
183 or return $e->die_event;
188 __PACKAGE__->register_method(
189 api_name => 'open-ils.reporter.template.retrieve',
190 method => 'retrieve_template');
191 sub retrieve_template {
192 my( $self, $conn, $auth, $id ) = @_;
193 my $e = new_rstore_editor(authtoken=>$auth);
194 return $e->event unless $e->checkauth;
195 return $e->event unless $e->allowed('RUN_REPORTS');
196 my $t = $e->retrieve_reporter_template($id)
202 __PACKAGE__->register_method(
203 api_name => 'open-ils.reporter.report.retrieve',
204 method => 'retrieve_report');
205 sub retrieve_report {
206 my( $self, $conn, $auth, $id ) = @_;
207 my $e = new_rstore_editor(authtoken=>$auth);
208 return $e->event unless $e->checkauth;
209 return $e->event unless $e->allowed('RUN_REPORTS');
210 my $r = $e->retrieve_reporter_report($id)
216 __PACKAGE__->register_method(
217 api_name => 'open-ils.reporter.template.update',
218 method => 'update_template');
219 sub update_template {
220 my( $self, $conn, $auth, $tmpl ) = @_;
221 my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
222 return $e->die_event unless $e->checkauth;
223 return $e->die_event unless $e->allowed('RUN_REPORTS');
224 my $t = $e->retrieve_reporter_template($tmpl->id)
225 or return $e->die_event;
226 return 0 if $t->owner ne $e->requestor->id;
227 $e->update_reporter_template($tmpl)
228 or return $e->die_event;
234 __PACKAGE__->register_method(
235 api_name => 'open-ils.reporter.report.update',
236 method => 'update_report');
238 my( $self, $conn, $auth, $report ) = @_;
239 my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
240 return $e->die_event unless $e->checkauth;
241 return $e->die_event unless $e->allowed('RUN_REPORTS');
242 my $r = $e->retrieve_reporter_report($report->id)
243 or return $e->die_event;
244 if( $r->owner ne $e->requestor->id ) {
248 $e->update_reporter_report($report)
249 or return $e->die_event;
255 __PACKAGE__->register_method(
256 api_name => 'open-ils.reporter.folder.update',
257 method => 'update_folder');
259 my( $self, $conn, $auth, $type, $folder ) = @_;
260 my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
261 return $e->die_event unless $e->checkauth;
262 return $e->die_event unless $e->allowed('RUN_REPORTS');
263 my $meth = "retrieve_reporter_${type}_folder";
264 my $f = $e->$meth($folder->id) or return $e->die_event;
265 return 0 if $f->owner ne $e->requestor->id;
266 $meth = "update_reporter_${type}_folder";
267 $e->$meth($folder) or return $e->die_event;
273 __PACKAGE__->register_method(
274 api_name => 'open-ils.reporter.folder.delete',
275 method => 'delete_folder');
277 my( $self, $conn, $auth, $type, $folderId ) = @_;
278 my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
279 return $e->die_event unless $e->checkauth;
280 return $e->die_event unless $e->allowed('RUN_REPORTS');
281 my $meth = "retrieve_reporter_${type}_folder";
282 my $f = $e->$meth($folderId) or return $e->die_event;
283 return 0 if $f->owner ne $e->requestor->id;
284 $meth = "delete_reporter_${type}_folder";
285 $e->$meth($f) or return $e->die_event;
291 __PACKAGE__->register_method(
292 api_name => 'open-ils.reporter.template.delete',
293 method => 'delete_template');
294 sub delete_template {
295 my( $self, $conn, $auth, $templateId ) = @_;
296 my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
297 return $e->die_event unless $e->checkauth;
298 return $e->die_event unless $e->allowed('RUN_REPORTS');
300 my $t = $e->retrieve_reporter_template($templateId)
301 or return $e->die_event;
302 return 0 if $t->owner ne $e->requestor->id;
303 $e->delete_reporter_template($t) or return $e->die_event;
308 __PACKAGE__->register_method(
309 api_name => 'open-ils.reporter.report.delete',
310 method => 'delete_report');
312 my( $self, $conn, $auth, $reportId ) = @_;
313 my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
314 return $e->die_event unless $e->checkauth;
315 return $e->die_event unless $e->allowed('RUN_REPORTS');
317 my $t = $e->retrieve_reporter_report($reportId)
318 or return $e->die_event;
319 return 0 if $t->owner ne $e->requestor->id;
320 $e->delete_reporter_report($t) or return $e->die_event;
326 __PACKAGE__->register_method(
327 api_name => 'open-ils.reporter.schedule.delete',
328 method => 'delete_schedule');
329 sub delete_schedule {
330 my( $self, $conn, $auth, $scheduleId ) = @_;
331 my $e = new_rstore_editor(authtoken=>$auth, xact=>1);
332 return $e->die_event unless $e->checkauth;
333 return $e->die_event unless $e->allowed('RUN_REPORTS');
335 my $t = $e->retrieve_reporter_schedule($scheduleId)
336 or return $e->die_event;
337 return 0 if $t->runner ne $e->requestor->id;
338 $e->delete_reporter_schedule($t) or return $e->die_event;
344 __PACKAGE__->register_method(
345 api_name => 'open-ils.reporter.template_has_reports',
346 method => 'has_reports');
348 my( $self, $conn, $auth, $templateId ) = @_;
349 my $e = new_rstore_editor(authtoken=>$auth);
350 return $e->die_event unless $e->checkauth;
351 return $e->die_event unless $e->allowed('RUN_REPORTS');
352 my $rpts = $e->search_reporter_report({template=>$templateId},{idlist=>1});
357 __PACKAGE__->register_method(
358 api_name => 'open-ils.reporter.report_has_output',
359 method => 'has_output');
361 my( $self, $conn, $auth, $reportId ) = @_;
362 my $e = new_rstore_editor(authtoken=>$auth);
363 return $e->die_event unless $e->checkauth;
364 return $e->die_event unless $e->allowed('RUN_REPORTS');
365 my $outs = $e->search_reporter_schedule({report=>$reportId},{idlist=>1});
372 __PACKAGE__->register_method(
373 method => 'org_full_path',
374 api_name => 'open-ils.reporter.org_unit.full_path');
377 my( $self, $conn, $orgid ) = @_;
378 return $U->storagereq(
379 'open-ils.storage.actor.org_unit.full_path.atomic', $orgid );
385 __PACKAGE__->register_method(
386 method => 'magic_fetch_all',
387 api_name => 'open-ils.reporter.magic_fetch');
388 sub magic_fetch_all {
389 my( $self, $conn, $auth, $args ) = @_;
390 my $e = new_editor(authtoken => $auth);
391 return $e->event unless $e->checkauth;
392 return $e->event unless $e->allowed('RUN_REPORTS');
394 my $hint = $$args{hint};
396 # Find the class the iplements the given hint
398 $Fieldmapper::fieldmap->{$_}{hint} eq $hint } Fieldmapper->classes;
400 return undef unless $class->Selector;
402 $class =~ s/Fieldmapper:://og;
404 my $method = "retrieve_all_$class";
406 $logger->info("reporter.magic_fetch => $method");
408 return $e->$method();