MT#8433 Update contract_balances data during invoices mass generation.

gjungwirth/email_test
Irka 12 years ago
parent cecc2d3e1e
commit d525e4c8dc

@ -1,5 +1,5 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
use lib '/media/sf_/usr/share/VMHost/ngcp-panel/lib'; use lib '/root/VMHost/ngcp-panel/lib';
use strict; use strict;
use Getopt::Long; use Getopt::Long;
@ -85,6 +85,8 @@ Getopt::Long::GetOptions($opt,
'resend', 'resend',
'regenerate', 'regenerate',
'allow_terminated', 'allow_terminated',
'update_contract_balance',
'update_contract_balance_nonzero',
'help|?', 'help|?',
'man' 'man'
) or pod2usage(2); ) or pod2usage(2);
@ -219,8 +221,11 @@ sub get_billing_profile{
); );
} }
sub get_invoice_data_raw{ sub get_invoice_data_raw{
my($client_contract, $stime, $etime) = @_; my($client_contract, $stime, $etime, $opt_local) = @_;
my $invoice_details_calls = $dbh->selectall_arrayref('select cdr.*,from_unixtime(cdr.start_time) as start_time,bzh.zone, bzh.detail as zone_detail $opt_local //= {};
my ($invoice_details_calls,$invoice_details_zones);
if(!$opt_local->{count_contract_balance}){
$invoice_details_calls = $dbh->selectall_arrayref('select cdr.*,from_unixtime(cdr.start_time) as start_time,bzh.zone, bzh.detail as zone_detail
from accounting.cdr from accounting.cdr
LEFT JOIN billing.billing_zones_history bzh ON bzh.bz_id = cdr.source_customer_billing_zone_id LEFT JOIN billing.billing_zones_history bzh ON bzh.bz_id = cdr.source_customer_billing_zone_id
where where
@ -231,20 +236,23 @@ sub get_invoice_data_raw{
and cdr.start_time <= ? and cdr.start_time <= ?
order by cdr.start_time order by cdr.start_time
-- limit 25' -- limit 25'
, { Slice => {} } , { Slice => {} }
, $client_contract->{id},$stime->epoch,$etime->epoch , $client_contract->{id},$stime->epoch,$etime->epoch
); );
my $invoice_details_zones = $dbh->selectall_arrayref('select SUM(cdr.source_customer_cost) AS customercost, COUNT(*) AS number, SUM(cdr.duration) AS duration,sum(cdr.source_customer_free_time) as free_time, bzh.zone }
from accounting.cdr $invoice_details_zones = $dbh->selectall_arrayref('select SUM(cdr.source_customer_cost) AS customercost, COUNT(*) AS number, SUM(cdr.duration) AS duration,sum(cdr.source_customer_free_time) as free_time '
LEFT JOIN billing.billing_zones_history bzh ON bzh.bz_id = cdr.source_customer_billing_zone_id .(!$opt_local->{count_contract_balance}?', bzh.zone':'')
where .'
from accounting.cdr '
.(!$opt_local->{count_contract_balance}?'LEFT JOIN billing.billing_zones_history bzh ON bzh.bz_id = cdr.source_customer_billing_zone_id ':'')
.' where
cdr.source_user_id != "0" cdr.source_user_id != "0"
and cdr.call_status="ok" and cdr.call_status="ok"
and cdr.source_account_id=? and cdr.source_account_id=?
and cdr.start_time >= ? and cdr.start_time >= ?
and cdr.start_time <= ? and cdr.start_time <= ?'
group by bzh.zone .(!$opt_local->{count_contract_balance}?'group by bzh.zone
order by bzh.zone' order by bzh.zone':'')
, {Slice => {} } , {Slice => {} }
, $client_contract->{id},$stime->epoch,$etime->epoch , $client_contract->{id},$stime->epoch,$etime->epoch
); );
@ -254,11 +262,15 @@ sub get_invoice_data_raw{
#$invoice_details_calls = [map{[$i++,$_]} (@$invoice_details_calls) x 1]; #$invoice_details_calls = [map{[$i++,$_]} (@$invoice_details_calls) x 1];
#$i = 1; #$i = 1;
#$invoice_details_zones = [map{[$i++,$_]} (@$invoice_details_zones) x 1]; #$invoice_details_zones = [map{[$i++,$_]} (@$invoice_details_zones) x 1];
my $stash;
my $stash = { if($opt_local->{count_contract_balance}){
invoice_details_zones => $invoice_details_zones, $stash = $invoice_details_zones->[0];
invoice_details_calls => $invoice_details_calls, }else{
}; $stash = {
invoice_details_zones => $invoice_details_zones,
invoice_details_calls => $invoice_details_calls,
};
}
return $stash; return $stash;
} }
sub generate_invoice_data{ sub generate_invoice_data{
@ -277,11 +289,12 @@ sub generate_invoice_data{
} }
my ($contract_balance,$invoice)=({},{}); my ($contract_balance,$invoice)=({},{});
($contract_balance,$invoice) = get_contract_balance($client_contract,$billing_profile,$contract_balance,$invoice,$stime,$etime); my($contract_balance_data) = get_invoice_data_raw($client_contract, $stime, $etime,{count_contract_balance => 1});
($contract_balance,$invoice) = get_contract_balance($client_contract,$billing_profile,$contract_balance,$contract_balance_data,$invoice,$stime,$etime);
#$logger->debug( Dumper $contract_balance ); #$logger->debug( Dumper $contract_balance );
NGCP::Panel::Utils::Invoice::prepare_contact_data($client_contact); NGCP::Panel::Utils::Invoice::prepare_contact_data($client_contact);
NGCP::Panel::Utils::Invoice::prepare_contact_data($provider_contact); NGCP::Panel::Utils::Invoice::prepare_contact_data($provider_contact);
# TODO: if not a full month, calculate fraction? #TODO: if not a full month, calculate fraction?
#TODO: to utils::contract and share with catalyst version #TODO: to utils::contract and share with catalyst version
my $invoice_amounts = NGCP::Panel::Utils::Invoice::get_invoice_amounts( my $invoice_amounts = NGCP::Panel::Utils::Invoice::get_invoice_amounts(
customer_contract => $client_contract, customer_contract => $client_contract,
@ -323,13 +336,15 @@ sub generate_invoice_data{
} }
sub get_contract_balance{ sub get_contract_balance{
my($client_contract,$billing_profile,$contract_balance,$invoice,$stime,$etime) = @_; my($client_contract,$billing_profile,$contract_balance,$contract_balance_data,$invoice,$stime,$etime) = @_;
if(!($contract_balance = $dbh->selectrow_hashref('select * from contract_balances where contract_id=? and date(start)=? and date(end)=?',undef,$client_contract->{id},$stime->ymd,$etime->ymd))){ if(!($contract_balance = $dbh->selectrow_hashref('select * from contract_balances where contract_id=? and date(start)=? and date(end)=?',undef,$client_contract->{id},$stime->ymd,$etime->ymd))){
@$contract_balance{qw/cash_balance cash_balance_interval free_time_balance free_time_balance_interval/} = NGCP::Panel::Utils::Contract::get_contract_balance_values( @$contract_balance{qw/cash_balance cash_balance_interval free_time_balance free_time_balance_interval/} = NGCP::Panel::Utils::Contract::get_contract_balance_values(
%$billing_profile, %$billing_profile,
stime => $stime, stime => $stime,
etime => $etime, etime => $etime,
); );
$contract_balance->{cash_balance_interval} ||= $contract_balance_data->{customercost};
$contract_balance->{free_time_balance_interval} ||= $contract_balance_data->{free_time};
$dbh->do('insert into contract_balances(contract_id,cash_balance,cash_balance_interval,free_time_balance,free_time_balance_interval,start,end,invoice_id)values(?,?,?,?,?,?,?,?)',undef,$client_contract->{id},@$contract_balance{qw/cash_balance cash_balance_interval free_time_balance free_time_balance_interval/},$stime->datetime, $etime->datetime,undef ); $dbh->do('insert into contract_balances(contract_id,cash_balance,cash_balance_interval,free_time_balance,free_time_balance_interval,start,end,invoice_id)values(?,?,?,?,?,?,?,?)',undef,$client_contract->{id},@$contract_balance{qw/cash_balance cash_balance_interval free_time_balance free_time_balance_interval/},$stime->datetime, $etime->datetime,undef );
$invoice = get_invoice(undef, $client_contract->{id},$stime, $etime); $invoice = get_invoice(undef, $client_contract->{id},$stime, $etime);
#my $contract_balance_id = $dbh->last_insert_id(undef,'billing','contract_balances','id'); #my $contract_balance_id = $dbh->last_insert_id(undef,'billing','contract_balances','id');
@ -338,6 +353,40 @@ sub get_contract_balance{
$contract_balance = $dbh->selectrow_hashref('select * from contract_balances where contract_id=? and date(start)=? and date(end)=?',undef,$client_contract->{id},$stime->ymd,$etime->ymd); $contract_balance = $dbh->selectrow_hashref('select * from contract_balances where contract_id=? and date(start)=? and date(end)=?',undef,$client_contract->{id},$stime->ymd,$etime->ymd);
#$logger->debug( Dumper $contract_balance ); #$logger->debug( Dumper $contract_balance );
}else{ }else{
if($opt->{update_contract_balance} && $contract_balance_data){
my @sql_update = ();
my @sql_update_params = ();
$contract_balance->{cash_balance_interval} //= 0;
$contract_balance_data->{customercost} //= 0;
# print Dumper $contract_balance_data;
if(($contract_balance->{cash_balance_interval} != $contract_balance_data->{customercost})
&& ($opt->{update_contract_balance_nonzero}
||
( $contract_balance_data->{customercost} > 0
&& !$contract_balance->{cash_balance_interval}
)
)
){
push @sql_update,'cash_balance_interval=?';
push @sql_update_params,$contract_balance_data->{customercost};
}
$contract_balance->{free_time_balance_interval} //= 0;
$contract_balance_data->{free_time} //= 0;
if($contract_balance->{free_time_balance_interval} != $contract_balance_data->{free_time}
&& ($opt->{update_contract_balance_nonzero}
||
( $contract_balance_data->{free_time} > 0
&& !$contract_balance->{free_time_balance_interval}
)
)
){
push @sql_update,'free_time_balance_interval=?';
push @sql_update_params,$contract_balance_data->{free_time};
}
if(my $sql_update = join(',',@sql_update)){
$dbh->do('update contract_balances set '.$sql_update.' where contract_id=? and date(start)=? and date(end)=?',undef,@sql_update_params,$client_contract->{id},$stime->ymd,$etime->ymd);
}
}
$invoice = get_invoice($contract_balance->{invoice_id},$client_contract->{id},$stime, $etime); $invoice = get_invoice($contract_balance->{invoice_id},$client_contract->{id},$stime, $etime);
} }
return ($contract_balance,$invoice); return ($contract_balance,$invoice);
@ -386,6 +435,7 @@ sub get_invoice_template{
if(!$svg){ if(!$svg){
$logger->debug( "No saved template for customer - no invoice;\n"); $logger->debug( "No saved template for customer - no invoice;\n");
return ;
} }
utf8::decode($svg); utf8::decode($svg);
return \$svg; return \$svg;

Loading…
Cancel
Save