diff --git a/debian/changelog b/debian/changelog index a13b209..95074df 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +ngcp-www-admin (3.6.3+reseller1) unstable; urgency=low + [ agranig ] + * implement reseller handling. + + -- Andreas Granig Fri, 24 May 2013 22:27:11 +0200 + ngcp-www-admin (3.6.3) unstable; urgency=low [ agranig ] diff --git a/lib/admin/Controller/admin.pm b/lib/admin/Controller/admin.pm index 87bfd0e..f33f8cd 100644 --- a/lib/admin/Controller/admin.pm +++ b/lib/admin/Controller/admin.pm @@ -31,6 +31,8 @@ sub index : Private { \$admins ); $c->stash->{admins} = $admins if eval { @$admins }; + + } else { # only own settings my $admin; return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_admin', @@ -39,6 +41,10 @@ sub index : Private { ); $c->stash->{admins} = [ $admin ]; } + unless($c->session->{admin}{is_reseller}) { + $self->load_reseller_contracts($c); + $self->load_resellers($c); + } $c->stash->{edit_admin} = $c->request->params->{edit_admin}; @@ -69,11 +75,12 @@ sub edit_admin : Local { my $edit_admin = $c->request->params->{edit_admin}; $c->stash->{edit_admin} = $edit_admin if defined $edit_admin; + unless($c->session->{admin}{is_reseller}) { + $self->load_reseller_contracts($c); + $self->load_resellers($c); + } - if(ref $c->session->{restore_admin_input} eq 'HASH') { - $c->stash->{admin} = $c->session->{restore_admin_input}; - delete $c->session->{restore_admin_input}; - } elsif(defined $edit_admin) { + if(defined $edit_admin) { return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_admin', { login => $edit_admin }, \$c->stash->{admin} @@ -124,6 +131,7 @@ sub do_edit_admin : Local { unless defined $edit_admin; } + $settings{reseller_id} = $c->request->params->{reseller_id} || undef; $settings{is_master} = $c->request->params->{is_master} ? 1 : 0 unless $edit_admin eq $c->session->{admin}{login}; $settings{is_active} = $c->request->params->{is_active} ? 1 : 0 @@ -169,7 +177,6 @@ sub do_edit_admin : Local { $c->session->{messages} = \%messages; $settings{admin} = $admin if defined $admin; - $c->session->{restore_admin_input} = \%settings; $c->response->redirect(defined $edit_admin ? "/admin/edit_admin?edit_admin=$edit_admin" : "/admin/edit_admin"); return; } @@ -198,6 +205,316 @@ sub do_delete_admin : Local { return; } +=head2 detail + +Show reseller contract details. + +=cut + +sub contract_detail : Local { + my ( $self, $c ) = @_; + $c->stash->{template} = 'tt/admin_contract_detail.tt'; + + my $contract; + my $contract_id = $c->request->params->{contract_id} || undef; + if(defined $contract_id) { + return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_reseller_contract_by_id', + { id => $contract_id }, + \$contract + ); + } + if(ref $c->session->{restore_contract_input} eq 'HASH') { + if($c->config->{billing_features}) { + $contract->{billing_profile} = $c->session->{restore_contract_input}{billing_profile}; + } + $contract->{contact} = $c->session->{restore_contract_input}{contact}; + delete $c->session->{restore_contract_input}; + } + + # we only use this to fill the drop-down lists + if($c->request->params->{edit_contract}) { + my $billing_profiles; + return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_billing_profiles', + undef, + \$billing_profiles + ); + $c->stash->{billing_profiles} = [ sort { $$a{data}{name} cmp $$b{data}{name} } + @$billing_profiles ]; + } else { + if(defined $contract->{billing_profile}) { + my $profile; + return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_billing_profile', + { handle => $contract->{billing_profile} }, + \$profile + ); + $contract->{billing_profile_name} = $$profile{data}{name}; + } + } + + $c->stash->{contract} = $contract; + $c->stash->{contact_form_fields} = admin::Utils::get_contract_contact_form_fields($c,$contract->{contact}); + if($c->config->{billing_features}) { + $c->stash->{billing_features} = 1; + } + $c->stash->{edit_contract} = $c->request->params->{edit_contract}; + + return 1; +} + +=head2 save_contract + +Create or update details of a SIP peering contract. + +=cut + +sub save_contract : Local { + my ( $self, $c ) = @_; + + my %messages; + my %settings; + + my $contract_id = $c->request->params->{contract_id} || undef; + + my $billing_profile = $c->request->params->{billing_profile}; + $settings{billing_profile} = $billing_profile if defined $billing_profile; + + my %contact; + my $contract_contact_form_fields = admin::Utils::get_contract_contact_form_fields($c,undef); + if (ref $contract_contact_form_fields eq 'ARRAY') { + foreach my $form_field (@$contract_contact_form_fields) { + if (defined $c->request->params->{$form_field->{field}} and length($c->request->params->{$form_field->{field}})) { + $contact{$form_field->{field}} = $c->request->params->{$form_field->{field}}; + } else { + $contact{$form_field->{field}} = undef; + } + } + } + $settings{contact} = \%contact; + + if(keys %settings or (!$c->config->{billing_features} and !defined $contract_id)) { + if(defined $contract_id) { + if($c->model('Provisioning')->call_prov( $c, 'billing', 'update_reseller_contract', + { id => $contract_id, + data => \%settings, + }, + undef)) + { + $messages{topmsg} = 'Web.Contract.Updated'; + $c->session->{messages} = \%messages; + $c->response->redirect("/admin"); + return; + } + } else { + if($c->model('Provisioning')->call_prov( $c, 'billing', 'create_reseller_contract', + { data => \%settings }, + \$contract_id)) + { + $messages{topmsg} = 'Web.Contract.Created'; + $c->session->{messages} = \%messages; + $c->response->redirect("/admin"); + return; + } + } + } + + $c->session->{messages} = \%messages; + $c->session->{restore_contract_input} = \%settings; + $c->response->redirect("/admin/contract_detail?edit_contract=1&contract_id=$contract_id"); + return; +} + +=head2 terminate + +Terminates a reseller contract. + +=cut + +sub terminate_contract : Local { + my ( $self, $c ) = @_; + + my %messages; + + my $contract_id = $c->request->params->{contract_id}; + + if($c->model('Provisioning')->call_prov( $c, 'billing', 'terminate_reseller_contract', + { id => $contract_id }, + undef)) + { + $messages{topmsg} = 'Web.Contract.Deleted'; + $c->session->{messages} = \%messages; + $c->response->redirect("/admin"); + return; + } + + $c->session->{messages} = \%messages; + $c->response->redirect("/admin/contract_detail?edit_contract=1&contract_id=$contract_id"); + return; +} + +=head2 delete + +Deletes a reseller contract. + +=cut + +sub delete_contract : Local { + my ( $self, $c ) = @_; + + my %messages; + + my $contract_id = $c->request->params->{contract_id}; + + if($c->model('Provisioning')->call_prov( $c, 'billing', 'delete_reseller_contract', + { id => $contract_id }, + undef)) + { + $messages{topmsg} = 'Web.Contract.Deleted'; + $c->session->{messages} = \%messages; + $c->response->redirect("/admin"); + return; + } + + $c->session->{messages} = \%messages; + $c->response->redirect("/admin/contract_detail?edit_contract=1&contract_id=$contract_id"); + return; +} + +sub reseller_detail : Local { + my ( $self, $c ) = @_; + $c->stash->{template} = 'tt/admin_reseller_detail.tt'; + + my $reseller; + my $reseller_id = $c->request->params->{reseller_id} || undef; + if(defined $reseller_id) { + return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_reseller_by_id', + { id => $reseller_id }, + \$reseller + ); + } + $c->stash->{reseller} = $reseller; + + # we only use this to fill the drop-down lists + $self->load_resellers($c); + $self->load_reseller_contracts($c); + my %used = (); my @all = (); + push @all, @{$c->stash->{contracts}}; + $c->stash->{contracts} = []; + my $i = 0; + foreach my $con(@all) { + foreach my $r(@{$c->stash->{resellers}}) { + if($r->{contract_id} == $con->{id}) { + if(defined $reseller_id && $reseller->{contract_id} == $con->{id}) { + } else { + $used{$i} = 1; + } + } + } + ++$i; + } + for(my $i = 0; $i < @all; ++$i) { + unless(exists $used{$i}) { + push @{$c->stash->{contracts}}, $all[$i] + } else { + } + } + $c->stash->{edit_reseller} = $c->request->params->{edit_reseller}; + + return 1; +} + +sub save_reseller : Local { + my ( $self, $c ) = @_; + + my %messages; + my %settings; + + my $reseller_id = $c->request->params->{reseller_id} || undef; + my $contract_id = $c->request->params->{contract_id}; + my $name = $c->request->params->{name}; + $settings{name} = $name if defined $name; + $settings{contract_id} = $contract_id if defined $contract_id; + + if(keys %settings or (!$c->config->{billing_features} and !defined $reseller_id)) { + if(defined $reseller_id) { + if($c->model('Provisioning')->call_prov( $c, 'billing', 'update_reseller', + { id => $reseller_id, + data => \%settings, + }, + undef)) + { + $messages{topmsg} = 'Web.Contract.Updated'; + $c->session->{messages} = \%messages; + $c->response->redirect("/admin"); + return; + } + } else { + if($c->model('Provisioning')->call_prov( $c, 'billing', 'create_reseller', + { data => \%settings }, + \$reseller_id)) + { + $messages{topmsg} = 'Web.Contract.Created'; + $c->session->{messages} = \%messages; + $c->response->redirect("/admin"); + return; + } + } + } + + $c->session->{messages} = \%messages; + $c->response->redirect("/admin/reseller_detail?edit_reseller=1&reseller_id=$reseller_id"); + return; +} + +sub load_reseller_contracts : Private { + my ( $self, $c ) = @_; + + my $reseller_contracts; + my $contracts; + return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_reseller_contracts', + 1, + \$reseller_contracts + ); + if (eval { @$reseller_contracts }) { + $contracts = []; + foreach my $reseller_contract (@$reseller_contracts) { + my %contract; # = {}; + $contract{id} = $reseller_contract->{id}; + if(defined $reseller_contract->{billing_profile} and length $reseller_contract->{billing_profile}) { + my $profile; + return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_billing_profile', + { handle => $reseller_contract->{billing_profile} }, + \$profile + ); + $contract{billing_profile_name} = $$profile{data}{name}; + } else { + $contract{billing_profile_name} = ''; + } + $contract{short_contact} = admin::Utils::short_contact($c,$reseller_contract->{contact}); + $contract{create_timestamp} = $reseller_contract->{create_timestamp}; + push @$contracts,\%contract; + } + $c->stash->{contracts} = $contracts; + } + return 1; +} + +sub load_resellers : Private { + my ( $self, $c ) = @_; + + my $resellers; + + return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_resellers', + undef, + \$resellers + ); + + $c->stash->{resellers} = $resellers; + + return 1; +} + + + =head1 BUGS AND LIMITATIONS =over @@ -224,3 +541,5 @@ software. # ende gelaende 1; + +# vim: set tabstop=4 expandtab: diff --git a/lib/admin/Controller/subscriber.pm b/lib/admin/Controller/subscriber.pm index 1f1d66f..64c7b50 100644 --- a/lib/admin/Controller/subscriber.pm +++ b/lib/admin/Controller/subscriber.pm @@ -245,7 +245,7 @@ sub update_subscriber : Local { $settings{external_id} = $c->request->params->{external_id}; } - $settings{admin} = 1 if $c->request->params->{admin}; + $settings{admin} = $c->request->params->{admin} ? 1 : 0; my $password = $c->request->params->{password}; if(length $password) { diff --git a/root/layout/menu b/root/layout/menu index 2e1abd8..a1b97de 100644 --- a/root/layout/menu +++ b/root/layout/menu @@ -5,11 +5,13 @@

Information

@@ -35,15 +37,19 @@ [% IF Catalyst.config.billing_features %]
  • Billing
  • [% END %] - [% IF Catalyst.config.peering_features %] -
  • SIP Peerings
  • + + [% IF !Catalyst.session.admin.is_reseller %] + [% IF Catalyst.config.peering_features %] +
  • SIP Peerings
  • + [% END %] +
  • Rewrite Rule Sets
  • +
  • Sound Sets
  • +
  • Security Bans
  • [% END %] -
  • Rewrite Rule Sets
  • -
  • Sound Sets
  • -
  • Security Bans
  • + [% IF !Catalyst.session.admin.is_reseller %]

    Number Management

    + [% END %] [% ELSE %]   diff --git a/root/tt/admin.tt b/root/tt/admin.tt index 38ec3d8..7781b49 100644 --- a/root/tt/admin.tt +++ b/root/tt/admin.tt @@ -1,3 +1,81 @@ + [% UNLESS Catalyst.session.admin.is_reseller %] +

    Reseller Contracts

    + + [% UNLESS Catalyst.session.admin.read_only %] + Add + [% END %] + +
    + [% IF contracts %] + + [% ELSE %] +
    + No reseller contracts created yet. +
    + [% END %] + + +
    +

    Resellers

    + + [% UNLESS Catalyst.session.admin.read_only %] + Add + [% END %] + +
    + [% IF resellers %] + + [% ELSE %] +
    + No resellers created yet. +
    + [% END %] + + + [% END %] + +

    Administrator Accounts

    [% IF ! Catalyst.session.admin.read_only && (Catalyst.session.admin.is_master || Catalyst.session.admin.is_superuser) %] diff --git a/root/tt/admin_contract_detail.tt b/root/tt/admin_contract_detail.tt new file mode 100755 index 0000000..f0fd7f9 --- /dev/null +++ b/root/tt/admin_contract_detail.tt @@ -0,0 +1,76 @@ + [% IF contract.id %] +

    Reseller Contract [% contract.id %]

    + [% ELSE %] +

    New Reseller Contract

    + [% END %] + + [% UNLESS contract.terminate_timestamp || Catalyst.session.admin.read_only %] +
    + Back + [% IF edit_contract %] + [% IF contract.id %] + Terminate + Delete + [% END %] + [% END %] +
    + [% END %] + + [% IF messages.conmsg %]
    [% messages.conmsg %]
    [% END %] + [% IF messages.conerr %]
    [% messages.conerr %]
    [% END %] + +
    +
    + + + [% IF edit_contract %] +
    + + [% END %] +
    diff --git a/root/tt/admin_edit.tt b/root/tt/admin_edit.tt index b96b566..e9b3235 100644 --- a/root/tt/admin_edit.tt +++ b/root/tt/admin_edit.tt @@ -36,6 +36,20 @@ [% IF messages.epass2 %]
  • [% messages.epass2 %]
  • [% END %] + [% IF !Catalyst.session.admin.is_reseller %] +
  • +
    Reseller:
    +
    + +
    +
  • + [% END %]
  • Master:
    diff --git a/root/tt/admin_reseller_detail.tt b/root/tt/admin_reseller_detail.tt new file mode 100755 index 0000000..bfa0183 --- /dev/null +++ b/root/tt/admin_reseller_detail.tt @@ -0,0 +1,55 @@ + [% IF reseller.id %] +

    Reseller [% reseller.id %]

    + [% ELSE %] +

    New Reseller

    + [% END %] + +
    + Back +
    + + [% IF messages.conmsg %]
    [% messages.conmsg %]
    [% END %] + [% IF messages.conerr %]
    [% messages.conerr %]
    [% END %] + +
    +
    + +
      + [% IF reseller.id %] +
    • Reseller ID:
      [% reseller.id %]
    • + [% END %] + +
    • +
      Contract ID:
      +
      + [% IF edit_reseller %] + + [% ELSE %] + [% reseller.contract_id %] + [% END %] +
      +
    • +
    • +
      Name:
      +
      + [% IF edit_reseller %] + + [% ELSE %] + [% reseller.name %] + [% END %] +
      +
    • + +
    + [% IF edit_reseller %] +
    + + [% END %] +