add ability to search on a date range of invoice events and then reprint or reemail...
[freeside.git] / FS / FS / UI / Web.pm
1 package FS::UI::Web;
2
3 #use vars qw(@ISA);
4 #use FS::UI
5 #@ISA = qw( FS::UI );
6
7 use Date::Parse;
8 sub parse_beginning_ending {
9   my($cgi) = @_;
10
11   $cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/;
12   my $beginning = str2time($1) || 0;
13
14   #need an option to turn off the + 86399 ???
15   $cgi->param('ending') =~ /^([ 0-9\-\/]{0,10})$/;
16   my $ending =  ( $1 ? str2time($1) : 4294880896 ) + 86399;
17
18   ( $beginning, $ending );
19 }
20
21 # begin JSRPC code...
22
23 package FS::UI::Web::JSRPC;
24
25 use strict;
26 use vars qw(@ISA $DEBUG);
27 use Storable qw(nfreeze);
28 use MIME::Base64;
29 use JavaScript::RPC::Server::CGI;
30 use FS::UID;
31 use FS::Record qw(qsearchs);
32 use FS::queue;
33
34 @ISA = qw( JavaScript::RPC::Server::CGI );
35 $DEBUG = 0;
36
37 sub new {
38         my $class = shift;
39         my $self  = {
40                 env => {},
41                 job => shift,
42         };
43
44         bless $self, $class;
45
46         return $self;
47 }
48
49 sub start_job {
50   my $self = shift;
51
52   warn "FS::UI::Web::start_job: ". join(', ', @_) if $DEBUG;
53 #  my %param = @_;
54   my %param = ();
55   while ( @_ ) {
56     my( $field, $value ) = splice(@_, 0, 2);
57     unless ( exists( $param{$field} ) ) {
58       $param{$field} = $value;
59     } elsif ( ! ref($param{$field}) ) {
60       $param{$field} = [ $param{$field}, $value ];
61     } else {
62       push @{$param{$field}}, $value;
63     }
64   }
65   warn "FS::UI::Web::start_job\n".
66        join('', map {
67                       if ( ref($param{$_}) ) {
68                         "  $_ => [ ". join(', ', @{$param{$_}}). " ]\n";
69                       } else {
70                         "  $_ => $param{$_}\n";
71                       }
72                     } keys %param )
73     if $DEBUG;
74
75   #first get the CGI params shipped off to a job ASAP so an id can be returned
76   #to the caller
77   
78   my $job = new FS::queue { 'job' => $self->{'job'} };
79   
80   #too slow to insert all the cgi params as individual args..,?
81   #my $error = $queue->insert('_JOB', $cgi->Vars);
82   
83   #warn 'froze string of size '. length(nfreeze(\%param)). " for job args\n"
84   #  if $DEBUG;
85
86   my $error = $job->insert( '_JOB', encode_base64(nfreeze(\%param)) );
87
88   if ( $error ) {
89     $error;
90   } else {
91     $job->jobnum;
92   }
93   
94 }
95
96 sub job_status {
97   my( $self, $jobnum ) = @_; #$url ???
98
99   sleep 5; #could use something better...
100
101   my $job;
102   if ( $jobnum =~ /^(\d+)$/ ) {
103     $job = qsearchs('queue', { 'jobnum' => $jobnum } );
104   } else {
105     die "FS::UI::Web::job_status: illegal jobnum $jobnum\n";
106   }
107
108   my @return;
109   if ( $job && $job->status ne 'failed' ) {
110     @return = ( 'progress', $job->statustext );
111   } elsif ( !$job ) { #handle job gone case : job sucessful
112                       # so close popup, redirect parent window...
113     @return = ( 'complete' );
114   } else {
115     @return = ( 'error', $job ? $job->statustext : $jobnum );
116   }
117
118   join("\n",@return);
119
120 }
121
122 sub get_new_query {
123   FS::UID::cgi();
124 }
125
126 1;
127