diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9fb5bb6430275a96d87d0af36b3d0e28139daace..56064bcb1b6cdeaa2a289d4b51d8ef2f51fa7b62 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,7 +2,7 @@ image: docker:20.10.9 variables: DOCKER_TLS_CERTDIR: "/certs" - IMAGE_VER: 0.12.1 + IMAGE_VER: 0.13.0 services: - docker:20.10.9-dind diff --git a/Dockerfile b/Dockerfile index 66885ddc2e35534be583c9470e8ec0e27b880e86..87713c3148a1113b5a7f55b019af6c8341877c59 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,9 +13,11 @@ RUN apt-get update && apt-get install -y \ libio-socket-ssl-perl \ libjson-perl \ libyaml-perl \ + libpng-dev \ libyaml-dev RUN cpanm \ + Image::PNG::QRCode \ Mojolicious \ Mojo::Pg \ Mojo::Redis \ diff --git a/lib/CF2022.pm b/lib/CF2022.pm index 8c76ef8a280b06e68aef7779c0aba653c196269c..463b55bb31250c57fe6c0227a41d127fb628a2e1 100644 --- a/lib/CF2022.pm +++ b/lib/CF2022.pm @@ -79,6 +79,7 @@ sub startup { # Router my $r = $self->routes; $r->get('/')->to(cb => sub { shift->redirect_to('/api.html');}); + $r->get('/api/orders/:id/payment.png')->to('Orders#qr'); } diff --git a/lib/CF2022/Controller/Orders.pm b/lib/CF2022/Controller/Orders.pm index efd7b52139a845e27273f618176ba68dcef354c5..56f9a11c65a28473c04214522fe5557ca968c96b 100644 --- a/lib/CF2022/Controller/Orders.pm +++ b/lib/CF2022/Controller/Orders.pm @@ -2,12 +2,16 @@ package CF2022::Controller::Orders; use Mojo::Base 'Mojolicious::Controller'; use Mojo::UserAgent; use Mojo::Asset::File; +use Image::PNG::QRCode 'qrpng'; use constant MAIN_PRODUCTS => qr/^(1|2|3)$/; # typy akreditace use constant NONFREE_PRODUCTS => qr/^(1)$/; # akreditace vyzadujici token use constant SUBSIDY_PRODUCTS => qr/^(58)$/; # prispevkove polozky use constant FALLBACK_PRODUCT => 2; # fallback akreditace +use constant TPL_VS => '%d%07d'; +use constant TPL_PAYMENT => 'SPD*1.0*ACC:%s*AM:%f*MSG:%s, %s*X-ID:%s*X-VS:%d*X-SS:%d*X-KS:%d'; + use feature 'signatures'; no warnings qw{ experimental::signatures }; @@ -167,6 +171,14 @@ sub create ($c ) { order_id => $rc->json->{code}, }); + $rc->json->{payment_request} => { + account => $c->cfg->{payment_account}, + amount => $order->response->{payments}[0]{amount}, + vs => sprintf(TPL_VS, $c->cfg->{payment_vs_prefix}, $order->id ), + ss => $c->cfg->{payment_ss}, + ks => $c->cfg->{payment_ks}, + }; + $c->render( status => 201, json => $rc->json, @@ -206,7 +218,7 @@ sub get ($c ) { return $c->error(404, 'NOT FOUND') if ! $order; - # datas z pretixu + # data z pretixu (kvuli stavu, jinak je to v databazi???) $c->app->log->error($order->api . $order->order_id); my $ua = Mojo::UserAgent->new; @@ -222,6 +234,31 @@ sub get ($c ) { ); } +sub qr ($c) { + my $order = $c->schema->resultset('Order')->find({ + id => $c->stash->{id}, + deleted => undef, + }); + + return $c->error(404, 'NOT FOUND') if ! $order; + + my $payment = sprintf(TPL_PAYMENT, + $c->cfg->{payment_iban}, + $order->response->{payments}[0]{amount}, + $c->cfg->{payment_msg}, + $order->request->{positions}[0]{attendee_name}, + $order->order_id, + sprintf(TPL_VS, $c->cfg->{payment_vs_prefix}, $order->id ), + $c->cfg->{payment_ss}, + $c->cfg->{payment_ks}, + ); + + my $png = qrpng (text => $payment, level => 4); + + $c->res->headers->content_type('image/png'); + $c->render( data => $png ); +} + sub _upload_photo ($c, $username ) { my $ua = Mojo::UserAgent->new;