From: jeff Date: Mon, 23 Oct 2006 04:21:04 +0000 (+0000) Subject: events should attach reasons X-Git-Tag: TRIXBOX_2_6~904 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=9811b8ce65909a293810ddbcd8c9b5ca963fba01 events should attach reasons --- diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index 704df25a7..1656658ca 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -294,7 +294,7 @@ sub cust_suspend_if_balance_over { if ( $cust_main->total_owed_date($self->_date) < $amount ) { return (); } else { - $cust_main->suspend; + $cust_main->suspend(@_); } } diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index 3942acf01..983c469e7 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -1642,7 +1642,7 @@ Returns a list: an empty list on success or a list of errors. sub suspend { my $self = shift; - grep { $_->suspend } $self->unsuspended_pkgs; + grep { $_->suspend(@_) } $self->unsuspended_pkgs; } =item suspend_if_pkgpart PKGPART [ , PKGPART ... ] @@ -1656,8 +1656,14 @@ Returns a list: an empty list on success or a list of errors. sub suspend_if_pkgpart { my $self = shift; - my @pkgparts = @_; - grep { $_->suspend } + my (@pkgparts, %opt); + if (ref($_[0]) eq 'HASH'){ + @pkgparts = @{$_[0]{pkgparts}}; + %opt = %{$_[0]}; + }else{ + @pkgparts = @_; + } + grep { $_->suspend(%opt) } grep { my $pkgpart = $_->pkgpart; grep { $pkgpart eq $_ } @pkgparts } $self->unsuspended_pkgs; } @@ -1673,8 +1679,14 @@ Returns a list: an empty list on success or a list of errors. sub suspend_unless_pkgpart { my $self = shift; - my @pkgparts = @_; - grep { $_->suspend } + my (@pkgparts, %opt); + if (ref($_[0]) eq 'HASH'){ + @pkgparts = @{$_[0]{pkgparts}}; + %opt = %{$_[0]}; + }else{ + @pkgparts = @_; + } + grep { $_->suspend(%opt) } grep { my $pkgpart = $_->pkgpart; ! grep { $pkgpart eq $_ } @pkgparts } $self->unsuspended_pkgs; } diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm index 4976a2d50..4166f090e 100644 --- a/FS/FS/cust_pkg.pm +++ b/FS/FS/cust_pkg.pm @@ -15,6 +15,7 @@ use FS::pkg_svc; use FS::cust_bill_pkg; use FS::h_cust_svc; use FS::reg_code; +use FS::cust_pkg_reason; # need to 'use' these instead of 'require' in sub { cancel, suspend, unsuspend, # setup } @@ -270,7 +271,7 @@ Calls =cut sub replace { - my( $new, $old ) = ( shift, shift ); + my( $new, $old, %options ) = @_; #return "Can't (yet?) change pkgpart!" if $old->pkgpart != $new->pkgpart; return "Can't change otaker!" if $old->otaker ne $new->otaker; @@ -295,6 +296,16 @@ sub replace { local $FS::UID::AutoCommit = 0; my $dbh = dbh; + if ($options{'reason'} && $new->expire && $old->expire ne $new->expire) { + my $error = $new->insert_reason( 'reason' => $options{'reason'}, + 'date' => $new->expire, + ); + if ( $error ) { + dbh->rollback if $oldAutoCommit; + return "Error inserting cust_pkg_reason: $error"; + } + } + #save off and freeze RADIUS attributes for any associated svc_acct records my @svc_acct = (); if ( $old->part_pkg->is_prepaid || $new->part_pkg->is_prepaid ) { @@ -431,6 +442,14 @@ sub cancel { local $FS::UID::AutoCommit = 0; my $dbh = dbh; + if ($options{'reason'}) { + $error = $self->insert_reason( 'reason' => $options{'reason'} ); + if ( $error ) { + dbh->rollback if $oldAutoCommit; + return "Error inserting cust_pkg_reason: $error"; + } + } + my %svc; foreach my $cust_svc ( qsearch( 'cust_svc', { 'pkgnum' => $self->pkgnum } ) @@ -503,7 +522,7 @@ If there is an error, returns the error, otherwise returns false. =cut sub suspend { - my $self = shift; + my( $self, %options ) = @_; my $error ; local $SIG{HUP} = 'IGNORE'; @@ -517,6 +536,14 @@ sub suspend { local $FS::UID::AutoCommit = 0; my $dbh = dbh; + if ($options{'reason'}) { + $error = $self->insert_reason( 'reason' => $options{'reason'} ); + if ( $error ) { + dbh->rollback if $oldAutoCommit; + return "Error inserting cust_pkg_reason: $error"; + } + } + foreach my $cust_svc ( qsearch( 'cust_svc', { 'pkgnum' => $self->pkgnum } ) ) { @@ -652,6 +679,23 @@ sub last_bill { $cust_bill_pkg ? $cust_bill_pkg->sdate : $self->setup || 0; } +=item last_reason + +Returns the most recent FS::reason associated with the package. + +=cut + +sub last_reason { + my $self = shift; + my $cust_pkg_reason = qsearchs( { + 'table' => 'cust_pkg_reason', + 'hashref' => { 'pkgnum' => $self->pkgnum, }, + 'extra_sql'=> 'ORDER BY date DESC', + } ); + qsearchs ( 'reason', { 'reasonnum' => $cust_pkg_reason->reasonnum } ) + if $cust_pkg_reason; +} + =item part_pkg Returns the definition for this billing item, as an FS::part_pkg object (see @@ -1387,6 +1431,24 @@ sub order { ''; } +sub insert_reason { + my ($self, %options) = @_; + + my $otaker = $FS::CurrentUser::CurrentUser->name; + $otaker = $FS::CurrentUser::CurrentUser->username + if (($otaker) eq "User, Legacy"); + + my $cust_pkg_reason = + new FS::cust_pkg_reason({ 'pkgnum' => $self->pkgnum, + 'reasonnum' => $options{'reason'}, + 'otaker' => $otaker, + 'date' => $options{'date'} + ? $options{'date'} + : time, + }); + return $cust_pkg_reason->insert; +} + =back =head1 BUGS diff --git a/FS/FS/part_bill_event.pm b/FS/FS/part_bill_event.pm index 3f49d292f..466ff8960 100644 --- a/FS/FS/part_bill_event.pm +++ b/FS/FS/part_bill_event.pm @@ -187,8 +187,10 @@ sub check { } } - my $reasonr = qsearchs('reason', {'reasonnum' => $self->reason}); - return "Unknown reason" unless $reasonr; + if ($self->reason){ + my $reasonr = qsearchs('reason', {'reasonnum' => $self->reason}); + return "Unknown reason" unless $reasonr; + } $self->SUPER::check; } diff --git a/httemplate/edit/part_bill_event.cgi b/httemplate/edit/part_bill_event.cgi index dda0bef69..77aa82887 100755 --- a/httemplate/edit/part_bill_event.cgi +++ b/httemplate/edit/part_bill_event.cgi @@ -162,34 +162,34 @@ Invoice Event #<% $hashref->{eventpart} ? $hashref->{eventpart} : "(NEW)" %> % }, % 'suspend' => { % 'name' => 'Suspend', -% 'code' => '$cust_main->suspend();', +% 'code' => '$cust_main->suspend(reason => %%%sreason%%%);', % 'weight' => 10, % 'reason' => 'S', % }, % 'suspend-if-balance' => { % 'name' => 'Suspend if balance (this invoice and previous) over', -% 'code' => '$cust_bill->cust_suspend_if_balance_over( %%%balanceover%%% );', +% 'code' => '$cust_bill->cust_suspend_if_balance_over( %%%balanceover%%%, reason => %%%sreason%%%, );', % 'html' => " $money_char ". '', % 'weight' => 10, % 'reason' => 'S', % }, % 'suspend-if-pkgpart' => { % 'name' => 'Suspend packages', -% 'code' => '$cust_main->suspend_if_pkgpart(%%%if_pkgpart%%%);', +% 'code' => '$cust_main->suspend_if_pkgpart({pkgparts => [%%%if_pkgpart%%%,], reason => %%%sreason%%%,});', % 'html' => sub { &select_pkgpart('if_pkgpart', @_) }, % 'weight' => 10, % 'reason' => 'S', % }, % 'suspend-unless-pkgpart' => { % 'name' => 'Suspend packages except', -% 'code' => '$cust_main->suspend_unless_pkgpart(%%%unless_pkgpart%%%);', +% 'code' => '$cust_main->suspend_unless_pkgpart({unless_pkgpart => [%%%unless_pkgpart%%%], reason => %%%sreason%%%,});', % 'html' => sub { &select_pkgpart('unless_pkgpart', @_) }, % 'weight' => 10, % 'reason' => 'S', % }, % 'cancel' => { % 'name' => 'Cancel', -% 'code' => '$cust_main->cancel();', +% 'code' => '$cust_main->cancel(reason => %%%creason%%%);', % 'weight' => 10, % 'reason' => 'C', % }, diff --git a/httemplate/edit/process/part_bill_event.cgi b/httemplate/edit/process/part_bill_event.cgi index dd5cd0c8e..cedba1e9f 100755 --- a/httemplate/edit/process/part_bill_event.cgi +++ b/httemplate/edit/process/part_bill_event.cgi @@ -31,23 +31,19 @@ % my $rnum; % my $rtype; % my $reasonm; -% if ($eventcode =~ /cancel/) { -% $cgi->param('creason') =~ /^(-?\d+)$/ || die "Invalid creason"; +% my $class = ''; +% $class='c' if ($eventcode =~ /cancel/); +% $class='s' if ($eventcode =~ /suspend/); +% if ($class) { +% $cgi->param("${class}reason") =~ /^(-?\d+)$/ +% or $error = "Invalid ${class}reason"; % $rnum = $1; % if ($rnum == -1) { -% $cgi->param('newcreasonT') =~ /^(\d+)$/ || die "Invalid newcreasonT"; +% $cgi->param("new${class}reasonT") =~ /^(\d+)$/ +% or $error = "Invalid new${class}reasonT"; % $rtype = $1; -% $cgi->param('newcreason') =~ /^([\s\w]+)$/ || die "Invalid newcreasonT"; -% $reasonm = $1; -% } -% } -% if ($eventcode =~ /suspend/) { -% $cgi->param('sreason') =~ /^(-?\d+)$/ || die "Invalid sreason"; -% $rnum = $1; -% if ($rnum == -1) { -% $cgi->param('newsreasonT') =~ /^(\d+)$/ || die "Invalid newsreasonT"; -% $rtype = $1; -% $cgi->param('newsreason') =~ /^([\s\w]+)$/ || die "Invalid newsreasonT"; +% $cgi->param("new${class}reason") =~ /^([\s\w]+)$/ +% or $error = "Invalid new${class}reason"; % $reasonm = $1; % } % } @@ -57,6 +53,11 @@ % 'reason_type' => $rtype, % }); % $error = $reason->insert or $rnum = $reason->reasonnum; +% unless ($error) { +% $cgi->param("${class}reason", $rnum); +% $cgi->param("new${class}reason", ''); +% $cgi->param("new${class}reasonT", ''); +% } % } % % unless($error){ @@ -84,5 +85,3 @@ %} % % - - diff --git a/httemplate/edit/reason.html b/httemplate/edit/reason.html index 2f5932846..7c0722cea 100644 --- a/httemplate/edit/reason.html +++ b/httemplate/edit/reason.html @@ -9,6 +9,9 @@ % % my (@types) = qsearch( 'reason_type', { 'class' => $class } ); % +% unless (scalar(@types)) { +% print $cgi->redirect( "reason_type.html?class=$class" ); +% } <% include( 'elements/edit.html', 'name' => ucfirst($classname) . ' Reason', 'table' => 'reason', diff --git a/httemplate/elements/tr-select-reason.html b/httemplate/elements/tr-select-reason.html index 6c66e8170..0c05ae74e 100755 --- a/httemplate/elements/tr-select-reason.html +++ b/httemplate/elements/tr-select-reason.html @@ -4,6 +4,11 @@ { %if ($curuser->access_right($access_right)){ + if (document.getElementById('<% $name %>').selectedIndex == 0){ + <% $controlledbutton ? $controlledbutton.'.disabled = true;' : ';' %> + }else{ + <% $controlledbutton ? $controlledbutton.'.disabled = false;' : ';' %> + } if (document.getElementById('<% $name %>').selectedIndex == (document.getElementById('<% $name %>').length - 1)) { @@ -36,6 +41,7 @@ % extra_sql => $extra_sql, % addl_from => 'LEFT JOIN reason_type ON reason_type.typenum = reason.reason_type', % }); + % foreach my $reason (@reasons) { % } @@ -68,7 +74,7 @@ <%init> -my($name, $class, $init_reason, $init_type, $init_newreason) = @_; +my($name, $class, $init_reason, $init_type, $init_newreason, $controlledbutton) = @_; my($extra_sql, $curuser, $access_right, $display, $disabled); if ($class eq 'C') { diff --git a/httemplate/misc/cancel_pkg.html b/httemplate/misc/cancel_pkg.html index bfb0893e9..e61000618 100755 --- a/httemplate/misc/cancel_pkg.html +++ b/httemplate/misc/cancel_pkg.html @@ -42,12 +42,12 @@ %} % -<% include('/elements/tr-select-reason.html', 'reasonnum', $class) %> +<% include('/elements/tr-select-reason.html', 'reasonnum', $class, '', '', '', 'document.sc_popup.submit' ) %>
- + diff --git a/httemplate/misc/process/cancel_pkg.html b/httemplate/misc/process/cancel_pkg.html index b53809854..01433a3dc 100755 --- a/httemplate/misc/process/cancel_pkg.html +++ b/httemplate/misc/process/cancel_pkg.html @@ -55,22 +55,13 @@ %} % %unless ($error) { -% my $cust_pkg_reason = new FS::cust_pkg_reason({ 'pkgnum' => $pkgnum, -% 'reasonnum' => $reasonnum, -% 'otaker' => $otaker, -% 'date' => $date, -% }); -% $error = $cust_pkg_reason->insert; -%} -% -%unless ($error) { % if ($method eq 'expire'){ % my %hash = $cust_pkg->hash; % $hash{'expire'}=$date; % my $new = new FS::cust_pkg (\%hash); -% $error = $new->replace($cust_pkg); +% $error = $new->replace($cust_pkg, 'reason' => $reasonnum); % }else{ -% $error = $cust_pkg->$method +% $error = $cust_pkg->$method( 'reason' => $reasonnum ); % } %} %