use FS::Record qw( qsearchs qsearch dbdef regexp_sql );
use FS::Misc qw( generate_email send_email generate_ps do_print );
use FS::Msgcat qw(gettext);
+use FS::CurrentUser;
use FS::payby;
use FS::cust_pkg;
use FS::cust_svc;
# bad idea to disable, causes billing to fail because of no tax rates later
-# unless ( $import ) {
+# except we don't fail any more
+ unless ( $import ) {
unless ( qsearch('cust_main_county', {
'country' => $self->country,
'state' => '',
'country' => $self->country,
} );
}
-# }
+ }
$error =
$self->ut_phonen('daytime', $self->country)
$self->$flag($1);
}
- $self->otaker(getotaker) unless $self->otaker;
+ $self->usernum($FS::CurrentUser::CurrentUser->usernum) unless $self->usernum;
warn "$me check AFTER: \n". $self->_dump
if $DEBUG > 2;
foreach my $pass (@passes) { # keys %cust_bill_pkg ) {
- my @cust_bill_pkg = @{ $cust_bill_pkg{$pass} };
+ my @cust_bill_pkg = _omit_zero_value_bundles(@{ $cust_bill_pkg{$pass} });
next unless @cust_bill_pkg; #don't create an invoice w/o line items
}
}
+ # it's silly to have a zero value postal_pkg, but....
+ @cust_bill_pkg = _omit_zero_value_bundles(@cust_bill_pkg);
+
}
}
return "can't create invoice for customer #". $self->custnum. ": $error";
}
- my @cust_bill_pkg_bundle = ();
foreach my $cust_bill_pkg ( @cust_bill_pkg ) {
$cust_bill_pkg->invnum($cust_bill->invnum);
- if (scalar(@cust_bill_pkg_bundle) && !$cust_bill_pkg->pkgpart_override) {
- $error = $self->_insert_cust_bill_pkg_bundle( @cust_bill_pkg_bundle );
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
- @cust_bill_pkg_bundle = ();
- }
- push @cust_bill_pkg_bundle, $cust_bill_pkg;
- }
- if (scalar(@cust_bill_pkg_bundle)) {
- $error = $self->_insert_cust_bill_pkg_bundle( @cust_bill_pkg_bundle );
+ my $error = $cust_bill_pkg->insert;
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
- return $error;
+ return "can't create invoice line item: $error";
}
}
''; #no error
}
-#insert line items while discarding bundled packages of 0 value
-sub _insert_cust_bill_pkg_bundle {
- my $self = shift;
- my @cust_bill_pkg = @_;
+#discard bundled packages of 0 value
+sub _omit_zero_value_bundles {
+ my @cust_bill_pkg = ();
+ my @cust_bill_pkg_bundle = ();
my $sum = 0;
- $sum += $_->setup + $_->recur foreach @cust_bill_pkg;
- return '' unless $sum > 0;
- foreach my $cust_bill_pkg ( @cust_bill_pkg ) {
- my $error = $cust_bill_pkg->insert;
- return "can't create invoice line item: $error" if $error;
+ foreach my $cust_bill_pkg ( @_ ) {
+ if (scalar(@cust_bill_pkg_bundle) && !$cust_bill_pkg->pkgpart_override) {
+ push @cust_bill_pkg, @cust_bill_pkg_bundle if $sum > 0;
+ @cust_bill_pkg_bundle = ();
+ $sum = 0;
+ }
+ $sum += $cust_bill_pkg->setup + $cust_bill_pkg->recur;
+ push @cust_bill_pkg_bundle, $cust_bill_pkg;
}
+ push @cust_bill_pkg, @cust_bill_pkg_bundle if $sum > 0;
+
+ (@cust_bill_pkg);
}
my %param = ( 'precommit_hooks' => $precommit_hooks,
'increment_next_bill' => $increment_next_bill,
'discounts' => \@discounts,
+ 'real_pkgpart' => $real_pkgpart,
);
my $method = $options{cancel} ? 'calc_cancel' : 'calc_recur';
#false laziness w/misc/process/payment.cgi - check both to make sure working
# correctly
- if ( defined $self->dbdef_table->column('paycvv')
- && length($self->paycvv)
+ if ( length($self->paycvv)
&& ! grep { $_ eq cardtype($options{payinfo}) } $conf->config('cvv-save')
) {
my $error = $self->remove_cvv;
my $param = shift;
#warn join('-',keys %$param);
my $fh = $param->{filehandle};
- my @fields = @{$param->{fields}};
+ my $agentnum = $param->{agentnum};
+ my $format = $param->{format};
+
+ my $extra_sql = ' AND '. $FS::CurrentUser::CurrentUser->agentnums_sql;
+
+ my @fields;
+ if ( $format eq 'simple' ) {
+ @fields = qw( custnum agent_custid amount pkg );
+ } else {
+ die "unknown format $format";
+ }
eval "use Text::CSV_XS;";
die $@ if $@;
$row{$field} = shift @columns;
}
- my $cust_main = qsearchs('cust_main', { 'custnum' => $row{'custnum'} } );
+ if ( $row{custnum} && $row{agent_custid} ) {
+ dbh->rollback if $oldAutoCommit;
+ return "can't specify custnum with agent_custid $row{agent_custid}";
+ }
+
+ my %hash = ();
+ if ( $row{agent_custid} && $agentnum ) {
+ %hash = ( 'agent_custid' => $row{agent_custid},
+ 'agentnum' => $agentnum,
+ );
+ }
+
+ if ( $row{custnum} ) {
+ %hash = ( 'custnum' => $row{custnum} );
+ }
+
+ unless ( scalar(keys %hash) ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "can't find customer without custnum or agent_custid and agentnum";
+ }
+
+ my $cust_main = qsearchs('cust_main', { %hash } );
unless ( $cust_main ) {
$dbh->rollback if $oldAutoCommit;
- return "unknown custnum $row{'custnum'}";
+ my $custnum = $row{custnum} || $row{agent_custid};
+ return "unknown custnum $custnum";
}
if ( $row{'amount'} > 0 ) {