Optimized look and user experience; fixed errors

This commit is contained in:
Florian "flowdy" Heß 2017-01-28 14:00:20 +01:00
parent 5aaff598d1
commit 6f19437901
23 changed files with 1434 additions and 44 deletions

View File

@ -13,8 +13,16 @@ sub import {
my ($class, $dbh_ref, $filename) = @_;
return if @_ == 1;
croak "use TrsrDB \$your_db_handle missing" if !defined $dbh_ref;
my $filename //= $ENV{TRSRDB_SQLITE_FILE}
// croak "No database to open: TRSRDB_SQLITE_FILE environment variable not set, "
. "and no filename passed to ".__PACKAGE__."::import() / use";
if ( !(-f $filename && -r $filename) ) {
croak "Cannot read database file $filename";
}
$$dbh_ref = $class->connect(
"DBI:SQLite:" . ($filename // $ENV{TRSRDB_SQLITE_FILE} // ":memory:"),
"DBI:SQLite:" . ($filename // $ENV{TRSRDB_SQLITE_FILE}
// die "No database to open: TRSRDB_SQLITE_FILE environment variable not set\n"),
"", "", {
sqlite_unicode => 1,
on_connect_call => 'use_foreign_keys',

View File

@ -11,14 +11,17 @@ __PACKAGE__->add_column("purpose");
__PACKAGE__->add_column("value" => { data_type => 'INTEGER' });
__PACKAGE__->add_column("paid" => { data_type => 'INTEGER', default => 0 });
__PACKAGE__->set_primary_key("billId");
__PACKAGE__->add_column("targetCredit" => { data_type => 'INTEGER' });
__PACKAGE__->add_column("targetCredit" => {
data_type => 'INTEGER',
is_nullable => 1
});
__PACKAGE__->belongs_to(
account => 'TrsrDB::Account',
{ 'foreign.ID' => 'self.debtor' }
);
__PACKAGE__->might_have(
__PACKAGE__->belongs_to(
target => 'TrsrDB::Credit',
{ 'foreign.credId' => 'self.targetCredit' }
);

View File

@ -7,11 +7,22 @@ use Mojolicious::Sessions;
use Mojo::Base 'Mojolicious';
use POSIX qw(strftime);
has db => sub {
my $db;
eval q{use TrsrDB \$db} or $@ && die $@;
return $db;
};
{ my $sql_trace;
open my $dfh, '>', \$sql_trace;
sub get_trace () {
my $t = $sql_trace;
$sql_trace = q{};
seek $dfh, 0, 0;
return \$t;
}
has db => sub {
my $db;
eval q{use TrsrDB \$db} or $@ && die $@;
$db->storage->debugfh($dfh);
return $db;
};
}
# This method will run once at server start
sub startup {
@ -43,6 +54,16 @@ sub startup {
pop =~ s{\n}{<br>}grms;
});
if ( $ENV{DBIC_TRACE} ) {
$self->helper(sql_trace => \&get_trace);
}
else {
$self->helper(sql_trace => sub {
return "No SQL trace shown here, because environment variable "
. "DBIC_TRACE is not set."
});
}
if ( my $l = $ENV{LOG} ) {
use Mojo::Log;
open my $fh, '>', $l or die "Could not open logfile $l to write: $!";
@ -63,21 +84,25 @@ sub startup {
$auth->get( '/logout' )->to("user#logout");
my $check = $auth->under(sub { shift->stash('grade') })->get('/');
my $check = $auth->under(sub {
my $c = shift;
return $c->stash('grade') || undef;
})->get('/');
$check->get('/bankStatement' => sub {
my $c = shift;
$c->stash( records => $c->app->db->resultset("ReconstructedBankStatement") );
$c->render('bankStatement');
});
my $admin = $auth->under(sub { shift->stash('grade') > 1 });
my $admin = $auth->under(sub {
my $c = shift;
return $c->stash('grade') > 1 || undef;
});
$admin->any('/admin')->to('admin#dash');
$admin->any( [qw/GET POST/] => '/account/:account' => { account => undef })
->to('account#upsert');
$admin->post('/:account/in')->to('credit#upsert');
$admin->post('/:account/out')->to('debit#upsert');
$admin->get('/:account/credits')->to('credit#list');
$admin->get('/:account/debits')->to('debit#list');
$admin->any( [qw/GET POST/] => '/:account/in')->to('credit#upsert');
$admin->any( [qw/GET POST/] => '/:account/out')->to('debit#upsert');
$admin->post('/:account/transfer')->to('account#transfer');
$admin->any( [qw/GET POST PATCH/] => '/credit/:id' )->to('credit#upsert');
$admin->any( [qw/GET POST/] => '/credit')->to('credit#upsert');
@ -90,6 +115,8 @@ sub startup {
my $account = $auth->get('/:account')->under(sub {
my $c = shift;
return 1 if $c->stash('grade');
my $account = $c->stash('account');
if ( my $acc = $c->app->db->resultset('Account')->find($account) ) {
$c->stash( account => $acc );
@ -100,13 +127,20 @@ sub startup {
return;
}
return $account->type ? $c->stash('grade') : 1;
return 1 if !$account->type;
return $account->ID eq $c->stash("user")->user_id || undef;
});
$account->get('/in')->to("credit#upsert");
$account->get('/out')->to("debit#upsert");
$account->get('/credits')->to("credit#list");
$account->get('/debits')->to("debit#list");
$account->get('/:action')->to('account#');
$r->any('/*whatever' => {whatever => ''} => sub {
my $c = shift;
my $whatever = $c->param('whatever');
$c->render(text => "/$whatever did not match.", status => 404);
});
}
my $started_time;

View File

@ -8,9 +8,14 @@ sub list {
my $self = shift;
my $accounts = $self->app->db->resultset("Account");
my %args = $self->stash("user")->grade ? () : ( type => undef );
$accounts = $accounts->search(\%args, { order_by => { -asc => [qw/type ID/] } });
my $user = $self->stash("user");
my %args = $user->grade ? ()
: $accounts->find( $user->user_id ) ? ( 'me.ID' => $user->user_id )
: ( type => q{} );
$accounts = $accounts->search(\%args, {
order_by => { -asc => [qw/type balance.even_until me.ID/] },
prefetch => 'balance'
});
$self->stash( accounts => $accounts );

View File

@ -3,6 +3,7 @@ use strict;
package TrsrDB::HTTP::Credit;
use Mojo::Base 'Mojolicious::Controller';
use Carp qw(croak);
use POSIX qw(strftime);
sub list {
my $self = shift;
@ -33,9 +34,11 @@ sub upsert {
my $db = $self->app->db;
my $id = $self->stash("id");
my $method = $id ? 'find_or_new' : 'new';
my $credit = $db->resultset("Credit")->$method(
{ $id ? (credId => $id) : (), account => $self->stash("account") }
);
my $credit = $db->resultset("Credit")->$method({
$id ? (credId => $id) : (),
account => $self->stash("account"),
date => strftime("%Y-%m-%d", localtime)
});
$self->stash( credit => $credit );
if ( $self->req->method eq 'GET' ) {

View File

@ -3,6 +3,7 @@ use strict;
package TrsrDB::HTTP::Debit;
use Mojo::Base 'Mojolicious::Controller';
use Carp qw(croak);
use POSIX qw(strftime);
sub list {
my $self = shift;
@ -42,6 +43,7 @@ sub upsert {
while ( my $m = $group_members->next ) {
my %props = map { $_ => $self->param($_) } @FIELDS;
$props{targetCredit} ||= undef;
for ( $props{billId} ) {
s{\%u}{ $m->ID }e or $_ .= "-" . $m->ID;
}
@ -53,9 +55,11 @@ sub upsert {
}
my $method = $id ? 'find_or_new' : 'new';
my $debit = $db->resultset("Debit")->$method(
{ $id ? (billId => $id) : (), debtor => $debtor }
);
my $debit = $db->resultset("Debit")->$method({
$id ? (billId => $id) : (),
debtor => $debtor,
date => strftime("%Y-%m-%d", localtime)
});
$self->stash( debit => $debit );
@ -76,6 +80,7 @@ sub upsert {
for my $field ( @FIELDS ) {
my $value = $self->param($field);
$value = undef if !length $value;
$debit->$field($value);
}
$debit->update_or_insert();
@ -89,7 +94,15 @@ sub upsert {
my $to_pay_with = $self->every_param("payWith");
if ( @$to_pay_with ) {
$db->make_transfers( $to_pay_with => $self->param("billId") );
my $billId = $self->param("billId");
$db->make_transfers( $to_pay_with => $billId );
for my $param ( grep { /^note\[/ } @{ $self->req->params->names } ) {
my $note = $self->param($param) || next;
s{^note\[}{} && s{\]$}{} for $param;
$db->resultset("Transfer")->find({
billId => $self->param("billId"), credId => $param
})->update({ note => $note });
}
}
$self->redirect_to('home');

View File

@ -18,6 +18,21 @@ sub login {
$self->render( retry_msg => 'authfailure' );
return;
}
elsif ( my $token = $self->param('token') ) {
my $pw = $self->param("password") // q{};
if ( ($user->password//q{}) ne $token ) {
$self->render( retry_msg => 'authfailure' );
return;
}
elsif ( $pw ne ($self->param("samepassword") // q{}) ) {
$self->render( retry_msg => "Passwords are different" );
return;
}
$self->session("user_id" => $user_id );
$user->salted_password($pw);
$user->update();
$self->redirect_to("home");
}
elsif ( $password && $user->password_equals($password) ) {
$self->session("user_id" => $user_id );
$self->redirect_to("home");
@ -33,6 +48,7 @@ sub logout {
$self->session(expires => 1);
$self->redirect_to('home');
# $self->stash( retry_msg => 'loggedOut' );
}

View File

@ -25,7 +25,7 @@ __PACKAGE__->set_primary_key('user_id');
sub salted_password {
my ($self, $password) = @_;
if ( exists $_[1] ) {
my $random_string = _randomstring(8);
my $random_string = randomstring(8);
return $self->password(
$random_string."//".hmac_sha256_hex($password, $random_string)
);
@ -55,7 +55,7 @@ sub sqlt_deploy_hook {
}
my @chars = ( 0..9, "a".."z", "A".."Z" );
sub _randomstring {
sub randomstring {
my ($length) = @_;
return join q{}, map { $chars[ int rand(62) ] } 1 .. $length;
}

47
httpuser Normal file
View File

@ -0,0 +1,47 @@
#!/usr/bin/env perl
use strict;
my $db;
use TrsrDB \$db;
use Getopt::Long;
my %OPTS;
GetOptions( \%OPTS, 'add|a', 'reset|r', 'grade|g:i', 'email|m:s', 'username|name|n:s' );
my $user = shift;
if ( !$user ) {
die 'No user_id given. Usage: httpuser [-a|-r] $USERNAME [-g 0|1|2] [-m $MAILADDR] [-n $FULL_NAME]', "\n";
}
if ( $OPTS{add} ) {
die "--add/-a and --reset/-r (reset password of existing account) contradict" if $OPTS{reset};
$user = $db->resultset("User")->create({ user_id => $user, grade => delete $OPTS{grade} });
}
else {
$user = $db->resultset("User")->find($user)
// die "No user $user found";
}
if ( delete $OPTS{add} || delete $OPTS{reset} ) {
my $random_string = TrsrDB::User::randomstring(50);
print "Load or send someone following link:\n",
"------------------------------------\n",
"<FQDN>/login?token=".$random_string."\n\n";
$user->password($random_string);
}
$user->update(\%OPTS);
print "User data:\n",
"----------\n",
"ID: ", $user->user_id, "\n",
"Grade: ", [
"0 - can read main accounts, or his own only when its ID equals his",
"1 - can read all accounts and bank statement, but cannot add or change data",
"2 - can read and update the database"
]->[ $OPTS{grade} // $user->grade ]."\n" // die "Unsupported level: $OPTS{grade}",
"E-Mail: ", $OPTS{email} // $user->email // "(none)",
"Name: ", $OPTS{username} // $user->username // "(none)"
;

View File

@ -1,5 +1,5 @@
CREATE TRIGGER enforceImmutableTransfer
BEFORE UPDATE ON Transfer
BEFORE UPDATE OF timestamp, credId, billId, amount ON Transfer -- Allow update of note
WHEN OLD.amount IS NOT NULL
AND NOT EXISTS (SELECT * FROM __INTERNAL_TRIGGER_STACK)
BEGIN

12
server Executable file
View File

@ -0,0 +1,12 @@
#!/usr/bin/env perl
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin";
$ENV{MOJO_LISTEN} //= "http://127.0.0.1:3000";
# Start command line interface for application
require Mojolicious::Commands;
my $app = Mojolicious::Commands->start_app("TrsrDB::HTTP");

187
site/add-credit.svg Normal file
View File

@ -0,0 +1,187 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="100%"
height="100%"
viewBox="0 0 57.641069 51.866212"
id="Capa_1"
xml:space="preserve"><metadata
id="metadata3196"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs3194" /><g
transform="matrix(0.96269008,0,0,0.96269008,0.90252195,-1.9855483)"
id="XMLID_21_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"><path
d="M 29,48 C 14.641,48 3,45.038 3,42 v 6.996 C 3.008,52.032 14.645,55 29,55 43.355,55 54.992,52.032 55,48.996 V 42 c 0,3.038 -11.641,6 -26,6"
id="XMLID_148_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="M 26,37 C 11.641,37 0,34.038 0,31 v 6.996 C 0.008,41.032 11.645,44 26,44 40.355,44 51.992,41.032 52,37.996 V 31 c 0,3.038 -11.641,6 -26,6"
id="XMLID_147_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="M 32,26 C 17.641,26 6,23.038 6,20 v 6.996 C 6.008,30.032 17.645,33 32,33 46.355,33 57.992,30.032 58,26.996 V 20 c 0,3.038 -11.641,6 -26,6"
id="XMLID_146_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="M 52,8.13 C 52,11.167 40.359,14 26,14 11.641,14 0,11.167 0,8.13 0,5.092 11.641,3 26,3 40.359,3 52,5.092 52,8.13"
id="XMLID_145_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="M 26,14 C 11.641,14 0,11.038 0,8 v 6.996 C 0.008,18.032 11.645,21 26,21 40.355,21 51.992,18.032 52,14.996 V 8 c 0,3.038 -11.641,6 -26,6"
id="XMLID_144_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 4,11.074 v 6.995 c 0.608,0.224 1.274,0.44 2,0.646 V 11.719 C 5.274,11.513 4.608,11.297 4,11.074"
id="XMLID_143_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 46,11.719 v 6.996 c 0.726,-0.206 1.392,-0.422 2,-0.646 v -6.995 c -0.608,0.224 -1.274,0.439 -2,0.645"
id="XMLID_142_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 9,12.445 v 6.997 c 0.64,0.133 1.307,0.259 2,0.378 V 12.823 C 10.307,12.704 9.64,12.578 9,12.445"
id="XMLID_141_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 41,12.823 v 6.998 c 0.693,-0.12 1.36,-0.246 2,-0.379 v -6.997 c -0.64,0.133 -1.307,0.259 -2,0.378"
id="XMLID_140_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 14,13.269 v 6.998 c 0.652,0.084 1.317,0.162 2,0.232 v -6.998 c -0.683,-0.07 -1.348,-0.149 -2,-0.232"
id="XMLID_139_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="M 36,13.502 V 20.5 c 0.683,-0.071 1.348,-0.149 2,-0.232 v -6.999 c -0.652,0.085 -1.317,0.163 -2,0.233"
id="XMLID_138_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 19,13.759 v 6.999 c 0.657,0.046 1.323,0.087 2,0.12 v -7 c -0.677,-0.033 -1.343,-0.073 -2,-0.119"
id="XMLID_137_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 31,13.878 v 7 c 0.677,-0.033 1.343,-0.074 2,-0.12 v -6.999 c -0.657,0.046 -1.323,0.086 -2,0.119"
id="XMLID_136_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 26,14 c -0.335,0 -0.668,-0.003 -1,-0.006 v 7 c 0.332,0.003 0.665,0.006 1,0.006 0.335,0 0.668,-0.003 1,-0.006 v -7 C 26.668,13.997 26.335,14 26,14"
id="XMLID_135_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 10,23.074 v 6.995 c 0.608,0.224 1.274,0.44 2,0.646 v -6.996 c -0.726,-0.206 -1.392,-0.422 -2,-0.645"
id="XMLID_134_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 52,23.719 v 6.996 c 0.726,-0.206 1.392,-0.422 2,-0.646 v -6.995 c -0.608,0.224 -1.274,0.439 -2,0.645"
id="XMLID_133_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 15,24.445 v 6.997 c 0.64,0.133 1.307,0.259 2,0.378 v -6.997 c -0.693,-0.119 -1.36,-0.245 -2,-0.378"
id="XMLID_132_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 47,24.823 v 6.998 c 0.693,-0.12 1.36,-0.246 2,-0.379 v -6.997 c -0.64,0.133 -1.307,0.259 -2,0.378"
id="XMLID_131_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 20,25.27 v 6.998 c 0.652,0.084 1.317,0.162 2,0.232 V 25.502 C 21.317,25.431 20.652,25.353 20,25.27"
id="XMLID_130_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="M 42,25.501 V 32.5 c 0.683,-0.071 1.348,-0.149 2,-0.232 V 25.27 c -0.652,0.084 -1.317,0.162 -2,0.231"
id="XMLID_129_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 25,25.759 v 6.999 c 0.657,0.046 1.323,0.087 2,0.12 v -7 c -0.677,-0.033 -1.343,-0.073 -2,-0.119"
id="XMLID_128_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 37,25.878 v 7 c 0.677,-0.033 1.343,-0.074 2,-0.12 v -6.999 c -0.657,0.046 -1.323,0.086 -2,0.119"
id="XMLID_127_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 32,26 c -0.335,0 -0.668,-0.003 -1,-0.006 v 7 c 0.332,0.003 0.665,0.006 1,0.006 0.335,0 0.668,-0.003 1,-0.006 v -7 C 32.668,25.997 32.335,26 32,26"
id="XMLID_126_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 4,34.074 v 6.995 c 0.608,0.224 1.274,0.439 2,0.646 V 34.719 C 5.274,34.513 4.608,34.297 4,34.074"
id="XMLID_125_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 46,34.719 v 6.996 c 0.726,-0.206 1.392,-0.422 2,-0.646 v -6.995 c -0.608,0.224 -1.274,0.439 -2,0.645"
id="XMLID_124_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 9,35.445 v 6.997 c 0.64,0.133 1.307,0.259 2,0.378 V 35.823 C 10.307,35.704 9.64,35.578 9,35.445"
id="XMLID_123_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 41,35.823 v 6.998 c 0.693,-0.12 1.36,-0.246 2,-0.379 v -6.997 c -0.64,0.133 -1.307,0.259 -2,0.378"
id="XMLID_122_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 14,36.27 v 6.998 c 0.652,0.084 1.317,0.162 2,0.232 V 36.502 C 15.317,36.431 14.652,36.353 14,36.27"
id="XMLID_121_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="M 36,36.501 V 43.5 c 0.683,-0.071 1.348,-0.149 2,-0.232 V 36.27 c -0.652,0.084 -1.317,0.162 -2,0.231"
id="XMLID_120_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 19,36.759 v 6.999 c 0.657,0.046 1.323,0.087 2,0.12 v -7 c -0.677,-0.033 -1.343,-0.073 -2,-0.119"
id="XMLID_119_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 31,36.878 v 7 c 0.677,-0.033 1.343,-0.074 2,-0.12 v -6.999 c -0.657,0.046 -1.323,0.086 -2,0.119"
id="XMLID_118_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 26,37 c -0.335,0 -0.668,-0.003 -1,-0.006 v 7 c 0.332,0.003 0.665,0.006 1,0.006 0.335,0 0.668,-0.003 1,-0.006 v -7 C 26.668,36.997 26.335,37 26,37"
id="XMLID_117_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 7,45.074 v 6.995 c 0.608,0.224 1.274,0.439 2,0.646 V 45.719 C 8.274,45.513 7.608,45.297 7,45.074"
id="XMLID_116_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 49,45.719 v 6.996 c 0.726,-0.206 1.392,-0.422 2,-0.646 v -6.995 c -0.608,0.224 -1.274,0.439 -2,0.645"
id="XMLID_115_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 12,46.445 v 6.997 c 0.64,0.133 1.307,0.259 2,0.378 v -6.997 c -0.693,-0.119 -1.36,-0.245 -2,-0.378"
id="XMLID_114_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 44,46.823 v 6.998 c 0.693,-0.12 1.36,-0.246 2,-0.379 v -6.997 c -0.64,0.133 -1.307,0.259 -2,0.378"
id="XMLID_113_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 17,47.27 v 6.998 c 0.652,0.084 1.317,0.162 2,0.232 V 47.502 C 18.317,47.431 17.652,47.353 17,47.27"
id="XMLID_112_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="M 39,47.501 V 54.5 c 0.683,-0.071 1.348,-0.149 2,-0.232 V 47.27 c -0.652,0.084 -1.317,0.162 -2,0.231"
id="XMLID_111_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 22,47.759 v 6.999 c 0.657,0.046 1.323,0.087 2,0.12 v -7 c -0.677,-0.033 -1.343,-0.073 -2,-0.119"
id="XMLID_110_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 34,47.878 v 7 c 0.677,-0.033 1.343,-0.074 2,-0.12 v -6.999 c -0.657,0.046 -1.323,0.086 -2,0.119"
id="XMLID_109_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="m 29,48 c -0.335,0 -0.668,-0.003 -1,-0.006 v 7 c 0.332,0.003 0.665,0.006 1,0.006 0.335,0 0.668,-0.003 1,-0.006 v -7 C 29.668,47.997 29.335,48 29,48"
id="XMLID_108_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="M 51.212,39.372 C 48.372,41.87 38.163,44 26,44 16.49,44 8.177,42.697 3.644,40.935 3.227,41.313 3,41.713 3,42.13 3,45.168 14.641,48 29,48 c 14.36,0 26,-2.832 26,-5.87 0,-1.047 -1.385,-1.983 -3.788,-2.758"
id="XMLID_107_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="M 32,33 C 18.787,33 7.884,30.485 6.226,27.717 2.347,28.596 0,29.767 0,31.13 0,34.167 11.641,37 26,37 40.359,37 52,34.167 52,31.13 52,30.996 51.97,30.865 51.925,30.735 47.156,32.077 40.002,33 32,33"
id="XMLID_106_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
d="M 50.993,16.549 C 47.882,18.969 37.874,21 26,21 18.332,21 11.441,20.152 6.682,18.9 6.241,19.29 6,19.7 6,20.13 6,23.168 17.641,26 32,26 c 14.359,0 26,-2.832 26,-5.87 0,-1.452 -2.663,-2.687 -7.007,-3.581"
id="XMLID_105_"
style="fill:none;stroke:#575757;stroke-width:1.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><g
transform="translate(-0.28094785,-4.0730385)"
id="g3162" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3164" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3166" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3168" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3170" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3172" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3174" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3176" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3178" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3180" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3182" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3184" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3186" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3188" /><g
transform="translate(-0.28094785,-4.0730385)"
id="g3190" /><path
d="m 15.449764,18.137746 0,11.814152 -11.7999524,0 0,10.678176 11.7999524,0 0,11.814151 10.692375,0 0,-11.814151 11.799952,0 0,-10.678176 -11.799952,0 0,-11.814152 -10.692375,0 z"
id="rect3198"
style="color:#000000;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /></svg>

After

Width:  |  Height:  |  Size: 14 KiB

101
site/add-debit.svg Normal file
View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.2"
width="53.532574"
height="58.111126"
id="svg3223">
<defs
id="defs3225" />
<metadata
id="metadata3228">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-400.42529,-306.97572)"
id="layer1">
<rect
width="42.944054"
height="49.870514"
x="408.4845"
y="309.50504"
id="rect3231"
style="color:#000000;fill:none;stroke:#545454;stroke-width:5.05862427;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
width="28.167603"
height="1.3852918"
x="415.87274"
y="321.04913"
id="rect4001"
style="color:#000000;fill:none;stroke:#545454;stroke-width:5.05862427;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
width="14.858214"
height="1.0052946"
x="414.67746"
y="331.85971"
id="rect4001-6"
style="color:#000000;fill:none;stroke:#545454;stroke-width:3.12980151;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
width="14.858214"
height="1.0052946"
x="414.67746"
y="337.5163"
id="rect4001-6-7"
style="color:#000000;fill:none;stroke:#545454;stroke-width:3.12980151;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
width="14.858214"
height="1.0052946"
x="414.67746"
y="343.17288"
id="rect4001-6-5"
style="color:#000000;fill:none;stroke:#545454;stroke-width:3.12980151;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<flowRoot
id="flowRoot4565"
xml:space="preserve"
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"><flowRegion
id="flowRegion4567"><rect
width="157.14285"
height="180"
x="114.28571"
y="758.07648"
id="rect4569"
style="font-size:12px" /></flowRegion><flowPara
id="flowPara4571"></flowPara></flowRoot> <flowRoot
id="flowRoot4573"
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"><flowRegion
id="flowRegion4575"><rect
width="180"
height="194.28572"
x="174.28572"
y="769.50507"
id="rect4577" /></flowRegion><flowPara
id="flowPara4579"></flowPara></flowRoot> <g
transform="matrix(0.31751038,0,0,0.31751038,381.44127,88.814217)"
id="flowRoot4581"
style="font-size:64px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#4e4e4e;fill-opacity:1;stroke:#545454;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans">
<path
d="m 203.09375,805.0107 c -1.9792,1.14583 -4.05212,2.01041 -6.21875,2.59375 -2.14587,0.58333 -4.38545,0.875 -6.71875,0.875 -5.45836,0 -10.06252,-1.35417 -13.8125,-4.0625 -3.72918,-2.72916 -6.37501,-6.64583 -7.9375,-11.75 l -6.78125,0 2.75,-6.09375 3.0625,0 c -0.0208,-0.29165 -0.0417,-0.59373 -0.0625,-0.90625 0,-0.33331 0,-0.79165 0,-1.375 0,-0.60415 0,-1.0729 0,-1.40625 0.0208,-0.33331 0.0417,-0.65623 0.0625,-0.96875 l -5.8125,0 2.75,-6.09375 4.03125,0 c 1.60416,-5.12497 4.26041,-9.03121 7.96875,-11.71875 3.72915,-2.68746 8.32289,-4.03121 13.78125,-4.03125 2.3333,4e-5 4.57288,0.29171 6.71875,0.875 2.16663,0.58338 4.23955,1.44796 6.21875,2.59375 l 0,9.65625 c -1.68754,-1.62497 -3.48962,-2.84372 -5.40625,-3.65625 -1.9167,-0.8333 -3.90628,-1.24996 -5.96875,-1.25 -2.64586,4e-5 -4.90627,0.64587 -6.78125,1.9375 -1.85419,1.27087 -3.25002,3.13545 -4.1875,5.59375 l 16.84375,0 -2.6875,6.09375 -15.40625,0 c -0.0417,0.33335 -0.0729,0.68752 -0.0937,1.0625 -2e-5,0.37502 -2e-5,0.93752 0,1.6875 -2e-5,0.27085 -2e-5,0.57294 0,0.90625 0.0208,0.31252 0.0417,0.64585 0.0625,1 l 13.40625,0 -2.78125,6.09375 -9.34375,0 c 1.04165,2.54168 2.46873,4.44792 4.28125,5.71875 1.83331,1.27084 4.06247,1.90625 6.6875,1.90625 2.06247,0 4.03122,-0.40625 5.90625,-1.21875 1.8958,-0.83333 3.71871,-2.07291 5.46875,-3.71875 l 0,9.65625"
id="path4590"
style="font-weight:bold;fill:#4e4e4e;fill-opacity:1;stroke:#545454;stroke-opacity:1;-inkscape-font-specification:Sans Bold" />
</g>
<path
d="m 412.22524,330.78037 0,11.81415 -11.79995,0 0,10.67818 11.79995,0 0,11.81415 10.69238,0 0,-11.81415 11.79995,0 0,-10.67818 -11.79995,0 0,-11.81415 -10.69238,0 z"
id="rect3198"
style="color:#000000;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

63
site/even.svg Normal file
View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg id="svg1306" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="48px" width="48px" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs id="defs1308">
<radialGradient id="radialGradient3976" gradientUnits="userSpaceOnUse" cy="40" cx="23.857" gradientTransform="matrix(1 0 0 .5 0 20)" r="17.143">
<stop id="stop4128" offset="0"/>
<stop id="stop4130" stop-opacity="0" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient3980" y2="-8.5627" gradientUnits="userSpaceOnUse" x2="20.065" y1="53.836" x1="43.936">
<stop id="stop2481" stop-color="#ffe69b" offset="0"/>
<stop id="stop2483" stop-color="#fff" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient3982" y2="15.815" gradientUnits="userSpaceOnUse" x2="20.917" gradientTransform="matrix(1.003 0 0 1.003 -.071859 .019684)" y1="33.955" x1="21.994">
<stop id="stop3959" stop-color="#fffeff" stop-opacity=".33333" offset="0"/>
<stop id="stop3961" stop-color="#fffeff" stop-opacity=".21569" offset="1"/>
</linearGradient>
</defs>
<metadata id="metadata1311">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:creator>
<cc:Agent>
<dc:title>Rodney Dawes</dc:title>
</cc:Agent>
</dc:creator>
<dc:contributor>
<cc:Agent>
<dc:title>Jakub Steiner, Garrett LeSage</dc:title>
</cc:Agent>
</dc:contributor>
<cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/"/>
<dc:title/>
</cc:Work>
<cc:License rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
<cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
<cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
<cc:requires rdf:resource="http://web.resource.org/cc/Notice"/>
<cc:requires rdf:resource="http://web.resource.org/cc/Attribution"/>
<cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
<cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike"/>
</cc:License>
</rdf:RDF>
</metadata>
<g id="layer2">
<path id="path6548" opacity=".6" style="color:#000000" d="m41 40a17.143 8.5714 0 1 1 -34.286 0 17.143 8.5714 0 1 1 34.286 0z" transform="matrix(1.0706 0 0 .525 -.89276 22.5)" display="block" fill="url(#radialGradient3976)"/>
</g>
<g id="layer1">
<g id="g4006">
<path id="path1314" d="m46.857 23.929c0 12.9-10.457 23.357-23.357 23.357s-23.357-10.457-23.357-23.357 10.457-23.357 23.357-23.357 23.357 10.457 23.357 23.357z" transform="matrix(.92049 0 0 .92049 2.3685 .97408)" stroke="#4e9a06" stroke-width="1.0864" fill="#73d216"/>
<path id="path3560" opacity=".34659" d="m49.902 26.635c0 13.25-10.741 23.991-23.991 23.991s-23.991-10.741-23.991-23.991 10.741-23.991 23.991-23.991 23.991 10.741 23.991 23.991z" fill-opacity="0" transform="matrix(.85609 0 0 .85609 1.8183 .19777)" stroke="url(#linearGradient3980)" stroke-width="1.1681"/>
</g>
</g>
<g id="layer3">
<g id="text4967" fill="#eeeeec" stroke="#eeeeec">
<path id="path4984" style="" d="m14.707 25.178c0.62921 0.000015 1.1052 0.5163 1.4278 1.5489 0.64534 1.9361 1.1052 2.9041 1.3794 2.9041 0.20973 0.000012 0.42753-0.16133 0.65342-0.48402 4.5336-7.2602 8.7284-13.133 12.584-17.618 1.0003-1.1616 2.5895-1.7424 4.7676-1.7425 0.51625 0.0000313 0.86313 0.048433 1.0406 0.1452 0.17744 0.096834 0.26618 0.21784 0.26621 0.36301-0.000033 0.2259-0.26624 0.66959-0.79863 1.331-6.2277 7.4861-12.004 15.392-17.328 23.717-0.37109 0.58082-1.1294 0.87124-2.2749 0.87123-1.1617 0.000005-1.8473-0.0484-2.0571-0.1452-0.54856-0.242-1.1939-1.4762-1.9361-3.7027-0.83897-2.4685-1.2585-4.0173-1.2584-4.6466-0.000008-0.67761 0.56468-1.331 1.6941-1.9603 0.69375-0.3872 1.3068-0.5808 1.8393-0.58082"/>
</g>
</g>
<g id="layer4">
<path id="path3955" fill="url(#linearGradient3982)" d="m43.429 21.8c0 10.863-10.386-6.285-18.731 0.388-8.151 6.517-20.659 12.227-20.659 1.364 0.0004-11.118 8.722-21.431 19.585-21.431 10.863-0.0002 19.805 8.816 19.805 19.679z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

68
site/list.svg Normal file
View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="51.552567"
height="44.168541"
id="svg3984">
<defs
id="defs3986" />
<metadata
id="metadata3989">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-371.25452,-454.25138)"
id="layer1">
<g
transform="matrix(0.1585623,0,0,0.1585623,360.7434,441.64285)"
id="g3955">
<path
d="m 74.290179,89.517857 0,34.281253 40.000001,0 0,-34.281253 -40.000001,0 z m 85.718751,0 0,34.281253 231.40625,0 0,-34.281253 -231.40625,0 z"
id="rect2985"
style="opacity:0.37423317;color:#000000;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.9000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
d="m 74.290179,167.60953 0,34.28125 40.000001,0 0,-34.28125 -40.000001,0 z m 85.718751,0 0,34.28125 231.40625,0 0,-34.28125 -231.40625,0 z"
id="rect2985-5"
style="opacity:0.37423317;color:#000000;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.9000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
d="m 74.290179,323.79299 0,34.28125 40.000001,0 0,-34.28125 -40.000001,0 z m 85.718751,0 0,34.28125 231.40625,0 0,-34.28125 -231.40625,0 z"
id="rect2985-3"
style="opacity:0.37423317;color:#000000;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.9000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
d="m 74.290179,245.70126 0,34.28125 40.000001,0 0,-34.28125 -40.000001,0 z m 85.718751,0 0,34.28125 231.40625,0 0,-34.28125 -231.40625,0 z"
id="rect2985-56"
style="opacity:0.37423317;color:#000000;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.9000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
d="m 66.290179,79.517857 0,34.281253 40.000001,0 0,-34.281253 -40.000001,0 z m 85.718751,0 0,34.281253 231.40625,0 0,-34.281253 -231.40625,0 z"
id="path3943"
style="color:#000000;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.9000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
d="m 66.290179,157.60953 0,34.28125 40.000001,0 0,-34.28125 -40.000001,0 z m 85.718751,0 0,34.28125 231.40625,0 0,-34.28125 -231.40625,0 z"
id="path3945"
style="color:#000000;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.9000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
d="m 66.290179,313.79299 0,34.28125 40.000001,0 0,-34.28125 -40.000001,0 z m 85.718751,0 0,34.28125 231.40625,0 0,-34.28125 -231.40625,0 z"
id="path3947"
style="color:#000000;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.9000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
d="m 66.290179,235.70126 0,34.28125 40.000001,0 0,-34.28125 -40.000001,0 z m 85.718751,0 0,34.28125 231.40625,0 0,-34.28125 -231.40625,0 z"
id="path3949"
style="color:#000000;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.9000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -13,6 +13,14 @@ h1 {
border-bottom: 5px double grey;
}
table {
border-collapse: collapse;
}
table td, table th {
border: 1px solid darkgrey;
}
table tr:nth-child(even) {
background-color: #eee;
}
@ -68,3 +76,24 @@ select {
color: lightgrey;
font-size: .8em;
}
img.icon {
vertical-align:middle;
height: 1.2em;
}
.targettable { display:none }
.targettable:target { display: block; }
#bottommenu {
font-size:smaller;
background-color: #eee;
border-top: 5px double grey;
text-align:center;
}
#footer {
font-size:smaller;
color: darkgrey;
text-align: center;
}

665
site/transfer.svg Normal file
View File

@ -0,0 +1,665 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48px"
height="48px"
id="svg1306"
sodipodi:version="0.32"
inkscape:version="0.48.0 r9654"
sodipodi:docname="Emblem-conflicting.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1">
<defs
id="defs1308">
<linearGradient
id="linearGradient3957">
<stop
style="stop-color:#fffeff;stop-opacity:0.33333334;"
offset="0"
id="stop3959" />
<stop
style="stop-color:#fffeff;stop-opacity:0.21568628;"
offset="1"
id="stop3961" />
</linearGradient>
<linearGradient
id="linearGradient2536">
<stop
style="stop-color:#a40000;stop-opacity:1;"
offset="0"
id="stop2538" />
<stop
style="stop-color:#ff1717;stop-opacity:1;"
offset="1"
id="stop2540" />
</linearGradient>
<linearGradient
id="linearGradient2479">
<stop
style="stop-color:#ffe69b;stop-opacity:1;"
offset="0"
id="stop2481" />
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="1"
id="stop2483" />
</linearGradient>
<linearGradient
id="linearGradient4126"
inkscape:collect="always">
<stop
id="stop4128"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop4130"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4126"
id="radialGradient2169"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.500000,1.899196e-14,20.00000)"
cx="23.857143"
cy="40.000000"
fx="23.857143"
fy="40.000000"
r="17.142857" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2479"
id="linearGradient2485"
x1="43.93581"
y1="53.835983"
x2="20.064686"
y2="-8.5626707"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2536"
id="linearGradient2542"
x1="36.917976"
y1="66.288063"
x2="19.071495"
y2="5.5410109"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2536"
id="linearGradient3046"
gradientUnits="userSpaceOnUse"
x1="36.917976"
y1="66.288063"
x2="19.071495"
y2="5.5410109" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2479"
id="linearGradient3048"
gradientUnits="userSpaceOnUse"
x1="43.93581"
y1="53.835983"
x2="20.064686"
y2="-8.5626707" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2536"
id="linearGradient3064"
gradientUnits="userSpaceOnUse"
x1="36.917976"
y1="66.288063"
x2="19.071495"
y2="5.5410109" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2479"
id="linearGradient3066"
gradientUnits="userSpaceOnUse"
x1="43.93581"
y1="53.835983"
x2="20.064686"
y2="-8.5626707" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3957"
id="linearGradient3963"
x1="21.993773"
y1="33.955299"
x2="20.917078"
y2="15.814602"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4126"
id="radialGradient3976"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.5,0,20)"
cx="23.857143"
cy="40.000000"
fx="23.857143"
fy="40.000000"
r="17.142857" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3957"
id="linearGradient3982"
gradientUnits="userSpaceOnUse"
x1="21.993773"
y1="33.955299"
x2="20.917078"
y2="15.814602"
gradientTransform="matrix(1.0316405,0,0,1.0139432,-0.62678087,-0.12022903)" />
<linearGradient
gradientTransform="translate(0,-2)"
gradientUnits="userSpaceOnUse"
y2="35.05225"
x2="24.30225"
y1="15.80225"
x1="21.75"
id="linearGradient2262"
xlink:href="#linearGradient2256"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(4.154957,0,0,3.198723,-52.84553,-23.50921)"
r="21.25"
fy="10.666344"
fx="16.75"
cy="10.666344"
cx="16.75"
id="radialGradient2254"
xlink:href="#linearGradient2248"
inkscape:collect="always" />
<linearGradient
gradientTransform="matrix(0.988373,0.000000,0.000000,0.988373,0.279002,0.278984)"
y2="37.959785"
x2="41.047836"
y1="20.105337"
x1="23.995985"
gradientUnits="userSpaceOnUse"
id="linearGradient2243"
xlink:href="#linearGradient4981"
inkscape:collect="always" />
<radialGradient
gradientTransform="matrix(1.693981,0,0,1.693981,-16.86529,-25.11111)"
gradientUnits="userSpaceOnUse"
r="12.30225"
fy="33.30225"
fx="24.30225"
cy="33.30225"
cx="24.30225"
id="radialGradient2239"
xlink:href="#linearGradient9647"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="28.394291"
x2="32.166405"
y1="16.285088"
x1="15.578875"
id="linearGradient7901"
xlink:href="#linearGradient7895"
inkscape:collect="always" />
<linearGradient
gradientTransform="translate(0,-2)"
gradientUnits="userSpaceOnUse"
y2="37.959785"
x2="41.047836"
y1="20.105337"
x1="23.995985"
id="linearGradient4987"
xlink:href="#linearGradient4981"
inkscape:collect="always" />
<linearGradient
gradientTransform="translate(0,-2)"
gradientUnits="userSpaceOnUse"
y2="47.374317"
x2="53.570126"
y1="12.503600"
x1="15.737001"
id="linearGradient2057"
xlink:href="#linearGradient11780"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient15762"
id="linearGradient15772"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.000000,0.000000,0.000000,-1.000000,31.72170,31.29079)"
x1="5.7365270"
y1="5.3855424"
x2="9.8940229"
y2="9.6507530" />
<linearGradient
id="linearGradient11014">
<stop
id="stop11016"
offset="0.0000000"
style="stop-color:#a80000;stop-opacity:1.0000000;" />
<stop
id="stop13245"
offset="0.0000000"
style="stop-color:#c60000;stop-opacity:1.0000000;" />
<stop
id="stop11018"
offset="1.0000000"
style="stop-color:#e50000;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient11780">
<stop
id="stop11782"
offset="0.0000000"
style="stop-color:#ff8b8b;stop-opacity:1.0000000;" />
<stop
id="stop11784"
offset="1.0000000"
style="stop-color:#ec1b1b;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient14236">
<stop
style="stop-color:#ed4040;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop14238" />
<stop
style="stop-color:#a40000;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop14240" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient15762">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop15764" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop15766" />
</linearGradient>
<linearGradient
id="linearGradient4981">
<stop
id="stop4983"
offset="0"
style="stop-color:#cc0000;stop-opacity:1;" />
<stop
id="stop4985"
offset="1.0000000"
style="stop-color:#b30000;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient7895"
inkscape:collect="always">
<stop
id="stop7897"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop7899"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.595238,0,14.875)"
r="15.75"
fy="36.75"
fx="25.125"
cy="36.75"
cx="25.125"
id="radialGradient21650"
xlink:href="#linearGradient21644"
inkscape:collect="always" />
<linearGradient
id="linearGradient21644"
inkscape:collect="always">
<stop
id="stop21646"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop21648"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient9647">
<stop
id="stop9649"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop9651"
offset="1"
style="stop-color:#dbdbdb;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient2248"
inkscape:collect="always">
<stop
id="stop2250"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop2252"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient2256">
<stop
id="stop2258"
offset="0"
style="stop-color:#ff0202;stop-opacity:1;" />
<stop
id="stop2260"
offset="1"
style="stop-color:#ff9b9b;stop-opacity:1;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient9647"
id="radialGradient2335"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.693981,0,0,1.693981,-16.86529,-23.715608)"
cx="24.30225"
cy="33.30225"
fx="24.30225"
fy="33.30225"
r="12.30225" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2256"
id="linearGradient2337"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-7.1723252e-7,-0.6044975)"
x1="21.75"
y1="15.80225"
x2="24.30225"
y2="35.05225" />
<radialGradient
r="9.6875"
fy="25.53125"
fx="17.3125"
cy="25.53125"
cx="17.3125"
gradientTransform="matrix(2.182912,0,0,0.7675402,-19.531098,16.887937)"
gradientUnits="userSpaceOnUse"
id="radialGradient3605"
xlink:href="#linearGradient3101-7"
inkscape:collect="always" />
<linearGradient
id="linearGradient3101-7">
<stop
id="stop3103-2"
style="stop-color:#000000;stop-opacity:1"
offset="0" />
<stop
id="stop3105-7"
style="stop-color:#000000;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
gradientTransform="matrix(2.182912,0,0,0.7675402,-13.50372,21.786089)"
gradientUnits="userSpaceOnUse"
xlink:href="#linearGradient3101"
id="radialGradient7200"
fy="25.53125"
fx="17.3125"
r="9.6875"
cy="25.53125"
cx="17.3125" />
<radialGradient
gradientTransform="matrix(1,0,0,0.351613,0,16.55413)"
gradientUnits="userSpaceOnUse"
xlink:href="#linearGradient3101"
id="radialGradient3107"
fy="25.53125"
fx="17.3125"
r="9.6875"
cy="25.53125"
cx="17.3125" />
<linearGradient
id="linearGradient3101">
<stop
id="stop3103"
offset="0"
style="stop-color:#000000;stop-opacity:1" />
<stop
id="stop3105"
offset="1"
style="stop-color:#000000;stop-opacity:0" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.21568627"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="8"
inkscape:cx="26.460609"
inkscape:cy="40.949854"
inkscape:current-layer="g2858"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1680"
inkscape:window-height="1028"
inkscape:window-x="1439"
inkscape:window-y="0"
inkscape:showpageshadow="false"
fill="#ef2929"
inkscape:window-maximized="1">
<inkscape:grid
id="GridFromPre046Settings"
type="xygrid"
originx="0px"
originy="0px"
spacingx="1px"
spacingy="1px"
color="#0000ff"
empcolor="#0000ff"
opacity="0.2"
empopacity="0.4"
empspacing="4" />
</sodipodi:namedview>
<metadata
id="metadata1311">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Rodney Dawes</dc:title>
</cc:Agent>
</dc:creator>
<dc:contributor>
<cc:Agent>
<dc:title>Jakub Steiner, Garrett LeSage</dc:title>
</cc:Agent>
</dc:contributor>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
<dc:title></dc:title>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Attribution" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Shadow">
<path
inkscape:r_cy="true"
inkscape:r_cx="true"
transform="matrix(1.070555,0,0,0.525,-0.892755,22.5)"
d="M 41 40 A 17.142857 8.5714283 0 1 1 6.7142868,40 A 17.142857 8.5714283 0 1 1 41 40 z"
sodipodi:ry="8.5714283"
sodipodi:rx="17.142857"
sodipodi:cy="40"
sodipodi:cx="23.857143"
id="path6548"
style="opacity:0.6;color:#000000;fill:url(#radialGradient3976);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
sodipodi:type="arc" />
</g>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<g
id="g4006"
style="fill:#f57900;stroke:#8f5902">
<path
transform="matrix(0.920488,0,0,0.920488,2.368532,0.97408)"
d="m 46.857143,23.928572 c 0,12.899794 -10.457349,23.357143 -23.357143,23.357143 -12.899794,0 -23.3571434,-10.457349 -23.3571434,-23.357143 0,-12.899794 10.4573494,-23.3571437 23.3571434,-23.3571437 12.899794,0 23.357143,10.4573497 23.357143,23.3571437 z"
sodipodi:ry="23.357143"
sodipodi:rx="23.357143"
sodipodi:cy="23.928572"
sodipodi:cx="23.5"
id="path1314"
style="fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:#8f5902;stroke-width:1.08637999999999990;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
sodipodi:type="arc"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
transform="matrix(0.85448271,0,0,0.85448271,1.8600011,0.24061972)"
d="m 49.901535,26.635273 a 23.991123,23.991123 0 1 1 -47.9822464,0 23.991123,23.991123 0 1 1 47.9822464,0 z"
sodipodi:ry="23.991123"
sodipodi:rx="23.991123"
sodipodi:cy="26.635273"
sodipodi:cx="25.910412"
id="path3560"
style="opacity:0.35;fill:none;stroke:#ffffff;stroke-width:1.1702975;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
sodipodi:type="arc"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
style="opacity:0.25;fill:#ffffff;stroke:none;stroke-width:0.99999899000000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 24 3 C 12.954305 3 4 11.954305 4 23 C 4 24.686052 4.2321382 26.310816 4.625 27.875 C 7.8289734 32.668264 17.878522 27.754856 24.84375 22.28125 C 32.8518 15.988144 42.685779 30.640597 43.96875 23.71875 C 43.977181 23.480132 44 23.240675 44 23 C 44 11.954305 35.045695 3 24 3 z "
id="path3684" />
</g>
<g
transform="matrix(0.38916735,0,0,0.38916735,-17.021226,9.4547752)"
id="g2680">
<g
transform="matrix(0.2204089,0,0,0.2436455,61.760877,-3.3704482)"
id="g2858">
<g
style="stroke:#ffffff;stroke-opacity:1;stroke-width:16.63263409"
id="g2787"
transform="matrix(0.965926,-0.258819,0.258819,0.965926,253.9719,6.7086436)">
<path
style="fill:none;stroke:#ffffff;stroke-width:1.49999997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 13,18 9.037685,-2.464823 M 26.038958,14.443921 35,12"
id="path4404"
inkscape:connector-curvature="0"
transform="matrix(11.261032,3.0173834,-2.7296139,10.187062,-300.34003,-176.33132)"
sodipodi:nodetypes="cccc" />
</g>
<path
style="fill:none;stroke:#ffffff;stroke-width:22.17684937;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 198.02648,93.408547 0,189.835623"
id="path2794"
inkscape:connector-curvature="0" />
<g
id="g4398">
<path
inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:11.875;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 279.63444,146.14066 326.26756,40.676429 372.90068,146.14066"
id="path2850"
sodipodi:nodetypes="ccc" />
<path
sodipodi:type="arc"
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="path2852"
sodipodi:cx="65"
sodipodi:cy="188"
sodipodi:rx="57"
sodipodi:ry="57"
d="M 122,188 A 57,57 0 1 1 8,188"
transform="matrix(1.0226561,0,0,0.92512488,259.79491,-38.329236)"
sodipodi:start="0"
sodipodi:end="3.1415927"
sodipodi:open="true" />
</g>
<path
style="fill:none;stroke:#ffffff;stroke-width:33.26527405;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 279.63443,288.51738 -163.21591,0"
id="path2846"
inkscape:connector-curvature="0" />
<use
x="0"
y="0"
xlink:href="#g4398"
id="use4402"
transform="translate(-256.48216,63.278541)"
width="48"
height="48" />
<path
sodipodi:type="arc"
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.49999996;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path5174"
sodipodi:cx="24"
sodipodi:cy="15"
sodipodi:rx="2"
sodipodi:ry="2"
d="m 26,15 a 2,2 0 1 1 -4,0 2,2 0 1 1 4,0 z"
transform="matrix(11.65828,0,0,10.546424,-81.772234,-85.880653)" />
<g
transform="matrix(-0.28610498,-0.87380513,1.0677587,-0.2341353,125.50279,21.705825)"
id="g5176"
style="stroke:#ffffff;stroke-opacity:1;stroke-width:16.63263415">
<path
sodipodi:nodetypes="cc"
transform="matrix(11.261032,3.0173834,-2.7296139,10.187062,-300.34003,-176.33132)"
inkscape:connector-curvature="0"
id="path5178"
d="m 26.038958,14.443921 2.255573,-0.615156"
style="fill:none;stroke:#ffffff;stroke-width:1.49999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Error Box" />
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="Glossy Shine" />
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

66
site/wait.svg Normal file
View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0"
width="48"
height="48"
id="svg1800">
<defs
id="defs3">
<linearGradient
id="linearGradient3101">
<stop
id="stop3103"
style="stop-color:#000000;stop-opacity:1"
offset="0" />
<stop
id="stop3105"
style="stop-color:#000000;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
cx="17.3125"
cy="25.53125"
r="9.6875"
fx="17.3125"
fy="25.53125"
id="radialGradient3107"
xlink:href="#linearGradient3101"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.351613,0,16.55413)" />
</defs>
<g
id="layer1">
<path
d="M 27,25.53125 C 27,27.41247 22.662759,28.9375 17.3125,28.9375 C 11.962241,28.9375 7.625,27.41247 7.625,25.53125 C 7.625,23.65003 11.962241,22.125 17.3125,22.125 C 22.662759,22.125 27,23.65003 27,25.53125 z"
transform="matrix(2.182912,0,0,2.182912,-13.50372,-14.35012)"
id="path3099"
style="opacity:0.40909089;fill:url(#radialGradient3107);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.10533953;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
d="M 46.138718,23.42804 C 46.138718,35.143769 36.285088,44.641244 24.130018,44.641244 C 11.974949,44.641244 2.1213187,35.143769 2.1213188,23.42804 C 2.1213187,11.712311 11.974949,2.2148362 24.130018,2.2148362 C 36.285088,2.2148362 46.138718,11.712311 46.138718,23.42804 L 46.138718,23.42804 z"
transform="matrix(0.94463,0,0,0.980053,1.504174,-1.556912)"
id="path1650"
style="opacity:1;fill:#edd400;fill-opacity:1;fill-rule:nonzero;stroke:#c4a000;stroke-width:0.98214942;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
d="M 46.138718,23.42804 C 46.138718,35.143769 36.285088,44.641244 24.130018,44.641244 C 11.974949,44.641244 2.1213187,35.143769 2.1213188,23.42804 C 2.1213187,11.712311 11.974949,2.2148362 24.130018,2.2148362 C 36.285088,2.2148362 46.138718,11.712311 46.138718,23.42804 L 46.138718,23.42804 z"
transform="matrix(0.914086,0,0,0.948364,2.380576,-0.905815)"
id="path3392"
style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#fce94f;stroke-width:0.98214942;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
d="M 21.464926,10.373268 C 21.336952,10.373268 21.230316,10.547762 21.230316,10.757175 L 22.295085,25.197999 C 22.295085,25.407412 22.401721,25.581906 22.529695,25.581907 C 22.529695,25.581907 23.370516,25.59381 24.063684,25.581907 C 24.292022,25.577986 24.361898,25.602219 24.568998,25.581907 C 25.262166,25.59381 26.102987,25.581907 26.102987,25.581907 C 26.230961,25.581907 26.337597,25.407412 26.337597,25.197999 L 27.402366,10.757175 C 27.402366,10.547762 27.29573,10.402799 27.167755,10.402799 L 24.587044,10.402799 C 24.577532,10.400862 24.578842,10.373268 24.568998,10.373268 L 21.464926,10.373268 z"
id="rect1872"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.12249994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
<path
d="M -11.875,34.0625 C -11.875,36.168086 -13.917701,37.875 -16.4375,37.875 C -18.957299,37.875 -21,36.168086 -21,34.0625 C -21,31.956914 -18.957299,30.25 -16.4375,30.25 C -13.917701,30.25 -11.875,31.956914 -11.875,34.0625 z"
transform="matrix(0.504864,0,0,0.604182,32.65935,9.608845)"
id="path2062"
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.12249994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
d="M 43.676426,20.47678 C 43.676426,31.307396 37.624257,16.170581 25.001688,20.863168 C 12.279172,25.592912 4.4350535,31.307396 4.4350535,20.47678 C 4.4350535,9.6461627 13.22512,0.85609769 24.05574,0.85609769 C 34.886359,0.85609769 43.676426,9.6461627 43.676426,20.47678 z"
id="path3068"
style="fill:#fffeff;fill-opacity:0.21390375;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -7,7 +7,7 @@
% my $inter_header = begin
% my $group = shift;
<tr><th colspan="11"><%= $group || 'Club management accounts' %></th>
<th colspan="2"><a href="/debit?group=<%= $group %>">Charge'm all</a></th></tr>
<th colspan="2"><a href="/debit?group=<%= $group %>"><img class="icon" src="/add-debit.svg" alt="Charge">all</a></th></tr>
% end
% while ( my $account = $accounts->next ) {
% my $bal = $account->balance;
@ -18,24 +18,26 @@
% }
% my $u = $account->ID;
<tr><th><a href="/account/<%= $u %>"><%= $u %></a></th>
<td class="even_until"><%= $bal->even_until // "never" %></td><td class="number"><%== money $bal->arrears %></td><td><a href="<%= $u %>/debits">list</td><td><a href="<%= $u %>/out">Charge</a></td>
<td class="even_until"><%= $bal->even_until // "never" %></td><td class="number"><%== money $bal->arrears %></td><td><a href="<%= $u %>/debits"><img class="icon" alt="List" src="/list.svg" alt="List"></td><td><a title="Add a debit" href="<%= $u %>/out"><img class="icon" src="/add-debit.svg" alt="Charge"></a></td>
<td class="centered">
% my $which = ($bal->arrears && 1) + ($bal->available && 1);
% if ( $which == 2 ) {
<a class="transfer-btn" href="<%= $u %>/transfer">C&hArr;D!</a>
<a href="<%= $u %>/transfer"><img class="icon" src="/transfer.svg"></a>
% }
% elsif ( $which ) {
<span style="background-color:rgba(224,224,0,0.4);">&nbsp;N/A&nbsp;</span>
<%== $bal->arrears ? q{} : q{&nbsp;} %>
<img class="icon" src="/wait.svg" style="cursor:not-allowed;">
<%== $bal->available ? q{} : q{&nbsp;} %>
% }
% else {
<span style="background-color:rgba(0,224,0,0.4);">&nbsp;N/A&nbsp;</span>
<img class="icon" src="/even.svg" style="cursor:not-allowed;">
% }
</td><td class="number"><%== money $bal->available %></td><td><a href="<%= $u %>/credits">list</a></td><td><a href="<%= $u %>/in">Credit</a></td><td class="number"><%== money $bal->earned %></td><td class="number"><%== money $bal->promised %></td><td><a href="<%= $u %>/history">History</a></td><td><a href="<%= $u %>/report">Report</a></td></tr>
</td><td class="number"><%== money $bal->available %></td><td><a href="<%= $u %>/credits"><img class="icon" alt="List" src="/list.svg" alt="List"></a></td><td><a title="Add a credit" href="<%= $u %>/in"><img class="icon" src="/add-credit.svg" alt="Credit"></a></td><td class="number"><%== money $bal->earned %></td><td class="number"><%== money $bal->promised %></td><td><a href="<%= $u %>/history">History</a></td><td><a href="<%= $u %>/report">Report</a></td></tr>
% } # while
</table>
<p style="text-align:center;"><a href="/account/">Create account</a> &sdot; <a href="/bankStatement">Reconstructed bank statement</a></p>
<div class="help">
% stash links => [ '/account' => "Create account", '/bankStatement' => "Reconstructed bank statement" ];
% my $help = begin
<h2>Column explanation</h2>
<dl>
<dt>Even till:</dt>
@ -51,4 +53,5 @@
<dt>Promised:</dt>
<dd><p>Unpaid or not fully paid debits targetting credits of that account.</p></dd>
</dl>
</div>
% end
% stash help => $help;

View File

@ -0,0 +1,35 @@
% title $name ? "Account $name" : "Create account";
% my %r;
% $r{ID} = begin
<input id="ID" name="ID" value="<%= $account->ID %>">
% end
% $r{type} = begin
<input id="type" name="type" value="<%= $account->type %>"> (<%= join(", ", @$types) %> or a new?)
% end
% $r{altId} = begin
<input id="altId" name="altId" value="<%= $account->altId %>">
% end
% $r{IBAN} = begin
<input id="IBAN" name="IBAN" value="<%= $account->IBAN %>">
% end
<form method="post">
<dl class="upsert">
% for my $f ( $account->result_source->columns ) {
% my $renderer = $r{$f} // do {
% my $value = $account->$f // next;
% begin
<%= $value %>
% end
% };
<dt><label for="<%= $f %>"><%= $f %>: </label></dt>
<dd><%= $renderer->() %></dd>
% }
</dl>
<button type="submit">Submit</button>
</form>

View File

@ -90,12 +90,13 @@ oops
% if ( $credits->count() ) {
<p>Check credits you want to <strong>pay this debit</strong> with.</p>
<table>
<tr><th>S</th><th>date</th><th>purpose</th><th>to spend</th></tr>
<tr><th>S</th><th>date</th><th>purpose</th><th>to spend</th><th>note</th></tr>
% while ( my $d = $credits->next ) {
<tr><td><input type="checkbox" name="payWith" value="<%= $d->credId %>"></td>
<td><%= $d->date %></td>
<td><%== nl2br $d->purpose %></td>
<td><%== money $d->difference %></td>
<td><input type="text" name="note[<%= $d->credId %>]"></td>
</tr>
% }
</table>

View File

@ -17,6 +17,33 @@
% }
<%= content %>
<p style="text-align:center;"><a href="<%= url_for "home" %>">Back home Account List</p>
</body>
</html>
<p id="bottommenu"><a href="<%= url_for "home" %>">Overview</a>
% if ( my $links = stash 'links' ) {
% while ( my ($link, $text) = splice @$links, 0, 2 ) {
| <a href="<%= url_for $link %>"><%= $text %></a>
% }
% }
% my $help = stash 'help';
% if ( defined $help ) {
| <a href="#help">Help</a>
% }
% my $sql = sql_trace;
% if ( defined $$sql ) {
| <a href="#sql">SQL</a>
% }
</p>
% if ( defined $help ) {
<div class="targettable" id="help">
%== $help->()
</div>
% }
% if ( defined $sql ) {
<div class="targettable" id="sql">
<p>In case you are interested, this is what is executed in the database in order to process your request and to render this page. All essential logic and consistency checking is done on database level via triggers and views, so you could execute these SQL statements e.g. in the console and would get the same results. Note that, if any POST requests redirected here, SQL commands of those come first:</p>
<textarea rows="5" style="width:100%;border:1px inset lightgrey;" readonly="readonly">
%== $$sql
</textarea></div>
% }
<p id="footer">Copyright 2016 Florian L. Heß | Treasure DB licensed under General Public License, version 3 | <a href="https://github.com/flowdy/treasuredb">Fork me on GitHub</a></p>
</body></html>

View File

@ -14,6 +14,10 @@
User id: <input name="user" type="text" placeholder="user id or email" value="<%= param('user') %>"><br>
Password: <input name="password" type="password"><br>
<input type="submit" value="Login">
% if ( my $token = param 'token' ) {
Repeat: <input name="samepassword" type="password"><br>
<input type="hidden" name="token" value="<%= $token %>"><br>
% }
<button type="submit">Login</button>
</p></form>