diff options
Diffstat (limited to 'FS')
-rw-r--r-- | FS/FS/Schema.pm | 3 | ||||
-rw-r--r-- | FS/FS/cdr.pm | 45 | ||||
-rw-r--r-- | FS/FS/cust_bill.pm | 22 | ||||
-rw-r--r-- | FS/FS/cust_bill_pkg.pm | 10 | ||||
-rw-r--r-- | FS/FS/cust_bill_pkg_detail.pm | 20 | ||||
-rw-r--r-- | FS/FS/part_pkg/prorate_Mixin.pm | 2 | ||||
-rw-r--r-- | FS/FS/quotation.pm | 20 | ||||
-rwxr-xr-x | FS/bin/freeside-passwd | 19 |
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; |