+ $html .= pkg_status_row_colspan(
+ $cust_pkg,
+ emt("Changed from [_1]: [_2]",
+ $cust_pkg->change_pkgnum,
+ $part_pkg->pkg_comment(cust_pkg=>$old, nopartpkg=>1)
+ ),
+ '',
+ 'size' => '-1',
+ 'align' => 'right',
+ );
+ }
+
+ $html;
+}
+
+sub pkg_status_row_detached {
+ my( $cust_pkg, %opt ) = @_;
+
+ return '' unless $cust_pkg->change_custnum;
+
+ my $html = '';
+
+ my $cust_main = $cust_pkg->change_cust_main;
+ if ( $cust_main ) {
+
+ my $cust_link = '<A HREF="cust_main.cgi?'. $cust_pkg->change_custnum. '">'.
+ encode_entities( $cust_main->name ).
+ '</A>';
+
+ my $what = $opt{'pkg_attached'} ? 'Attached' : 'Detached';
+
+ $html .= pkg_status_row_colspan( $cust_pkg,
+ emt("$what to customer #[_1]: ",
+ $cust_pkg->change_custnum
+ ).
+ $cust_link,
+ '',
+ 'size' => '-1',
+ 'align' => 'right',
+ 'colspan' => 4,
+ );
+ }
+
+ $html;
+}
+
+sub pkg_status_row_noauto {
+ my( $cust_pkg, %opt ) = @_;
+ my $part_pkg = $opt{'part_pkg'};
+ return '' unless $cust_pkg->no_auto || $part_pkg->no_auto;
+
+ #inefficient, should be passed in
+ my $cust_main = $cust_pkg->cust_main;
+
+ return '' unless $cust_main->payby =~ /^(CARD|CHEK)$/;
+ my $what = lc(FS::payby->shortname($cust_main->payby));
+
+ pkg_status_row_colspan( $cust_pkg, emt("No automatic $what charge"), '');
+}
+
+sub pkg_status_row_discount {
+ my( $cust_pkg, %opt ) = @_;
+
+ my $html;
+
+ foreach my $cust_pkg_discount (@{ $cust_pkg->{_cust_pkg_discount_active} }) {
+
+ my $discount = $cust_pkg_discount->discount;
+
+ my $label = '<B>'.emt('Discount').'</B>: '. $discount->description;
+ if ( $discount->months ) {
+ my $remaining = $discount->months - $cust_pkg_discount->months_used;
+ $remaining = sprintf('%.2f', $remaining) if $remaining =~ /\./;
+ $label .= emt("([_1] months remaining)",$remaining);
+ }
+
+ $label .= ' <FONT SIZE="-1">('.
+ '<A HREF="../misc/delete-cust_pkg_discount.html?'.
+ $cust_pkg_discount->pkgdiscountnum.
+ '">'.emt('remove discount').'</A>)</FONT>';
+
+ $html .= pkg_status_row_colspan( $cust_pkg, $label, '', %opt );
+