Added major merge code for merging organisations
This commit is contained in:
parent
a0cdaac370
commit
14410b475a
5 changed files with 219 additions and 0 deletions
|
@ -190,6 +190,9 @@ sub startup {
|
||||||
$admin_routes->post('/organisations/add')->to('admin-organisations#add_org_submit');
|
$admin_routes->post('/organisations/add')->to('admin-organisations#add_org_submit');
|
||||||
$admin_routes->get('/organisations/:id')->to('admin-organisations#valid_read');
|
$admin_routes->get('/organisations/:id')->to('admin-organisations#valid_read');
|
||||||
$admin_routes->post('/organisations/:id')->to('admin-organisations#valid_edit');
|
$admin_routes->post('/organisations/:id')->to('admin-organisations#valid_edit');
|
||||||
|
$admin_routes->get('/organisations/:id/merge')->to('admin-organisations#merge_list');
|
||||||
|
$admin_routes->get('/organisations/:id/merge/:target_id')->to('admin-organisations#merge_detail');
|
||||||
|
$admin_routes->post('/organisations/:id/merge/:target_id')->to('admin-organisations#merge_confirm');
|
||||||
|
|
||||||
$admin_routes->get('/feedback')->to('admin-feedback#index');
|
$admin_routes->get('/feedback')->to('admin-feedback#index');
|
||||||
$admin_routes->get('/feedback/:id')->to('admin-feedback#read');
|
$admin_routes->get('/feedback/:id')->to('admin-feedback#read');
|
||||||
|
|
|
@ -3,6 +3,11 @@ use Mojo::Base 'Mojolicious::Controller';
|
||||||
|
|
||||||
use Try::Tiny;
|
use Try::Tiny;
|
||||||
|
|
||||||
|
has result_set => sub {
|
||||||
|
my $c = shift;
|
||||||
|
return $c->schema->resultset('Organisation');
|
||||||
|
};
|
||||||
|
|
||||||
sub list {
|
sub list {
|
||||||
my $c = shift;
|
my $c = shift;
|
||||||
|
|
||||||
|
@ -127,4 +132,104 @@ sub valid_edit {
|
||||||
$c->redirect_to( '/admin/organisations/');
|
$c->redirect_to( '/admin/organisations/');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub merge_list {
|
||||||
|
my $c = shift;
|
||||||
|
|
||||||
|
my $org_id = $c->param('id');
|
||||||
|
my $org_result = $c->result_set->find($org_id);
|
||||||
|
|
||||||
|
if ( defined $org_result->entity->user ) {
|
||||||
|
$c->flash( error => 'Cannot merge from user-owned organisation!' );
|
||||||
|
$c->redirect_to( '/admin/organisations/' . $org_id );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $org_rs = $c->result_set->search(
|
||||||
|
{
|
||||||
|
id => { '!=' => $org_id },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
page => $c->param('page') || 1,
|
||||||
|
rows => 10,
|
||||||
|
order_by => { '-asc' => 'name' },
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
$c->stash(
|
||||||
|
org_result => $org_result,
|
||||||
|
org_rs => $org_rs,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub merge_detail {
|
||||||
|
my $c = shift;
|
||||||
|
|
||||||
|
my $org_id = $c->param('id');
|
||||||
|
my $org_result = $c->result_set->find($org_id);
|
||||||
|
|
||||||
|
if ( defined $org_result->entity->user ) {
|
||||||
|
$c->flash( error => 'Cannot merge from user-owned organisation!' );
|
||||||
|
$c->redirect_to( '/admin/organisations/' . $org_id );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $target_id = $c->param('target_id');
|
||||||
|
my $target_result = $c->result_set->find($target_id);
|
||||||
|
|
||||||
|
unless ( defined $target_result ) {
|
||||||
|
$c->flash( error => 'Unknown target organisation' );
|
||||||
|
$c->redirect_to( '/admin/organisations/' . $org_id . '/merge' );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$c->stash(
|
||||||
|
org_result => $org_result,
|
||||||
|
target_result => $target_result,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub merge_confirm {
|
||||||
|
my $c = shift;
|
||||||
|
|
||||||
|
my $org_id = $c->param('id');
|
||||||
|
my $org_result = $c->result_set->find($org_id);
|
||||||
|
|
||||||
|
if ( defined $org_result->entity->user ) {
|
||||||
|
$c->flash( error => 'Cannot merge from user-owned organisation!' );
|
||||||
|
$c->redirect_to( '/admin/organisations/' . $org_id );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $target_id = $c->param('target_id');
|
||||||
|
my $target_result = $c->result_set->find($target_id);
|
||||||
|
my $confirm = $c->param('confirm');
|
||||||
|
|
||||||
|
if ( $confirm eq 'checked' && defined $org_result && defined $target_result ) {
|
||||||
|
try {
|
||||||
|
$c->schema->txn_do( sub {
|
||||||
|
# Done as an update, not update_all, so its damn fast - we're only
|
||||||
|
# editing an id which is guaranteed to be an integer here, and this
|
||||||
|
# makes it only one update statement.
|
||||||
|
$org_result->entity->sales->update(
|
||||||
|
{ seller_id => $target_result->entity->id }
|
||||||
|
);
|
||||||
|
my $count = $org_result->entity->sales->count;
|
||||||
|
die "Failed to migrate all sales" if $count;
|
||||||
|
$org_result->entity->delete;
|
||||||
|
$c->schema->resultset('ImportLookup')->search({ entity_id => $org_result->entity->id })->delete;
|
||||||
|
my $org_count = $c->result_set->search({id => $org_result->id })->count;
|
||||||
|
my $entity_count = $c->schema->resultset('Entity')->search({id => $org_result->entity->id })->count;
|
||||||
|
die "Failed to remove org" if $org_count;
|
||||||
|
die "Failed to remove entity" if $entity_count;
|
||||||
|
});
|
||||||
|
} catch {
|
||||||
|
$c->app->log->warn($_);
|
||||||
|
};
|
||||||
|
$c->flash( error => 'Engage' );
|
||||||
|
} else {
|
||||||
|
$c->flash( error => 'You must tick the confirmation box to proceed' );
|
||||||
|
}
|
||||||
|
$c->redirect_to( '/admin/organisations/' . $org_id . '/merge/' . $target_id );
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
|
@ -12,6 +12,11 @@ sub register {
|
||||||
}
|
}
|
||||||
return $value;
|
return $value;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$app->helper( format_currency_from_db => sub {
|
||||||
|
my ( $c, $value ) = @_;
|
||||||
|
return sprintf( '£%.2f', $value / 100000 );
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
81
templates/admin/organisations/merge_detail.html.ep
Normal file
81
templates/admin/organisations/merge_detail.html.ep
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
% layout 'admin_errors';
|
||||||
|
% title 'Organisations';
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<h3 class="float-left">Merging <%= $org_result->name %> into <%= $target_result->name %></h3>
|
||||||
|
<a href="<%= url_for '/admin/organisations/' . $org_result->id . '/merge' %>" class="btn btn-success float-right">Back</a>
|
||||||
|
</div>
|
||||||
|
% for my $org ( $org_result, $target_result ) {
|
||||||
|
<div class="col-6">
|
||||||
|
<div class="card">
|
||||||
|
<h3 class="card-header">
|
||||||
|
<%= $org->name %>
|
||||||
|
</h3>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-6">
|
||||||
|
Street Name
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
%= $org->street_name
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
Town/City
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
%= $org->town
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
Sector
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
%= $org->sector
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
Postcode
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
%= $org->postcode
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
Validated
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
%= $org->pending ? 'no' : 'yes'
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
Is Local
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
%= $org->is_local ? 'yes' : 'no'
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="list-group list-group-flush">
|
||||||
|
<div class="list-group-item">
|
||||||
|
Transaction Count: <%= $org->entity->sales->count %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
% }
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
|
<h1 class="card-title">
|
||||||
|
Warning: Cannot be undone!
|
||||||
|
</h1>
|
||||||
|
<p>
|
||||||
|
This will discard all basic information about this organisation, and
|
||||||
|
merge all transactions into the target organisation. This process has
|
||||||
|
no way of being undone.
|
||||||
|
</p>
|
||||||
|
<form action="<%= url_for %>" method="POST">
|
||||||
|
<input type="checkbox" name="confirm" value="checked">
|
||||||
|
<label>I confirm that I want this to happen</label>
|
||||||
|
<button type="submit" class="btn btn-danger">Confirm Merge</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
25
templates/admin/organisations/merge_list.html.ep
Normal file
25
templates/admin/organisations/merge_list.html.ep
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
% layout 'admin_errors';
|
||||||
|
% title 'Organisations';
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<h3>Target to merge into for <%= $org_result->name %></h3>
|
||||||
|
</div>
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<h3 class="card-header">
|
||||||
|
Organisations
|
||||||
|
<a href="<%= url_for '/admin/organisations/' . $org_result->id %>" class="btn btn-success float-right">Back</a>
|
||||||
|
</h3>
|
||||||
|
<div class="list-group list-group-flush">
|
||||||
|
% for my $org ( $org_rs->all ) {
|
||||||
|
<a href="<%= url_for . '/' . $org->id %>" class="list-group-item list-group-item-action">
|
||||||
|
%= $org->name
|
||||||
|
</a>
|
||||||
|
% }
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-12">
|
||||||
|
%= bootstrap_pagination( $c->param('page') || 1, $org_rs->pager->last_page, { class => 'justify-content-center' } );
|
||||||
|
</div>
|
||||||
|
</div>
|
Reference in a new issue