use FS::cust_bill_pkg_display;
use FS::cust_bill_pay_pkg;
use FS::cust_credit_bill_pkg;
+use FS::cust_tax_exempt_pkg;
@ISA = qw( FS::cust_main_Mixin FS::Record );
$error = $record->insert;
- $error = $new_record->replace($old_record);
-
- $error = $record->delete;
-
$error = $record->check;
=head1 DESCRIPTION
=item unitrecur - If not set, defaults to recur
+=item hidden - If set to Y, indicates data should not appear as separate line item on invoice
+
=back
sdate and edate are specified as UNIX timestamps; see L<perlfunc/"time">. Also
return $error;
}
- if ( defined dbdef->table('cust_bill_pkg_detail') && $self->get('details') ) {
+ if ( $self->get('details') ) {
foreach my $detail ( @{$self->get('details')} ) {
my $cust_bill_pkg_detail = new FS::cust_bill_pkg_detail {
'billpkgnum' => $self->billpkgnum,
'detail' => (ref($detail) ? $detail->[1] : $detail ),
'amount' => (ref($detail) ? $detail->[2] : '' ),
'classnum' => (ref($detail) ? $detail->[3] : '' ),
+ 'phonenum' => (ref($detail) ? $detail->[4] : '' ),
};
$error = $cust_bill_pkg_detail->insert;
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
- return $error;
+ return "error inserting cust_bill_pkg_detail: $error";
}
}
}
- if ( defined dbdef->table('cust_bill_pkg_display') && $self->get('display') ){
+ if ( $self->get('display') ) {
foreach my $cust_bill_pkg_display ( @{ $self->get('display') } ) {
$cust_bill_pkg_display->billpkgnum($self->billpkgnum);
$error = $cust_bill_pkg_display->insert;
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
- return $error;
+ return "error inserting cust_bill_pkg_display: $error";
+ }
+ }
+ }
+
+ if ( $self->_cust_tax_exempt_pkg ) {
+ foreach my $cust_tax_exempt_pkg ( @{$self->_cust_tax_exempt_pkg} ) {
+ $cust_tax_exempt_pkg->billpkgnum($self->billpkgnum);
+ $error = $cust_tax_exempt_pkg->insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "error inserting cust_tax_exempt_pkg: $error";
}
}
}
+ my $tax_location = $self->get('cust_bill_pkg_tax_location');
+ if ( $tax_location ) {
+ foreach my $cust_bill_pkg_tax_location ( @$tax_location ) {
+ $cust_bill_pkg_tax_location->billpkgnum($self->billpkgnum);
+ warn $cust_bill_pkg_tax_location;
+ $error = $cust_bill_pkg_tax_location->insert;
+ warn $error;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "error inserting cust_bill_pkg_tax_location: $error";
+ }
+ }
+ }
+
+ my $tax_rate_location = $self->get('cust_bill_pkg_tax_rate_location');
+ if ( $tax_rate_location ) {
+ foreach my $cust_bill_pkg_tax_rate_location ( @$tax_rate_location ) {
+ $cust_bill_pkg_tax_rate_location->billpkgnum($self->billpkgnum);
+ $error = $cust_bill_pkg_tax_rate_location->insert;
+ warn $error;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "error inserting cust_bill_pkg_tax_rate_location: $error";
+ }
+ }
+ }
+
+ my $cust_tax_adjustment = $self->get('cust_tax_adjustment');
+ if ( $cust_tax_adjustment ) {
+ $cust_tax_adjustment->billpkgnum($self->billpkgnum);
+ $error = $cust_tax_adjustment->replace;
+ warn $error;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "error replacing cust_tax_adjustment: $error";
+ }
+ }
+
$dbh->commit or die $dbh->errstr if $oldAutoCommit;
'';
return "Can't delete cust_bill_pkg records!";
}
-=item replace OLD_RECORD
-
-Currently unimplemented. This would be even more of an accounting nightmare
-than deleteing the items. Just don't do it.
-
-=cut
-
-sub replace {
- return "Can't modify cust_bill_pkg records!";
-}
+#alas, bin/follow-tax-rename
+#
+#=item replace OLD_RECORD
+#
+#Currently unimplemented. This would be even more of an accounting nightmare
+#than deleteing the items. Just don't do it.
+#
+#=cut
+#
+#sub replace {
+# return "Can't modify cust_bill_pkg records!";
+#}
=item check
|| $self->ut_numbern('sdate')
|| $self->ut_numbern('edate')
|| $self->ut_textn('itemdesc')
+ || $self->ut_textn('itemcomment')
+ || $self->ut_enum('hidden', [ '', 'Y' ])
;
return $error if $error;
qsearchs( 'cust_bill', { 'invnum' => $self->invnum } );
}
+=item previous_cust_bill_pkg
+
+Returns the previous cust_bill_pkg for this package, if any.
+
+=cut
+
+sub previous_cust_bill_pkg {
+ my $self = shift;
+ return unless $self->sdate;
+ qsearchs({
+ 'table' => 'cust_bill_pkg',
+ 'hashref' => { 'pkgnum' => $self->pkgnum,
+ 'sdate' => { op=>'<', value=>$self->sdate },
+ },
+ 'order_by' => 'ORDER BY sdate DESC LIMIT 1',
+ });
+}
+
=item details [ OPTION => VALUE ... ]
Returns an array of detail information for the invoice line item.
foreach ($csv->fields) {
$result .= ' & ' if $column > 1;
if ($column > 6) { # KLUDGE ALERT!
- $result .= '\multicolumn{1}{l}{\small{'.
+ $result .= '\multicolumn{1}{l}{\scriptsize{'.
&$escape_function($_). '}}';
}else{
- $result .= '\small{'. &$escape_function($_). '}';
+ $result .= '\scriptsize{'. &$escape_function($_). '}';
}
$column++;
}
$format_sub = $opt{format_function} if $opt{format_function};
map { ( $_->format eq 'C'
- ? &{$format_sub}( $_->detail )
+ ? &{$format_sub}( $_->detail, $_ )
: &{$escape_function}( $_->detail )
)
}
if ( $self->pkgnum > 0 ) {
$self->itemdesc || $self->part_pkg->pkg;
} else {
- $self->itemdesc || 'Tax';
+ my $desc = $self->itemdesc || 'Tax';
+ $desc .= ' '. $self->itemcomment if $self->itemcomment =~ /\S/;
+ $desc;
}
}
}
+# reserving this name for my friends FS::{tax_rate|cust_main_county}::taxline
+# and FS::cust_main::bill
+
+sub _cust_tax_exempt_pkg {
+ my ( $self ) = @_;
+
+ $self->{Hash}->{_cust_tax_exempt_pkg} or
+ $self->{Hash}->{_cust_tax_exempt_pkg} = [];
+
+}
+
=back