fix recurring fee edit on clone/customize, RT#72958
[freeside.git] / httemplate / edit / part_pkg.cgi
index 570c5ac..64a7525 100755 (executable)
@@ -92,7 +92,7 @@
                    { type => 'columnstart' },
                    
                      { field     => 'pkg',
-                       type      => 'text',
+                       type      => 'input-locale-text',
                        size      => 40, #32
                        maxlength => 50,
                      },
                      { field  => 'change_to_pkgpart',
                        type   => 'select-part_pkg',
                        extra_sql  => sub { $pkgpart
-                        ? "AND pkgpart != $pkgpart"
+                        ? "AND part_pkg.pkgpart != $pkgpart"
                         : ''
                        },
                        empty_label => 'no package',
                      { field=>'agent_pkgpartid', type=>'text', size=>21 },
 
                      { type  => 'tablebreak-tr-title',
-                       value => 'Line-item revenue recogition', #better name?
+                       value => 'Line-item revenue recognition', #better name?
                      },
                      { field=>'pay_weight',    type=>'text', size=>6 },
                      { field=>'credit_weight', type=>'text', size=>6 },
                      'name_col' => 'name',
                      'hashref'  => { 'disabled' => '' },
                      'multiple' => 1,
+                     'curr_value_callback' => $report_option_value_callback,
                    },
 
                    { 'type'    => 'tablebreak-tr-title',
                    { 'field'      => 'bill_dst_pkgpart',
                      'type'       => 'select-part_pkg',
                      'extra_sql'  => sub { $pkgpart
-                                            ? "AND pkgpart != $pkgpart"
+                                            ? "AND part_pkg.pkgpart != $pkgpart"
                                             : ''
                                          },
                      'label_callback' => sub { shift->pkg_comment_only },
                      'label'      => 'Also include services from package: ',
                      'type'       => 'select-part_pkg',
                      'extra_sql'  => sub { $pkgpart
-                                            ? "AND pkgpart != $pkgpart"
+                                            ? "AND part_pkg.pkgpart != $pkgpart"
                                             : ''
                                          },
                      'label_callback' => sub { shift->pkg_comment_only },
@@ -495,42 +496,6 @@ my $recur_show_zero_disabled = 1;
 
 my $pkgpart = '';
 
-my $splice_locale_fields = sub {
-  my( $fields, $pkey_value_callback, $pkg_value_callback ) = @_;
-
-  my $n = 0;
-  my @locale_fields = (
-    map { 
-          my $pkey_value= $pkey_value_callback ? &$pkey_value_callback($_) : '';
-          my $pkg_value = $pkg_value_callback
-                            ? $pkg_value_callback eq 'cgiparam'
-                                ? $cgi->param('pkgpartmsgnum'. $n. '_pkg')
-                                : &$pkg_value_callback($_)
-                            : '';
-          (
-            { field     => 'pkgpartmsgnum'. $n,
-              type      => 'hidden',
-              value     => $pkey_value,
-            },
-            { field     => 'pkgpartmsgnum'. $n. '_locale',
-              type      => 'hidden',
-              value     => $_,
-            },
-            { field     => 'pkgpartmsgnum'. $n++. '_pkg',
-              type      => 'text',
-              size      => 40,
-              #maxlength => 50,
-              value     => $pkg_value,
-            },
-          );
-  
-        }
-      @locales
-  );
-  splice(@$fields, 7, 0, @locale_fields); #XXX 7 is arbitrary above
-
-};
-
 my $error_callback = sub {
   my($cgi, $object, $fields, $opt ) = @_;
 
@@ -579,16 +544,6 @@ my $error_callback = sub {
 
   $pkgpart = $object->pkgpart;
 
-  &$splice_locale_fields(
-    $fields,
-    sub {
-          my $locale = shift;
-          my $part_pkg_msgcat = $object->part_pkg_msgcat($locale);
-          $part_pkg_msgcat ? $part_pkg_msgcat->pkgpartmsgnum : '';
-        },
-    'cgiparam'
-  );
-
   if ( $cgi->param('error') =~ / is suggested with / ) {
     #yeah, detection is a shitty kludge, but we don't have exception objects
     $opt->{form_init} = '<INPUT TYPE="checkbox" NAME="part_pkg_restrict_soft_override" VALUE="Y"> Override suggestion<BR><BR>';
@@ -609,29 +564,42 @@ my $new_object_callback = sub {
 
 };
 
+my $report_option_value_callback = sub {
+  my ($cgi, $object) = @_;
+  my @report_option;
+  if ( defined $cgi->param('report_option') ) {
+    @report_option = $cgi->param('report_option');
+  } else {
+    foreach ($object->options) {
+      /^report_option_(\d+)$/ && (push @report_option, $1);
+    }
+  }
+  join(',', @report_option);
+};
+
 sub set_report_option {
   my($cgi, $object, $fields ) = @_; #, $opt
 
   my @report_option = ();
   foreach ($object->options) {
     /^usage_taxproductnum_(\d+)$/ && ($taxproductnums{$1} = 1);
-    /^report_option_(\d+)$/ && (push @report_option, $1);
+#    /^report_option_(\d+)$/ && (push @report_option, $1);
   }
   foreach ($object->part_pkg_taxoverride) {
     $taxproductnums{$_->usage_class} = 1
       if $_->usage_class;
   }
 
-  $cgi->param('report_option', join(',', @report_option));
-  foreach my $field ( @$fields ) {
-    next unless ( 
-      ref($field) eq 'HASH' &&
-      $field->{field} &&
-      $field->{field} eq 'report_option'
-    );
-    #$field->{curr_value} = join(',', @report_option);
-    $field->{value} = join(',', @report_option);
-  }
+#  $cgi->param('report_option', join(',', @report_option));
+#  foreach my $field ( @$fields ) {
+#    next unless ( 
+#      ref($field) eq 'HASH' &&
+#      $field->{field} &&
+#      $field->{field} eq 'report_option'
+#    );
+#    #$field->{curr_value} = join(',', @report_option);
+#    $field->{value} = join(',', @report_option);
+#  }
 
 }
 
@@ -665,20 +633,6 @@ my $edit_callback = sub {
 
   $pkgpart = $object->pkgpart;
 
-  &$splice_locale_fields(
-    $fields,
-    sub {
-          my $locale = shift;
-          my $part_pkg_msgcat = $object->part_pkg_msgcat($locale);
-          $part_pkg_msgcat ? $part_pkg_msgcat->pkgpartmsgnum : '';
-        },
-    sub {
-          my $locale = shift;
-          my $part_pkg_msgcat = $object->part_pkg_msgcat($locale);
-          $part_pkg_msgcat ? $part_pkg_msgcat->pkg : '';
-        }
-  );
-
 };
 
 my $new_callback = sub {
@@ -692,8 +646,6 @@ my $new_callback = sub {
 
   $options{'suspend_bill'}=1 if $conf->exists('part_pkg-default_suspend_bill');
 
-  &$splice_locale_fields($fields, '', '');
-
 };
 
 my $clone_callback = sub {
@@ -701,7 +653,7 @@ my $clone_callback = sub {
 
   if ( $cgi->param('pkgnum') ) {
 
-    my $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $cgi->param('pkgnum') } );
+    my $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => scalar($cgi->param('pkgnum')) } );
     $object->agentnum( $cust_pkg->cust_main->agentnum );
 
     $opt->{action} = 'Custom';
@@ -726,23 +678,18 @@ my $clone_callback = sub {
   $object->set($_ => $options{$_})
     foreach (qw( setup_fee recur_fee disable_line_item_date_ranges ));
 
+  $recur_disabled = $object->freq ? 0 : 1;
+  $recur_show_zero_disabled =
+    $object->freq
+      ? $object->option('recur_fee') > 0 ? 1 : 0
+      : 1;
+
   foreach my $currency ( $conf->config('currencies') ) {
     my %part_pkg_currency = $object->part_pkg_currency_options($currency);
     $object->set( $_.'_'.$currency, $part_pkg_currency{$_} )
       foreach keys %part_pkg_currency;
   }
 
-  $recur_disabled = $object->freq ? 0 : 1;
-
-  &$splice_locale_fields(
-    $fields,
-    '',
-    sub {
-      my $locale = shift;
-      my $part_pkg_msgcat = $object->part_pkg_msgcat($locale);
-      $part_pkg_msgcat ? $part_pkg_msgcat->pkg : '';
-    }
-  );
 };
 
 my $discount_error_callback = sub {
@@ -769,7 +716,7 @@ my $usageprice_error_callback = sub {
                && $cgi->param("usagepricepart$1_price") )
         {
           new FS::part_pkg_usageprice {
-            'usagepricepart' => $cgi->param("usagepricepart$1"),
+            'usagepricepart' => scalar($cgi->param("usagepricepart$1")),
             'pkgpart'        => $object->pkgpart,
             'price'          => scalar($cgi->param("usagepricepart$1_price")),
             #'currency
@@ -1061,6 +1008,16 @@ my $html_bottom = sub {
                    : ''
                  ). '>';
 
+      } elsif ( $href->{$field}{'type'} =~ /^select-rt-/ ) {
+
+        $html .= include('/elements/'.$href->{$field}{'type'}.'.html',
+                           'name'       => $layer.'__'.$field,
+                           'curr_value' => $options{$field},
+                           map { $_ => $href->{$field}{$_} }
+                             grep { $_ !~ /^(name|type|parse)$/ }
+                               keys %{ $href->{$field} }
+                        );
+
       } elsif ( $href->{$field}{'type'} eq 'select-rate' ) {
 
         $html .= include('/elements/select-rate.html',