fix application of things when there's lots of CCH data and an error, RT#41610
[freeside.git] / httemplate / edit / process / elements / ApplicationCommon.html
index 2782dc2..a73b1bc 100644 (file)
@@ -21,7 +21,8 @@ Examples:
 </%doc>
 %if ( $error ) {
 %  $cgi->param('error', $error);
-<% $cgi->redirect(popurl(2). $opt{error_redirect}. '?'. $cgi->query_string ) %>
+%  my $query = $m->scomp('/elements/create_uri_query');
+<% $cgi->redirect(popurl(2). $opt{error_redirect}. "?$query") %>
 %} else {
 <% header("$src_thing application$to sucessful") %>
   <SCRIPT TYPE="text/javascript">
@@ -34,6 +35,8 @@ Examples:
 
 my %opt = @_;
 
+my $error = '';
+
 my $src_thing = ucfirst($opt{'src_thing'});
 my $src_table = $opt{'src_table'};
 my $src_pkey = dbdef->table($src_table)->primary_key;
@@ -51,6 +54,18 @@ my $cust_main = qsearchs('cust_main', { 'custnum' => $src->custnum } )
 
 my $custnum = $cust_main->custnum;
 
+my @subnames = grep { /.+/ } map { /^subnum(\d+)$/ ? $1 : '' } $cgi->param;
+my @subitems = map { [ $cgi->param("subnum$_"), $cgi->param("subamount$_"), $cgi->param("taxXlocationnum$_") ] }
+               @subnames;
+{ local $^W = 0; @subitems = grep { $_->[1] + 0 } @subitems; }
+
+my %options = ();
+$options{subitems} = \@subitems if scalar(@subitems);
+
+my $oldAutoCommit = $FS::UID::AutoCommit;
+local $FS::UID::AutoCommit = 0;
+my $dbh = dbh;
 my $new;
 #  $new = new FS::cust_refund ( {
 #    'reason'  => 'Refunding payment', #enter reason in UI
@@ -62,6 +77,11 @@ my $new;
 #  } );
 #} else {
 
+  if ($src->amount != $cgi->param('src_amount')) {
+    $src->amount($cgi->param('src_amount'));
+    $error = $src->replace;
+  }
+
   my $class = 'FS::'. $opt{link_table};
 
   $new = $class->new( {
@@ -72,6 +92,13 @@ my $new;
 
 #}
 
-my $error = $new->insert;
 
+$options{manual} = 1;
+$error ||= $new->insert( %options );
+
+if ($error) {
+  $dbh->rollback if $oldAutoCommit;
+} else {
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+}
 </%init>