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
use lib '/media/sf_/usr/share/VMHost/ngcp-panel/lib';
use lib '/root/VMHost/ngcp-panel/lib';
use strict;
use Getopt::Long;
@ -85,6 +85,8 @@ Getopt::Long::GetOptions($opt,
'resend',
'regenerate',
'allow_terminated',
'update_contract_balance',
'update_contract_balance_nonzero',
'help|?',
'man'
) or pod2usage(2);
@ -219,8 +221,11 @@ sub get_billing_profile{
);
}
sub get_invoice_data_raw{
my($client_contract, $stime, $etime) = @_;
my $invoice_details_calls = $dbh->selectall_arrayref('select cdr.*,from_unixtime(cdr.start_time) as start_time,bzh.zone, bzh.detail as zone_detail
my($client_contract, $stime, $etime, $opt_local) = @_;
$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
LEFT JOIN billing.billing_zones_history bzh ON bzh.bz_id = cdr.source_customer_billing_zone_id
where
@ -231,20 +236,23 @@ sub get_invoice_data_raw{
and cdr.start_time <= ?
order by cdr.start_time
-- limit 25'
, { Slice => {} }
, $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
LEFT JOIN billing.billing_zones_history bzh ON bzh.bz_id = cdr.source_customer_billing_zone_id
where
, { Slice => {} }
, $client_contract->{id},$stime->epoch,$etime->epoch
);
}
$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 '
.(!$opt_local->{count_contract_balance}?', bzh.zone':'')
.'
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"
and cdr.call_status="ok"
and cdr.source_account_id=?
and cdr.start_time >= ?
and cdr.start_time <= ?
group by bzh.zone
order by bzh.zone'
and cdr.start_time <= ?'
.(!$opt_local->{count_contract_balance}?'group by bzh.zone
order by bzh.zone':'')
, {Slice => {} }
, $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];
#$i = 1;
#$invoice_details_zones = [map{[$i++,$_]} (@$invoice_details_zones) x 1];
my $stash = {
invoice_details_zones => $invoice_details_zones,
invoice_details_calls => $invoice_details_calls,
};
my $stash;
if($opt_local->{count_contract_balance}){
$stash = $invoice_details_zones->[0];
}else{
$stash = {
invoice_details_zones => $invoice_details_zones,
invoice_details_calls => $invoice_details_calls,
};
}
return $stash;
}
sub generate_invoice_data{
@ -277,11 +289,12 @@ sub generate_invoice_data{
}
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 );
NGCP::Panel::Utils::Invoice::prepare_contact_data($client_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
my $invoice_amounts = NGCP::Panel::Utils::Invoice::get_invoice_amounts(
customer_contract => $client_contract,
@ -323,13 +336,15 @@ sub generate_invoice_data{
}
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))){
@$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,
stime => $stime,
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 );
$invoice = get_invoice(undef, $client_contract->{id},$stime, $etime);
#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);
#$logger->debug( Dumper $contract_balance );
}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);
}
return ($contract_balance,$invoice);
@ -386,6 +435,7 @@ sub get_invoice_template{
if(!$svg){
$logger->debug( "No saved template for customer - no invoice;\n");
return ;
}
utf8::decode($svg);
return \$svg;

Loading…
Cancel
Save