From 1991296383a1efc047685f0a2cb87e6ccb866bc0 Mon Sep 17 00:00:00 2001 From: Gerhard Jungwirth Date: Mon, 23 Sep 2013 17:24:31 +0200 Subject: [PATCH] Filter Contract Contacts by whether they have a reseller_id in case the product in billing_mappings is one of (SIP_PEERING, PSTN_PEERING, VOIP_RESELLER) --- lib/NGCP/Panel/Controller/Contact.pm | 19 ++++++++++++++ lib/NGCP/Panel/Controller/Contract.pm | 26 ++++++++++++++++--- lib/NGCP/Panel/Controller/Reseller.pm | 4 ++- .../Panel/Form/Contract/PeeringReseller.pm | 19 ++++++++++++++ lib/NGCP/Panel/Utils/Message.pm | 6 +++++ 5 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 lib/NGCP/Panel/Form/Contract/PeeringReseller.pm diff --git a/lib/NGCP/Panel/Controller/Contact.pm b/lib/NGCP/Panel/Controller/Contact.pm index d45eebe427..c6401804be 100644 --- a/lib/NGCP/Panel/Controller/Contact.pm +++ b/lib/NGCP/Panel/Controller/Contact.pm @@ -210,6 +210,25 @@ sub ajax :Chained('list_contact') :PathPart('ajax') :Args(0) { $c->detach( $c->view("JSON") ); } +sub ajax_noreseller :Chained('list_contact') :PathPart('ajax_noreseller') :Args(0) { + my ($self, $c) = @_; + + NGCP::Panel::Utils::Datatables::process( + $c, + $c->stash->{contacts}->search_rs({ + reseller_id => undef, + }, {prefetch=>"contracts"}), + $c->stash->{contact_dt_columns}, + sub { + my ($result) = @_; + my %data = (deletable => ($result->contracts->all) ? 0 : 1); + return %data + }, + ); + + $c->detach( $c->view("JSON") ); +} + __PACKAGE__->meta->make_immutable; 1; diff --git a/lib/NGCP/Panel/Controller/Contract.pm b/lib/NGCP/Panel/Controller/Contract.pm index d6d1a623dd..c9632782a8 100644 --- a/lib/NGCP/Panel/Controller/Contract.pm +++ b/lib/NGCP/Panel/Controller/Contract.pm @@ -3,6 +3,7 @@ use Sipwise::Base; BEGIN { extends 'Catalyst::Controller'; } use NGCP::Panel::Form::Contract::Basic; +use NGCP::Panel::Form::Contract::PeeringReseller; use NGCP::Panel::Form::Contract::ProductSelect; use NGCP::Panel::Utils::Message; use NGCP::Panel::Utils::Navigation; @@ -167,7 +168,16 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) { $params->{status} = $contract->status; } $params = $params->merge($c->session->{created_objects}); - my $form = NGCP::Panel::Form::Contract::Basic->new; + my ($form, $is_peering_reseller); + if (defined $billing_mapping->product && + grep {$billing_mapping->product->handle eq $_} + ("SIP_PEERING", "PSTN_PEERING", "VOIP_RESELLER") ) { + $form = NGCP::Panel::Form::Contract::PeeringReseller->new; + $is_peering_reseller = 1; + } else { + $form = NGCP::Panel::Form::Contract::Basic->new; + $is_peering_reseller = 0; + } $form->process( posted => $posted, params => $c->req->params, @@ -175,7 +185,10 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) { ); NGCP::Panel::Utils::Navigation::check_form_buttons( c => $c, form => $form, - fields => {'contact.create' => $c->uri_for('/contact/create'), + fields => { + 'contact.create' => ( $is_peering_reseller + ? $c->uri_for('/contact/create/noreseller') + : $c->uri_for('/contact/create')), 'billing_profile.create' => $c->uri_for('/billing/create')}, back_uri => $c->req->uri, ); @@ -197,6 +210,11 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) { $form->{modify_timestamp} = NGCP::Panel::Utils::DateTime::current_local; $contract->update($form->values); + if ($is_peering_reseller && + defined $contract->contact->reseller_id) { + die( ["Cannot use this contact for peering or reseller contracts.", "showdetails"] ); + } + # if status changed, populate it down the chain if($contract->status ne $old_status) { NGCP::Panel::Utils::Contract::recursively_lock_contract( @@ -294,7 +312,7 @@ sub peering_create :Chained('peering_list') :PathPart('create') :Args(0) { my $posted = ($c->request->method eq 'POST'); my $params = {}; $params = $params->merge($c->session->{created_objects}); - my $form = NGCP::Panel::Form::Contract::Basic->new; + my $form = NGCP::Panel::Form::Contract::PeeringReseller->new; $form->process( posted => $posted, params => $c->request->params, @@ -505,7 +523,7 @@ sub reseller_create :Chained('reseller_list') :PathPart('create') :Args(0) { my $posted = ($c->request->method eq 'POST'); my $params = {}; $params = $params->merge($c->session->{created_objects}); - my $form = NGCP::Panel::Form::Contract::Basic->new; + my $form = NGCP::Panel::Form::Contract::PeeringReseller->new; $form->process( posted => $posted, params => $c->request->params, diff --git a/lib/NGCP/Panel/Controller/Reseller.pm b/lib/NGCP/Panel/Controller/Reseller.pm index 7c130381a1..7c9e37633b 100644 --- a/lib/NGCP/Panel/Controller/Reseller.pm +++ b/lib/NGCP/Panel/Controller/Reseller.pm @@ -208,7 +208,9 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) { item => $params, ); NGCP::Panel::Utils::Navigation::check_form_buttons( - c => $c, form => $form, fields => [qw/contract.create/], + c => $c, + form => $form, + fields => {'contract.create' => $c->uri_for('/contract/reseller/create') }, back_uri => $c->req->uri, ); diff --git a/lib/NGCP/Panel/Form/Contract/PeeringReseller.pm b/lib/NGCP/Panel/Form/Contract/PeeringReseller.pm new file mode 100644 index 0000000000..d1f8619995 --- /dev/null +++ b/lib/NGCP/Panel/Form/Contract/PeeringReseller.pm @@ -0,0 +1,19 @@ +package NGCP::Panel::Form::Contract::PeeringReseller; + +use HTML::FormHandler::Moose; +extends 'NGCP::Panel::Form::Contract::Basic'; + +has_field 'contact.id' => ( + type => '+NGCP::Panel::Field::DataTable', + label => 'Contact', + do_label => 0, + do_wrapper => 0, + required => 1, + template => 'helpers/datatables_field.tt', + ajax_src => '/contact/ajax_noreseller', + table_titles => ['#', 'First Name', 'Last Name', 'Email'], + table_fields => ['id', 'firstname', 'lastname', 'email'], +); + +1; +# vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Utils/Message.pm b/lib/NGCP/Panel/Utils/Message.pm index 20c3198eb5..250a5fda6b 100644 --- a/lib/NGCP/Panel/Utils/Message.pm +++ b/lib/NGCP/Panel/Utils/Message.pm @@ -24,6 +24,12 @@ method error ($self: Catalyst :$c, Str :$desc, Str :$log?, :$error?) { return; } + if ( ref($error) eq "ARRAY" && @$error >= 2 && $error->[1] eq "showdetails" ) { + $c->log->error("$desc (@$error[0])"); + $c->flash(messages => [{type => 'error', text => "$desc (@$error[0])"}]); + return; + } + unless ( $error->isa('DBIx::Class::Exception') ) { $c->log->error("$desc ($error)"); $c->flash(messages => [{type => 'error', text => $desc}]);