feat(pdf): Send selfservicelink for generation

This commit is contained in:
Nicolai Ort 2025-04-17 21:13:15 +02:00
parent 10824b5d9b
commit 01e77a97f3
Signed by: niggl
GPG Key ID: 13AFA55AF62F269F
3 changed files with 184 additions and 170 deletions

View File

@ -100,6 +100,7 @@ class DocumentServer {
first_name: runners[i].firstname, first_name: runners[i].firstname,
middle_name: runners[i].middlename, middle_name: runners[i].middlename,
last_name: runners[i].lastname, last_name: runners[i].lastname,
self_service_link: runners[i].selfserviceLink,
group: { group: {
id: runners[i].group.id, id: runners[i].group.id,
name: runners[i].group.name, name: runners[i].group.name,

View File

@ -1,175 +1,180 @@
<script> <script>
import { _ } from "svelte-i18n"; import { _ } from "svelte-i18n";
import { import {
DonationService, DonationService,
RunnerTeamService, RunnerTeamService,
RunnerOrganizationService, RunnerOrganizationService,
} from "@odit/lfk-client-js"; RunnerService
import { init } from "@paralleldrive/cuid2"; } from "@odit/lfk-client-js";
import toast from "svelte-french-toast"; import { init } from "@paralleldrive/cuid2";
import DocumentServer from "./DocumentServer"; import toast from "svelte-french-toast";
const createId = init({ length: 10, fingerprint: "lfk-frontend" }); import DocumentServer from "./DocumentServer";
const documentServer = new DocumentServer( const createId = init({ length: 10, fingerprint: "lfk-frontend" });
config.baseurl_documentserver, const documentServer = new DocumentServer(
config.documentserver_key config.baseurl_documentserver,
); config.documentserver_key
);
export let certificates_show = false; export let certificates_show = false;
export let generate_runners = []; export let generate_runners = [];
export let generate_orgs = []; export let generate_orgs = [];
export let generate_teams = []; export let generate_teams = [];
function generateCertificates(locale) { function generateCertificates(locale) {
if (generate_orgs.length > 0) { if (generate_orgs.length > 0) {
generateOrgCertificates(locale); generateOrgCertificates(locale);
} else if (generate_teams.length > 0) { } else if (generate_teams.length > 0) {
generateTeamCertificates(locale); generateTeamCertificates(locale);
} else { } else {
generateRunnerCertificates(locale); generateRunnerCertificates(locale);
} }
} }
function download(blob, fileName) { function download(blob, fileName) {
const url = window.URL.createObjectURL(blob); const url = window.URL.createObjectURL(blob);
let a = document.createElement("a"); let a = document.createElement("a");
a.href = url; a.href = url;
a.download = fileName; a.download = fileName;
document.body.appendChild(a); document.body.appendChild(a);
a.click(); a.click();
a.remove(); a.remove();
toast.dismiss(); toast.dismiss();
toast.success($_("pdf-successfully-generated")); toast.success($_("pdf-successfully-generated"));
} }
async function generateRunnerCertificates(locale) { async function generateRunnerCertificates(locale) {
toast.loading($_("generating-pdf")); toast.loading($_("generating-pdf"));
const current_donations = const current_donations =
(await DonationService.donationControllerGetAll()) || []; (await DonationService.donationControllerGetAll()) || [];
let certificateRunners = []; let certificateRunners = [];
for (let runner of generate_runners) { for (let runner of generate_runners) {
runner.distanceDonations = const linkRunner = await RunnerService.runnerControllerGetOne(runner.id)
current_donations.filter((d) => d.runner?.id == runner.id) || []; linkRunner.distanceDonations =
certificateRunners.push(runner); current_donations.filter((d) => d.runner?.id == runner.id) || [];
} certificateRunners.push(linkRunner);
documentServer }
.generateCertificates(certificateRunners, locale) documentServer
.then((blob) => { .generateCertificates(certificateRunners, locale)
let fileName = `${$_("certificates")}-${locale}.pdf`; .then((blob) => {
if (generate_runners.length == 1) { let fileName = `${$_("certificates")}-${locale}.pdf`;
fileName = `${$_("certificates")}_${ if (generate_runners.length == 1) {
generate_runners[0].firstname fileName = `${$_("certificates")}_${
}_${generate_runners[0].lastname}-${locale}-${createId()}.pdf`; generate_runners[0].firstname
} }_${generate_runners[0].lastname}-${locale}-${createId()}.pdf`;
download(blob, fileName); }
}) download(blob, fileName);
.catch((err) => {}); })
} .catch((err) => {});
}
async function generateTeamCertificates(locale) { async function generateTeamCertificates(locale) {
toast.loading($_("generating-pdfs")); toast.loading($_("generating-pdfs"));
let count = 0; let count = 0;
const current_donations = const current_donations =
(await DonationService.donationControllerGetAll()) || []; (await DonationService.donationControllerGetAll()) || [];
for (const t of generate_teams) { for (const t of generate_teams) {
const runners = await RunnerTeamService.runnerTeamControllerGetRunners( const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
t.id t.id,
); true
let certificateRunners = []; );
for (let runner of runners) { let certificateRunners = [];
runner.distanceDonations = for (let runner of runners) {
current_donations.filter((d) => d.runner?.id == runner.id) || []; runner.distanceDonations =
certificateRunners.push(runner); current_donations.filter((d) => d.runner?.id == runner.id) || [];
} certificateRunners.push(runner);
documentServer }
.generateCertificates(certificateRunners, locale) documentServer
.then((blob) => { .generateCertificates(certificateRunners, locale)
count++; .then((blob) => {
download( count++;
blob, download(
`${$_("certificates")}_${t.name}-${locale}-${createId()}.pdf` blob,
); `${$_("certificates")}_${t.name}-${locale}-${createId()}.pdf`
}) );
.catch((err) => {}); })
} .catch((err) => {});
} }
}
async function generateOrgCertificates(locale) { async function generateOrgCertificates(locale) {
toast.loading($_("generating-pdfs")); toast.loading($_("generating-pdfs"));
const current_donations = const current_donations =
(await DonationService.donationControllerGetAll()) || []; (await DonationService.donationControllerGetAll()) || [];
let count = 0; let count = 0;
let count_orgs = 0; let count_orgs = 0;
for (const o of generate_orgs) { for (const o of generate_orgs) {
count_orgs++; count_orgs++;
let count = 0; let count = 0;
let runners = let runners =
await RunnerOrganizationService.runnerOrganizationControllerGetRunners( await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
o.id, o.id,
true true,
); true
let certificateRunners = []; );
for (let runner of runners) { let certificateRunners = [];
runner.distanceDonations = for (let runner of runners) {
current_donations.filter((d) => d.runner?.id == runner.id) || []; runner.distanceDonations =
certificateRunners.push(runner); current_donations.filter((d) => d.runner?.id == runner.id) || [];
} certificateRunners.push(runner);
await documentServer }
.generateCertificates(certificateRunners, locale) await documentServer
.then((blob) => { .generateCertificates(certificateRunners, locale)
download( .then((blob) => {
blob, download(
`${$_("certificates")}_${o.name}-${locale}-${createId()}.pdf` blob,
); `${$_("certificates")}_${o.name}-${locale}-${createId()}.pdf`
}) );
.catch((err) => {}); })
for (const t of o.teams) { .catch((err) => {});
count++; for (const t of o.teams) {
let runners = await RunnerTeamService.runnerTeamControllerGetRunners( count++;
t.id let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
); t.id,
let certificateRunners = []; true
for (let runner of runners) { );
runner.distanceDonations = let certificateRunners = [];
current_donations.filter((d) => d.runner?.id == runner.id) || []; for (let runner of runners) {
certificateRunners.push(runner); runner.distanceDonations =
} current_donations.filter((d) => d.runner?.id == runner.id) || [];
await documentServer certificateRunners.push(runner);
.generateCertificates(certificateRunners, locale) }
.then((blob) => { await documentServer
download( .generateCertificates(certificateRunners, locale)
blob, .then((blob) => {
`${$_("certificates")}_${o.name}_${ download(
t.name blob,
}-${locale}-${createId()}.pdf` `${$_("certificates")}_${o.name}_${
); t.name
if ( }-${locale}-${createId()}.pdf`
count === o.teams.length && );
count_orgs === generate_orgs.length if (
) { count === o.teams.length &&
toast.dismiss(); count_orgs === generate_orgs.length
toast.success($_("pdfs-successfully-generated")); ) {
} toast.dismiss();
}) toast.success($_("pdfs-successfully-generated"));
.catch((err) => {}); }
} })
} .catch((err) => {});
} }
}
}
</script> </script>
{#if certificates_show} {#if certificates_show}
<button <button
on:click={() => { on:click={() => {
generateCertificates("de"); generateCertificates("de");
}} }}
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:w-auto sm:text-sm mb-1 lg:mb-0" class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:w-auto sm:text-sm mb-1 lg:mb-0"
> >
{$_("generate-runner-certificates")}: DE {$_("generate-runner-certificates")}: DE
</button> </button>
<button <button
on:click={() => { on:click={() => {
generateCertificates("en"); generateCertificates("en");
}} }}
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:w-auto sm:text-sm mb-1 lg:mb-0" class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:w-auto sm:text-sm mb-1 lg:mb-0"
> >
{$_("generate-runner-certificates")}: EN {$_("generate-runner-certificates")}: EN
</button> </button>
{/if} {/if}

View File

@ -491,10 +491,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@odit/lfk-client-js@npm:1.1.3": "@odit/lfk-client-js@npm:1.2.4":
version: 1.1.3 version: 1.2.4
resolution: "@odit/lfk-client-js@npm:1.1.3" resolution: "@odit/lfk-client-js@npm:1.2.4"
checksum: 10c0/c5108400dc40b6eb5d4c467238c178779454bf46301559034fbfd2d7666e863af5d5df8208b501ec6dad1b97994e2005d879f2d5b5f3e0439f01f34ecd97f895 checksum: 10c0/503b3eec7fe66f8d42b137660fd5a7cda2f067c6c79fbe3c15613fb7a06284adb3e186a645f8e48c6de015fb2c8c0a42074551201fd0244215e8ba444dfe17e2
languageName: node languageName: node
linkType: hard linkType: hard
@ -503,7 +503,7 @@ __metadata:
resolution: "@odit/lfk-frontend@workspace:." resolution: "@odit/lfk-frontend@workspace:."
dependencies: dependencies:
"@fontsource/athiti": "npm:^5.2.5" "@fontsource/athiti": "npm:^5.2.5"
"@odit/lfk-client-js": "npm:1.1.3" "@odit/lfk-client-js": "npm:1.2.4"
"@odit/license-exporter": "npm:0.2.0" "@odit/license-exporter": "npm:0.2.0"
"@paralleldrive/cuid2": "npm:2.2.2" "@paralleldrive/cuid2": "npm:2.2.2"
"@sveltejs/vite-plugin-svelte": "npm:2.1.1" "@sveltejs/vite-plugin-svelte": "npm:2.1.1"
@ -513,6 +513,7 @@ __metadata:
bwip-js: "npm:3.4.0" bwip-js: "npm:3.4.0"
check-password-strength: "npm:2.0.10" check-password-strength: "npm:2.0.10"
csvtojson: "npm:2.0.10" csvtojson: "npm:2.0.10"
html5-qrcode: "npm:^2.3.8"
localforage: "npm:1.10.0" localforage: "npm:1.10.0"
marked: "npm:4.3.0" marked: "npm:4.3.0"
postcss: "npm:8.5.3" postcss: "npm:8.5.3"
@ -2032,6 +2033,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"html5-qrcode@npm:^2.3.8":
version: 2.3.8
resolution: "html5-qrcode@npm:2.3.8"
checksum: 10c0/3d7d0b3687e41a6fc0a06345f67e89ad3c7c00a3d0d8846d6fd31985e1ed2ac1c310e625f0b650dbc689f6b83469e3378417e7431ae5a9194178f1172bf6a93a
languageName: node
linkType: hard
"http-cache-semantics@npm:^4.1.1": "http-cache-semantics@npm:^4.1.1":
version: 4.1.1 version: 4.1.1
resolution: "http-cache-semantics@npm:4.1.1" resolution: "http-cache-semantics@npm:4.1.1"