Implement first version of reseller handling.

3.6+reseller
Andreas Granig 13 years ago
parent 5288feb764
commit 8be91b1c3a

6
debian/changelog vendored

@ -1,3 +1,9 @@
ngcp-www-admin (3.6.3+reseller1) unstable; urgency=low
[ agranig ]
* implement reseller handling.
-- Andreas Granig <agranig@sipwise.com> Fri, 24 May 2013 22:27:11 +0200
ngcp-www-admin (3.6.3) unstable; urgency=low
[ agranig ]

@ -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:

@ -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) {

@ -5,11 +5,13 @@
<h3><a href="#">Information</a></h3>
<ul>
<li [% 'class="active_menu"' IF menu.active == "root" %]><a href="/">Home</a></li>
[% IF Catalyst.config.dashboard.enabled %]
<li [% 'class="active_menu"' IF menu.active == "dashboard" %]><a href="/dashboard">Statistics</a></li>
[% END %]
[% IF Catalyst.config.voisniff_features %]
<li [% 'class="active_menu"' IF menu.active == "sipanalysis" %]><a href="/sipanalysis">SIP Traffic Analysis</a></li>
[% IF !Catalyst.session.admin.is_reseller %]
[% IF Catalyst.config.dashboard.enabled %]
<li [% 'class="active_menu"' IF menu.active == "dashboard" %]><a href="/dashboard">Statistics</a></li>
[% END %]
[% IF Catalyst.config.voisniff_features %]
<li [% 'class="active_menu"' IF menu.active == "sipanalysis" %]><a href="/sipanalysis">SIP Traffic Analysis</a></li>
[% END %]
[% END %]
</ul>
</div>
@ -35,15 +37,19 @@
[% IF Catalyst.config.billing_features %]
<li [% 'class="active_menu"' IF menu.active == "billing" %]><a href="/billing">Billing</a></li>
[% END %]
[% IF Catalyst.config.peering_features %]
<li [% 'class="active_menu"' IF menu.active == "peering" %]><a href="/peering">SIP Peerings</a></li>
[% IF !Catalyst.session.admin.is_reseller %]
[% IF Catalyst.config.peering_features %]
<li [% 'class="active_menu"' IF menu.active == "peering" %]><a href="/peering">SIP Peerings</a></li>
[% END %]
<li [% 'class="active_menu"' IF menu.active == "rewrite" %]><a href="/rewrite">Rewrite Rule Sets</a></li>
<li [% 'class="active_menu"' IF menu.active == "sound" %]><a href="/sound">Sound Sets</a></li>
<li [% 'class="active_menu"' IF menu.active == "bans" %]><a href="/bans/users">Security Bans</a></li>
[% END %]
<li [% 'class="active_menu"' IF menu.active == "rewrite" %]><a href="/rewrite">Rewrite Rule Sets</a></li>
<li [% 'class="active_menu"' IF menu.active == "sound" %]><a href="/sound">Sound Sets</a></li>
<li [% 'class="active_menu"' IF menu.active == "bans" %]><a href="/bans/users">Security Bans</a></li>
</ul>
</div>
[% IF !Catalyst.session.admin.is_reseller %]
<div>
<h3><a href="#">Number Management</a></h3>
<ul>
@ -56,6 +62,7 @@
<li [% 'class="active_menu"' IF menu.active == "ncos" %]><a href="/ncos">NCOS</a></li>
</ul>
</div>
[% END %]
[% ELSE %]
&nbsp;

@ -1,3 +1,81 @@
[% UNLESS Catalyst.session.admin.is_reseller %]
<h3 id="contract">Reseller Contracts</h3>
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/admin/contract_detail?edit_contract=1"><span class="button-add">Add</span></a>
[% END %]
<div class="hspace-20"></div>
[% IF contracts %]
<ul class="cleanlist">
<li class="ui-state-default">
<div class="span-2">Contract ID</div>
<div class="span-4">Billing Profile</div>
<div class="span-4">Contact</div>
<div class="span-4 last">Created</div>
</li>
[% FOREACH contract = contracts %]
<li class="ui-state-default">
<div class="span-2">[% contract.id %]</div>
<div class="span-4">[% contract.billing_profile_name%]</div>
<div class="span-4">[% contract.short_contact %]</div>
<div class="span-4 append-1">[% contract.create_timestamp %]</div>
<div class="span-1 last">
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/admin/contract_detail?edit_contract=1&amp;contract_id=[% contract.id %]"><span class="button-edit">Edit</span></a>
[% END %]
</div>
</li>
[% END %]
</ul>
[% ELSE %]
<div>
No reseller contracts created yet.
</div>
[% END %]
<div class="hspace-20"></div>
<h3 id="contract">Resellers</h3>
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/admin/reseller_detail?edit_reseller=1"><span class="button-add">Add</span></a>
[% END %]
<div class="hspace-20"></div>
[% IF resellers %]
<ul class="cleanlist">
<li class="ui-state-default">
<div class="span-2">Reseller ID</div>
<div class="span-2">Contract ID</div>
<div class="span-4">Name</div>
<div class="span-4">Status</div>
<div class="span-1 last"></div>
</li>
[% FOREACH reseller = resellers %]
<li class="ui-state-default">
<div class="span-2">[% reseller.id %]</div>
<div class="span-2">[% reseller.contract_id %]</div>
<div class="span-4">[% reseller.name %]</div>
<div class="span-4">[% reseller.status %]</div>
<div class="span-1 last">
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/admin/reseller_detail?edit_reseller=1&amp;reseller_id=[% reseller.id %]"><span class="button-edit">Edit</span></a>
[% END %]
</div>
</li>
[% END %]
</ul>
[% ELSE %]
<div>
No resellers created yet.
</div>
[% END %]
[% END %]
<div class="hspace-20"></div>
<h3>Administrator Accounts</h3>
[% IF ! Catalyst.session.admin.read_only && (Catalyst.session.admin.is_master || Catalyst.session.admin.is_superuser) %]

@ -0,0 +1,76 @@
[% IF contract.id %]
<h3>Reseller Contract [% contract.id %]</h3>
[% ELSE %]
<h3>New Reseller Contract</h3>
[% END %]
[% UNLESS contract.terminate_timestamp || Catalyst.session.admin.read_only %]
<div class="inlinecontainer">
<a href="/admin"><span class="button-back">Back</span></a>
[% IF edit_contract %]
[% IF contract.id %]
<a href="terminate_contract?contract_id=[% contract.id %]"><span class="button-terminate">Terminate</span></a>
<a href="delete_contract?contract_id=[% contract.id %]"><span class="button-delete">Delete</span></a>
[% END %]
[% END %]
</div>
[% END %]
[% IF messages.conmsg %]<div class="success">[% messages.conmsg %]</div>[% END %]
[% IF messages.conerr %]<div class="error">[% messages.conerr %]</div>[% END %]
<div class="hspace-20"></div>
<form action="save_contract" method="post">
<input type="hidden" name="contract_id" value="[% contract.id %]" />
<ul class="cleanlist">
[% IF contract.id %]
<li class="ui-state-default"><div class="span-5">Contract ID:</div><div class="span-10 last">[% contract.id %]</div></li>
[% END %]
[% IF billing_features %]
<li class="ui-state-default">
<div class="span-5">Billing Profile:</div>
<div class="span-10 last">
[% IF edit_contract %]
<select size="1" name="billing_profile">
[% FOREACH profile = billing_profiles %]
<option value="[% profile.handle %]"
[% IF profile.handle == contract.billing_profile %]
selected="selected"
[% END %]>[% profile.data.name %]</option>
[% END %]
</select>
[% ELSE %]
[% contract.billing_profile_name %]
[% END %]
</div>
</li>
[% END %]
<li class="ui-state-default"><div class="span-14 last">Peering contact person or company:</div></li>
[% FOREACH contact_form_field = contact_form_fields %]
<li class="ui-state-default">
<div class="prepend-1 span-4">[% contact_form_field.label %]:</div>
<div class="span-10 last">
[% IF edit_contract %]
<input type="text" name="[% contact_form_field.field %]" value="[% contact_form_field.value %]" />
[% ELSE %]
[% contact_form_field.value %]
[% END %]
</div>
</li>
[% END %]
[% IF contract.id %]
<li class="ui-state-default"><div class="span-5">Created:</div><div class="span-10 last">[% contract.create_timestamp %]</div></li>
<li class="ui-state-default"><div class="span-5">Modified:</div><div class="span-10 last">[% contract.modify_timestamp %]</div></li>
[% IF contract.terminate_timestamp %]
<li class="ui-state-default"><div class="span-5">Terminated:</div><div class="span-10 last"><div class="alert">[% contract.terminate_timestamp %]</div></div></li>
[% END %]
[% END %]
</ul>
[% IF edit_contract %]
<div class="hspace-20"></div>
<button name="submit" class="button-save">Save</button>
[% END %]
</form>

@ -36,6 +36,20 @@
[% IF messages.epass2 %]
<li class="error">[% messages.epass2 %]</li>
[% END %]
[% IF !Catalyst.session.admin.is_reseller %]
<li class="ui-state-default">
<div class="span-3">Reseller:</div>
<div class="span-10 last">
<select size="1" name="reseller_id" [% IF edit_admin == Catalyst.session.admin.login %]disabled="disabled"[% END %]>
[% FOREACH reseller = resellers %]
<option value="[% reseller.id %]"
[% IF admin.reseller_id == reseller.id %]selected="selected"[% END %]
>#[% reseller.id %] - [% reseller.name %]</option>
[% END %]
</select>
</div>
</li>
[% END %]
<li class="ui-state-default">
<div class="span-3">Master:</div>
<div class="span-10 last">

@ -0,0 +1,55 @@
[% IF reseller.id %]
<h3>Reseller [% reseller.id %]</h3>
[% ELSE %]
<h3>New Reseller</h3>
[% END %]
<div class="inlinecontainer">
<a href="/admin"><span class="button-back">Back</span></a>
</div>
[% IF messages.conmsg %]<div class="success">[% messages.conmsg %]</div>[% END %]
[% IF messages.conerr %]<div class="error">[% messages.conerr %]</div>[% END %]
<div class="hspace-20"></div>
<form action="save_reseller" method="post">
<input type="hidden" name="reseller_id" value="[% reseller.id %]" />
<ul class="cleanlist">
[% IF reseller.id %]
<li class="ui-state-default"><div class="span-5">Reseller ID:</div><div class="span-10 last">[% reseller.id %]</div></li>
[% END %]
<li class="ui-state-default">
<div class="span-5">Contract ID:</div>
<div class="span-10 last">
[% IF edit_reseller %]
<select size="1" name="contract_id">
[% FOREACH contract = contracts %]
<option value="[% contract.id %]"
[% IF contract.id == reseller.contract_id %]
selected="selected"
[% END %]>[% contract.id %]</option>
[% END %]
</select>
[% ELSE %]
[% reseller.contract_id %]
[% END %]
</div>
</li>
<li class="ui-state-default">
<div class="span-5">Name:</div>
<div class="span-10 last">
[% IF edit_reseller %]
<input type="text" name="name" value="[% reseller.name %]" />
[% ELSE %]
[% reseller.name %]
[% END %]
</div>
</li>
</ul>
[% IF edit_reseller %]
<div class="hspace-20"></div>
<button name="submit" class="button-save">Save</button>
[% END %]
</form>
Loading…
Cancel
Save