From d22ade4c4edc326a5cd9dfb02ac83fca533bfdc2 Mon Sep 17 00:00:00 2001 From: Irina Peshinskaya Date: Thu, 8 May 2014 16:57:01 +0300 Subject: [PATCH] MT#5879 Generation from web: not tested yet. --- lib/NGCP/Panel/Controller/Invoice.pm | 53 +++++++++++++++++-- lib/NGCP/Panel/Model/DB/InvoiceTemplate.pm | 60 ++++++++++++++++++++-- lib/NGCP/Panel/Utils/Contract.pm | 4 +- 3 files changed, 107 insertions(+), 10 deletions(-) diff --git a/lib/NGCP/Panel/Controller/Invoice.pm b/lib/NGCP/Panel/Controller/Invoice.pm index 380ebb464f..7f3fbd9e65 100644 --- a/lib/NGCP/Panel/Controller/Invoice.pm +++ b/lib/NGCP/Panel/Controller/Invoice.pm @@ -153,7 +153,7 @@ sub invoice_details_calls :Chained('invoice_details_zones') :PathPart('') :Captu $c->stash( invoice_details_calls_ajax => $invoice_details_calls_ajax ); } -sub invoice_list :Chained('invoice_details_calls') :PathPart('list') :Args(0) { +sub invoice_list :Chained('base') :PathPart('list') :Args(0) { my ($self, $c) = @_; my $backend = NGCP::Panel::Model::DB::InvoiceTemplate->new( schema => $c->model('DB') ); $c->log->debug('invoice_list'); @@ -219,6 +219,7 @@ sub invoice_generate :Chained('base') :PathPart('generate') :Args(0) { #from parameters $in = $c->request->parameters; + my $parser = DateTime::Format::Strptime->new( #pattern => '%Y-%m-%d %H:%M', pattern => '%Y-%m-%d', @@ -265,8 +266,10 @@ sub invoice_generate :Chained('base') :PathPart('generate') :Args(0) { if($posted){ if($validator->validated) { #copy/pasted from NGCP\Panel\Role\API\Customers.pm - my $client_contract = $backend->getInvoiceClientContractInfo($in); - my $client_contact = $client_contract->contact; + my $client_contract = $backend->getContractInfo('contract_id' => $in->{client_contract_id}); + my $client_contact = $backend->getContactInfo('contact_id' => $client_contract->contact_id); + my $provider_contract = $backend->getContractInfo('contract_id' => $c->stash->{provider}->contract_id); + my $provider_contact = $backend->getContactInfo('contact_id' => $provider_contract->id); my $contract_balance = $backend->getContractBalance($in); #$c->log->debug("customer->id="..";"); if(!$contract_balance){ @@ -275,11 +278,51 @@ sub invoice_generate :Chained('base') :PathPart('generate') :Args(0) { c => $c, profile => $billing_profile, contract => $client_contract, + stime => $in->{stime}, + etime => $in->{etime}, ); $contract_balance = $backend->getContractBalance($in); } - - + my $invoice; + if($contract_balance->invoice_id){ + $invoice = $backend->getInvoice('invoice_id' => $contract_balance->invoice_id); + }else{ + $invoice = $backend->createInvoice( + 'contract_balance' => $contract_balance, + stime => $in->{stime}, + etime => $in->{etime}, + ); + } + $c->forward('invoice_details_calls'); + $c->forward('invoice_details_zones'); + #additions for generations + $in = { + %$in, + no_fake_data => 1, + tt_type => 'svg', + tt_sourcestate => 'saved', + tt_id => $c->stash->{provider}->id, + }; + $out = { + %$out, + tt_id => $c->stash->{provider}->id, + }; + my $stash = { + provider => $provider_contact, + client => $client_contact, + invoice => $invoice, + invoice_details_zones => $c->stash->{invoice_details_zones}, + invoice_details_calls => $c->stash->{invoice_details_calls}, + }; + my $svg = ''; + $backend->getInvoiceTemplate( %$in, result => \$svg );#provider_id in i is enough + if(!$svg){ + NGCP::Panel::Utils::InvoiceTemplate::getDefaultInvoiceTemplate( c => $c, type => 'svg', result => \$svg ); + NGCP::Panel::Utils::InvoiceTemplate::preprocessInvoiceTemplateSvg( {no_fake_data => 1}, \$svg); + } + $svg = $c->view('SVG')->getTemplateProcessed($c,\$svg, $stash ); + NGCP::Panel::Utils::InvoiceTemplate::convertSvg2Pdf($c,\$svg,$in,$out); + $backend->storeInvoiceData($invoice,\$out->{tt_string_pdf}); try { #$backend->storeInvoiceTemplateInfo(%$in_validated); $c->flash(messages => [{type => 'success', text => $c->loc( diff --git a/lib/NGCP/Panel/Model/DB/InvoiceTemplate.pm b/lib/NGCP/Panel/Model/DB/InvoiceTemplate.pm index c86168b91f..9781dd6dcb 100644 --- a/lib/NGCP/Panel/Model/DB/InvoiceTemplate.pm +++ b/lib/NGCP/Panel/Model/DB/InvoiceTemplate.pm @@ -219,12 +219,20 @@ sub checkInvoiceTemplateProvider{ return 0; } -sub getInvoiceClientContractInfo{ +sub getContractInfo{ my $self = shift; my (%params) = @_; - my ($client_contract_id) = @params{qw/client_contract_id/}; + my ($contract_id) = @params{qw/contract_id/}; return $self->schema->resultset('contracts')->search({ - id => $client_contract_id, + id => $contract_id, + }); +} +sub getContactInfo{ + my $self = shift; + my (%params) = @_; + my ($contact_id) = @params{qw/contact_id/}; + return $self->schema->resultset('contacts')->search({ + id => $contact_id, }); } sub getBillingProfile{ @@ -286,6 +294,7 @@ sub getContractBalance{ 'join' => [ 'contract' ], }); } + sub getProviderInvoiceList{ my $self = shift; my (%params) = @_; @@ -327,7 +336,52 @@ sub getProviderInvoiceListAjax{ #'alias' => 'me', }); } +sub createInvoice{ + my $self = shift; + my (%params) = @_; + my ($contract_balance,$data,$stime,$etime) = @params{qw/contract_balance data stime etime/}; + + # my($contract_id, $stime, $etime) = @_; + ##my $invoice_serial = $dbh->selectrow_array('select max(invoices.serial) from invoices inner join contract_balances on invoices.id=contract_balances.invoice_id where contract_balances.contract_id=?',undef,$contract_id ); + #my $invoice_serial = $dbh->selectrow_array('select max(invoices.serial) from invoices'); + #$invoice_serial += 1; + #$dbh->do('insert into invoices(year,month,serial)values(?,?,?)', undef, $stime->year, $stime->month,$invoice_serial ); + #my $invoice_id = $dbh->last_insert_id(undef,'billing','invoices','id'); + #$dbh->do('update contract_balances set invoice_id = ? where contract_id=? and start=? and end=?', undef, $invoice_id,$contract_id, $stime->datetime, $etime->datetime ); + #return $dbh->selectrow_hashref('select * from invoices where id=?',undef, $invoice_id); + + + + my $invoice_serial = $self->schema->resultset('invoices')->search(undef, { + 'select' => { 'max' => 'me.serial', '-as' => 'serial_max'}, + })->first->get_column('serial_max'); + $invoice_serial +=1; + my $invoice_record = $self->schema->resultset('invoices')->create({ + year => $stime->year, + month => $stime->month, + serial => $invoice_serial, + data => $data, + }); + if($invoice_record){ + $self->schema->resultset('contract_balances')->search({ + id => $contract_balance->id, + })->update({ + invoice_id => $invoice_record->id() + }); + } + return $invoice_record; +} +sub storeInvoiceData{ + my $self = shift; + my (%params) = @_; + my ($invoice,$data_ref) = @params{qw/invoice data/}; + $self->schema->resultset('invoices')->search({ + id => $invoice->id, + })->update({ + data => $invoice->data + }); +} sub getInvoice{ my $self = shift; my (%params) = @_; diff --git a/lib/NGCP/Panel/Utils/Contract.pm b/lib/NGCP/Panel/Utils/Contract.pm index 914f651e30..6dedd1fe14 100644 --- a/lib/NGCP/Panel/Utils/Contract.pm +++ b/lib/NGCP/Panel/Utils/Contract.pm @@ -16,8 +16,8 @@ sub create_contract_balance { # first, calculate start and end time of current billing profile # (we assume billing interval of 1 month) - my $stime = NGCP::Panel::Utils::DateTime::current_local->truncate(to => 'month'); - my $etime = $stime->clone->add(months => 1)->subtract(seconds => 1); + my $stime = $params{stime} || NGCP::Panel::Utils::DateTime::current_local->truncate(to => 'month'); + my $etime = $params{etime} || $stime->clone->add(months => 1)->subtract(seconds => 1); # calculate free_time/cash ratio my ($cash_balance, $cash_balance_interval,