summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/Schema.pm3
-rw-r--r--FS/FS/cdr.pm45
-rw-r--r--FS/FS/cust_bill.pm22
-rw-r--r--FS/FS/cust_bill_pkg.pm10
-rw-r--r--FS/FS/cust_bill_pkg_detail.pm20
-rw-r--r--FS/FS/part_pkg/prorate_Mixin.pm2
-rw-r--r--FS/FS/quotation.pm20
-rwxr-xr-xFS/bin/freeside-passwd19
8 files changed, 88 insertions, 53 deletions
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index 65eadad21..edecb7f38 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -5661,9 +5661,6 @@ sub tables_hashref {
'sessionnum', 'int', 'NULL', '', '', '',
'subscriber', 'varchar', 'NULL', $char_d, '', '',
- #old
- 'cdrbatch', 'varchar', 'NULL', 255, '', '',
- #new
'cdrbatchnum', 'int', 'NULL', '', '', '',
# FK to cust_bill_pkg_detail; having a value here absolutely means
diff --git a/FS/FS/cdr.pm b/FS/FS/cdr.pm
index 331ac0f2f..3de022466 100644
--- a/FS/FS/cdr.pm
+++ b/FS/FS/cdr.pm
@@ -170,7 +170,7 @@ following fields are currently supported:
=item freesiderewritestatus - NULL, done, skipped
-=item cdrbatch
+=item cdrbatchnum
=item detailnum - Link to invoice detail (L<FS::cust_bill_pkg_detail>)
@@ -240,7 +240,6 @@ sub table_info {
'svcnum' => 'Freeside service',
'freesidestatus' => 'Freeside status',
'freesiderewritestatus' => 'Freeside rewrite status',
- 'cdrbatch' => 'Legacy batch',
'cdrbatchnum' => 'Batch',
'detailnum' => 'Freeside invoice detail line',
},
@@ -1659,7 +1658,12 @@ foreach my $INC ( @INC ) {
tie my %import_formats, 'Tie::IxHash',
map { $_ => $cdr_info{$_}->{'name'} }
- sort { $cdr_info{$a}->{'weight'} <=> $cdr_info{$b}->{'weight'} }
+
+ #this is not doing anything useful anymore
+ #sort { $cdr_info{$a}->{'weight'} <=> $cdr_info{$b}->{'weight'} }
+ #so just sort alpha
+ sort { lc($cdr_info{$a}->{'name'}) cmp lc($cdr_info{$b}->{'name'}) }
+
grep { exists($cdr_info{$_}->{'import_fields'}) }
keys %cdr_info;
@@ -1868,41 +1872,6 @@ sub process_batch_import {
# @columns = map { s/^ +//; $_; } @columns;
# }
-# _ upgrade_data
-#
-# Used by FS::Upgrade to migrate to a new database.
-
-sub _upgrade_data {
- my ($class, %opts) = @_;
-
- warn "$me upgrading $class\n" if $DEBUG;
-
- my $sth = dbh->prepare(
- 'SELECT DISTINCT(cdrbatch) FROM cdr WHERE cdrbatch IS NOT NULL'
- ) or die dbh->errstr;
-
- $sth->execute or die $sth->errstr;
-
- my %cdrbatchnum = ();
- while (my $row = $sth->fetchrow_arrayref) {
-
- my $cdr_batch = qsearchs( 'cdr_batch', { 'cdrbatch' => $row->[0] } );
- unless ( $cdr_batch ) {
- $cdr_batch = new FS::cdr_batch { 'cdrbatch' => $row->[0] };
- my $error = $cdr_batch->insert;
- die $error if $error;
- }
-
- $cdrbatchnum{$row->[0]} = $cdr_batch->cdrbatchnum;
- }
-
- $sth = dbh->prepare('UPDATE cdr SET cdrbatch = NULL, cdrbatchnum = ? WHERE cdrbatch IS NOT NULL AND cdrbatch = ?') or die dbh->errstr;
-
- foreach my $cdrbatch (keys %cdrbatchnum) {
- $sth->execute($cdrbatchnum{$cdrbatch}, $cdrbatch) or die $sth->errstr;
- }
-
-}
=item ip_addr_sql FIELD RANGE
diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm
index 8b94dcc87..bd1b8bbec 100644
--- a/FS/FS/cust_bill.pm
+++ b/FS/FS/cust_bill.pm
@@ -215,7 +215,7 @@ sub insert {
}
-=item void [ REASON ]
+=item void [ REASON [ , REPROCESS_CDRS ] ]
Voids this invoice: deletes the invoice and adds a record of the voided invoice
to the FS::cust_bill_void table (and related tables starting from
@@ -226,6 +226,7 @@ FS::cust_bill_pkg_void).
sub void {
my $self = shift;
my $reason = scalar(@_) ? shift : '';
+ my $reprocess_cdrs = scalar(@_) ? shift : '';
unless (ref($reason) || !$reason) {
$reason = FS::reason->new_or_existing(
@@ -257,7 +258,7 @@ sub void {
}
foreach my $cust_bill_pkg ( $self->cust_bill_pkg ) {
- my $error = $cust_bill_pkg->void($reason);
+ my $error = $cust_bill_pkg->void($reason, $reprocess_cdrs);
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
return $error;
@@ -3541,6 +3542,23 @@ sub _items_aging_balances {
return map{ sprintf('%.2f',$_) } @aging_balances;
}
+=item has_call_details
+
+Returns true if this invoice has call details.
+
+=cut
+
+sub has_call_details {
+ my $self = shift;
+ $self->scalar_sql("
+ SELECT 1 FROM cust_bill_pkg_detail
+ LEFT JOIN cust_bill_pkg USING (billpkgnum)
+ WHERE cust_bill_pkg_detail.format = 'C'
+ AND cust_bill_pkg.invnum = ?
+ LIMIT 1
+ ", $self->invnum);
+}
+
=item call_details [ OPTION => VALUE ... ]
Returns an array of CSV strings representing the call details for this invoice
diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm
index e44a84709..77dce2476 100644
--- a/FS/FS/cust_bill_pkg.pm
+++ b/FS/FS/cust_bill_pkg.pm
@@ -324,7 +324,7 @@ sub insert {
}
-=item void [ REASON ]
+=item void [ REASON [ , REPROCESS_CDRS ] ]
Voids this line item: deletes the line item and adds a record of the voided
line item to the FS::cust_bill_pkg_void table (and related tables).
@@ -334,6 +334,7 @@ line item to the FS::cust_bill_pkg_void table (and related tables).
sub void {
my $self = shift;
my $reason = scalar(@_) ? shift : '';
+ my $reprocess_cdrs = scalar(@_) ? shift : '';
unless (ref($reason) || !$reason) {
$reason = FS::reason->new_or_existing(
@@ -373,6 +374,9 @@ sub void {
cust_tax_exempt_pkg
cust_bill_pkg_fee
)) {
+ my %delete_args = ();
+ $delete_args{'reprocess_cdrs'} = $reprocess_cdrs
+ if $table eq 'cust_bill_pkg_detail';
foreach my $linked ( qsearch($table, { billpkgnum=>$self->billpkgnum }) ) {
@@ -380,7 +384,7 @@ sub void {
my $void = $vclass->new( {
map { $_ => $linked->get($_) } $linked->fields
});
- my $error = $void->insert || $linked->delete;
+ my $error = $void->insert || $linked->delete(%delete_args);
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
return $error;
@@ -863,7 +867,7 @@ sub _item_discount {
# show introductory rate as a pseudo-discount
if (!$d) { # this will conflict with showing real discounts
my $part_pkg = $self->part_pkg;
- if ( $part_pkg and $part_pkg->option('show_as_discount') ) {
+ if ( $part_pkg and $part_pkg->option('show_as_discount',1) ) {
my $cust_pkg = $self->cust_pkg;
my $intro_end = $part_pkg->intro_end($cust_pkg);
my $_date = $self->cust_bill->_date;
diff --git a/FS/FS/cust_bill_pkg_detail.pm b/FS/FS/cust_bill_pkg_detail.pm
index dd118c1b2..19b15f7dd 100644
--- a/FS/FS/cust_bill_pkg_detail.pm
+++ b/FS/FS/cust_bill_pkg_detail.pm
@@ -106,21 +106,37 @@ sub insert {
'';
}
-=item delete
+=item delete [ ARG => VALUE ... ]
Delete this record from the database.
+If the "reprocess_cdrs" argument is set to true, resets the status of any
+related CDRs (and deletes their associated cdr_termination records, if any).
+
=cut
sub delete {
- my $self = shift;
+ my( $self, %args ) = @_;
+
my $error = $self->SUPER::delete;
return $error if $error;
+
foreach my $cdr (qsearch('cdr', { detailnum => $self->detailnum })) {
+
$cdr->set('detailnum', '');
+ $cdr->set('freesidestatus', '') if $args{'reprocess_cdrs'};
$error = $cdr->replace;
return "error unlinking CDR #" . $cdr->acctid . ": $error" if $error;
+
+ #well, technically this could have been on other invoices / termination
+ # partners... separate flag?
+ $self->scalar_sql( 'DELETE FROM cdr_termination WHERE acctid = ?',
+ $cdr->acctid )
+ if $args{'reprocess_cdrs'};
+
}
+
+ '';
}
=item replace OLD_RECORD
diff --git a/FS/FS/part_pkg/prorate_Mixin.pm b/FS/FS/part_pkg/prorate_Mixin.pm
index 1a7b1efc0..9e97cc593 100644
--- a/FS/FS/part_pkg/prorate_Mixin.pm
+++ b/FS/FS/part_pkg/prorate_Mixin.pm
@@ -205,7 +205,7 @@ sub prorate_setup {
# For some reason (probably user override), the bill date has been set even
# though the package isn't billing yet. Start billing as though that was the
# start date.
- $sdate = $cust_pkg->bill;
+ $$sdate = $cust_pkg->bill;
$cust_pkg->setup($cust_pkg->bill);
}
# Now figure the start and end of the period that contains the start date.
diff --git a/FS/FS/quotation.pm b/FS/FS/quotation.pm
index 6b0c9145f..a3f061291 100644
--- a/FS/FS/quotation.pm
+++ b/FS/FS/quotation.pm
@@ -716,7 +716,10 @@ sub estimate {
my $cust_main;
if ( $cust_or_prospect->isa('FS::prospect_main') ) {
$cust_main = $cust_or_prospect->convert_cust_main;
- die "$cust_main (simulating customer signup)\n" unless ref $cust_main;
+ unless ( ref($cust_main) ) {
+ $temp_dbh->rollback;
+ die "$cust_main (simulating customer signup)\n";
+ }
$fake_self->set('prospectnum', '');
$fake_self->set('custnum', $cust_main->custnum);
} else {
@@ -726,7 +729,10 @@ sub estimate {
# order packages
local($FS::cust_pkg::disable_start_on_hold) = 1;
$error = $fake_self->order(\%pkgnum_of);
- die "$error (simulating package order)\n" if $error;
+ if ( $error ) {
+ $temp_dbh->rollback;
+ die "$error (simulating package order)\n";
+ }
my @new_pkgs = map { FS::cust_pkg->by_key($_) } values(%pkgnum_of);
@@ -739,7 +745,10 @@ sub estimate {
'no_usage_reset' => 1,
);
$error = $cust_main->bill(%bill_opt);
- die "$error (simulating initial billing)\n" if $error;
+ if ( $error ) {
+ $temp_dbh->rollback;
+ die "$error (simulating initial billing)\n" if $error;
+ }
# pick dates for future bills
my %next_bill_pkgs;
@@ -755,7 +764,10 @@ sub estimate {
$bill_opt{'return_bill'} = $return_bill[$i] = [];
$bill_opt{'pkg_list'} = $next_bill_pkgs{$next_bill};
$error = $cust_main->bill(%bill_opt);
- die "$error (simulating recurring billing cycle $i)\n" if $error;
+ if ( $error ) {
+ $temp_dbh->rollback;
+ die "$error (simulating recurring billing cycle $i)\n";
+ }
$i++;
}
diff --git a/FS/bin/freeside-passwd b/FS/bin/freeside-passwd
new file mode 100755
index 000000000..dbd566e84
--- /dev/null
+++ b/FS/bin/freeside-passwd
@@ -0,0 +1,19 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+my $user = shift or die &usage;
+my $password = shift or die &usage;
+
+use FS::UID qw(adminsuidsetup);
+use FS::Record qw( qsearchs );
+use FS::access_user;
+
+adminsuidsetup $user;
+
+my $access_user = qsearchs('access_user', {'username'=>$user})
+ or die "unknown username $user\n";
+my $error = $access_user->change_password($password);
+die $error if $error;
+
+1;