diff --git a/Rechnung1.png b/Rechnung1.png new file mode 100644 index 0000000..eec1b25 Binary files /dev/null and b/Rechnung1.png differ diff --git a/app/Domains/Rechnung/Actions/GeneratePdf/GeneratePdfCommand.php b/app/Domains/Rechnung/Actions/GeneratePdf/GeneratePdfCommand.php new file mode 100644 index 0000000..3a4b344 --- /dev/null +++ b/app/Domains/Rechnung/Actions/GeneratePdf/GeneratePdfCommand.php @@ -0,0 +1,94 @@ +request->rechnungsnummer !== '' + ? $this->request->rechnungsnummer + : date('Y') . '-' . str_pad(random_int(1, 999), 3, '0', STR_PAD_LEFT); + + $positionen = array_values(array_filter( + $this->request->positionen, + fn($p) => !empty($p['bezeichnung']) + )); + + $netto = array_sum(array_map( + fn($p) => (float) ($p['menge'] ?? 0) * (float) ($p['einzelpreis'] ?? 0), + $positionen + )); + $mwst = $netto * $this->request->mwstSatz / 100; + $brutto = $netto + $mwst; + + $pdf = Pdf::loadView('pdf.rechnung', [ + 'rechnungsnummer' => $rechnungsnummer, + 'organisation' => $this->request->organisation, + 'anrede' => $this->request->anrede, + 'vorname' => $this->request->vorname, + 'nachname' => $this->request->nachname, + 'adresse' => $this->request->adresse, + 'plz' => $this->request->plz, + 'ort' => $this->request->ort, + 'email' => $this->request->email, + 'iban' => $this->request->iban, + 'bic' => $this->request->bic, + 'rechnungsdatum' => $this->request->rechnungsdatum, + 'zahlungsziel' => $this->request->zahlungsziel, + 'rechnungsdatumFormatiert' => $this->formatDate($this->request->rechnungsdatum), + 'zahlungszielFormatiert' => $this->formatDate($this->request->zahlungsziel), + 'positionen' => $positionen, + 'mwstSatz' => $this->request->mwstSatz, + 'netto' => $netto, + 'mwst' => $mwst, + 'brutto' => $brutto, + 'absenderEmail' => $this->request->absenderEmail, + 'absenderTelefon' => $this->request->absenderTelefon, + 'kohteDataUri' => $this->imageToDataUri(storage_path('app/elemente/kohte.png')), + 'logoDataUri' => $this->imageToDataUri(public_path('wbm.png')), + ]); + + $pdf->setPaper('A4', 'portrait'); + $pdf->render(); + + $pdfContent = $pdf->output(); + + return new GeneratePdfResponse( + pdfContent: $pdfContent, + filename: 'rechnung-' . $rechnungsnummer . '.pdf', + ); + } + + private function formatDate(string $date): string + { + if (!$date) { + return '—'; + } + + $ts = strtotime($date); + + return $ts ? date('d.m.Y', $ts) : $date; + } + + + private function imageToDataUri(string $path): string + { + if (!file_exists($path)) { + return ''; + } + + $mime = match (strtolower(pathinfo($path, PATHINFO_EXTENSION))) { + 'jpg', 'jpeg' => 'image/jpeg', + 'svg' => 'image/svg+xml', + default => 'image/png', + }; + + return 'data:' . $mime . ';base64,' . base64_encode(file_get_contents($path)); + } + +} diff --git a/app/Domains/Rechnung/Actions/GeneratePdf/GeneratePdfRequest.php b/app/Domains/Rechnung/Actions/GeneratePdf/GeneratePdfRequest.php new file mode 100644 index 0000000..a5bff61 --- /dev/null +++ b/app/Domains/Rechnung/Actions/GeneratePdf/GeneratePdfRequest.php @@ -0,0 +1,49 @@ +all()); + $command = new GeneratePdfCommand($pdfRequest); + $result = $command->execute(); + + return response($result->pdfContent, 200, [ + 'Content-Type' => 'application/pdf', + 'Content-Disposition' => 'inline; filename="' . $result->filename . '"', + ]); + } +} diff --git a/app/Domains/Rechnung/Routes/web.php b/app/Domains/Rechnung/Routes/web.php index aecab1b..e8bb622 100644 --- a/app/Domains/Rechnung/Routes/web.php +++ b/app/Domains/Rechnung/Routes/web.php @@ -1,6 +1,8 @@ name('rechnung'); +Route::post('/rechnung/pdf', GeneratePdfController::class)->name('rechnung.pdf'); diff --git a/app/Domains/Rechnung/Views/Rechnung.vue b/app/Domains/Rechnung/Views/Rechnung.vue index f8efa42..a4d155d 100644 --- a/app/Domains/Rechnung/Views/Rechnung.vue +++ b/app/Domains/Rechnung/Views/Rechnung.vue @@ -1,54 +1,1133 @@ diff --git a/composer.json b/composer.json index 2cbcd47..efcb705 100644 --- a/composer.json +++ b/composer.json @@ -7,6 +7,7 @@ "license": "MIT", "require": { "php": "^8.5", + "barryvdh/laravel-dompdf": "^3.1", "inertiajs/inertia-laravel": "^2.0", "laravel/framework": "^13.0" }, diff --git a/composer.lock b/composer.lock index 4d56531..1cc69a4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,85 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "844b0bde1d19fc4ee7aed07fa973aaff", + "content-hash": "e9179c934253bee1b1afef146ded5a2b", "packages": [ + { + "name": "barryvdh/laravel-dompdf", + "version": "v3.1.2", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-dompdf.git", + "reference": "ee3b72b19ccdf57d0243116ecb2b90261344dedc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/ee3b72b19ccdf57d0243116ecb2b90261344dedc", + "reference": "ee3b72b19ccdf57d0243116ecb2b90261344dedc", + "shasum": "" + }, + "require": { + "dompdf/dompdf": "^3.0", + "illuminate/support": "^9|^10|^11|^12|^13.0", + "php": "^8.1" + }, + "require-dev": { + "larastan/larastan": "^2.7|^3.0", + "orchestra/testbench": "^7|^8|^9.16|^10|^11.0", + "phpro/grumphp": "^2.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "PDF": "Barryvdh\\DomPDF\\Facade\\Pdf", + "Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf" + }, + "providers": [ + "Barryvdh\\DomPDF\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\DomPDF\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "A DOMPDF Wrapper for Laravel", + "keywords": [ + "dompdf", + "laravel", + "pdf" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-dompdf/issues", + "source": "https://github.com/barryvdh/laravel-dompdf/tree/v3.1.2" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2026-02-21T08:51:10+00:00" + }, { "name": "brick/math", "version": "0.18.0", @@ -376,6 +453,161 @@ ], "time": "2024-02-05T11:56:58+00:00" }, + { + "name": "dompdf/dompdf", + "version": "v3.1.5", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "f11ead23a8a76d0ff9bbc6c7c8fd7e05ca328496" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/f11ead23a8a76d0ff9bbc6c7c8fd7e05ca328496", + "reference": "f11ead23a8a76d0ff9bbc6c7c8fd7e05ca328496", + "shasum": "" + }, + "require": { + "dompdf/php-font-lib": "^1.0.0", + "dompdf/php-svg-lib": "^1.0.0", + "ext-dom": "*", + "ext-mbstring": "*", + "masterminds/html5": "^2.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "ext-gd": "*", + "ext-json": "*", + "ext-zip": "*", + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + }, + "type": "library", + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "The Dompdf Community", + "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "support": { + "issues": "https://github.com/dompdf/dompdf/issues", + "source": "https://github.com/dompdf/dompdf/tree/v3.1.5" + }, + "time": "2026-03-03T13:54:37+00:00" + }, + { + "name": "dompdf/php-font-lib", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "a6e9a688a2a80016ac080b97be73d3e10c444c9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/a6e9a688a2a80016ac080b97be73d3e10c444c9a", + "reference": "a6e9a688a2a80016ac080b97be73d3e10c444c9a", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11 || ^12" + }, + "type": "library", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "The FontLib Community", + "homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/dompdf/php-font-lib", + "support": { + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/1.0.2" + }, + "time": "2026-01-20T14:10:26+00:00" + }, + { + "name": "dompdf/php-svg-lib", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-svg-lib.git", + "reference": "8259ffb930817e72b1ff1caef5d226501f3dfeb1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/8259ffb930817e72b1ff1caef5d226501f3dfeb1", + "reference": "8259ffb930817e72b1ff1caef5d226501f3dfeb1", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabberworm/php-css-parser": "^8.4 || ^9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "The SvgLib Community", + "homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/dompdf/php-svg-lib", + "support": { + "issues": "https://github.com/dompdf/php-svg-lib/issues", + "source": "https://github.com/dompdf/php-svg-lib/tree/1.0.2" + }, + "time": "2026-01-02T16:01:13+00:00" + }, { "name": "dragonmantank/cron-expression", "version": "v3.6.0", @@ -2033,6 +2265,73 @@ ], "time": "2026-03-08T20:05:35+00:00" }, + { + "name": "masterminds/html5", + "version": "2.10.1", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "fd5018f6815fff903946d0564977b44ce8010e29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fd5018f6815fff903946d0564977b44ce8010e29", + "reference": "fd5018f6815fff903946d0564977b44ce8010e29", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9 || ^10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.10.1" + }, + "time": "2026-06-23T18:43:15+00:00" + }, { "name": "monolog/monolog", "version": "3.10.0", @@ -3171,6 +3470,86 @@ }, "time": "2026-06-18T03:57:49+00:00" }, + { + "name": "sabberworm/php-css-parser", + "version": "v9.4.0", + "source": { + "type": "git", + "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", + "reference": "fd3bf9fb173e0df649bc4e3e0d088a1b2417c08f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/fd3bf9fb173e0df649bc4e3e0d088a1b2417c08f", + "reference": "fd3bf9fb173e0df649bc4e3e0d088a1b2417c08f", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": "^7.2.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "thecodingmachine/safe": "^1.3 || ^2.5 || ^3.4" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "1.4.0", + "phpstan/extension-installer": "1.4.3", + "phpstan/phpstan": "1.12.33 || 2.2.2", + "phpstan/phpstan-phpunit": "1.4.2 || 2.0.16", + "phpstan/phpstan-strict-rules": "1.6.2 || 2.0.11", + "phpunit/phpunit": "8.5.52", + "rawr/phpunit-data-provider": "3.3.1", + "rector/rector": "1.2.10 || 2.4.6", + "rector/type-perfect": "1.0.0 || 2.1.3", + "squizlabs/php_codesniffer": "4.0.1", + "thecodingmachine/phpstan-safe-rule": "1.2.0 || 1.4.3" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.5.x-dev" + } + }, + "autoload": { + "files": [ + "src/Rule/Rule.php", + "src/RuleSet/RuleContainer.php" + ], + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + }, + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Jake Hotson", + "email": "jake.github@qzdesign.co.uk" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v9.4.0" + }, + "time": "2026-06-18T15:10:53+00:00" + }, { "name": "symfony/clock", "version": "v8.1.0", @@ -5650,6 +6029,149 @@ ], "time": "2026-06-09T10:54:51+00:00" }, + { + "name": "thecodingmachine/safe", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/705683a25bacf0d4860c7dea4d7947bfd09eea19", + "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^10", + "squizlabs/php_codesniffer": "^3.2" + }, + "type": "library", + "autoload": { + "files": [ + "lib/special_cases.php", + "generated/apache.php", + "generated/apcu.php", + "generated/array.php", + "generated/bzip2.php", + "generated/calendar.php", + "generated/classobj.php", + "generated/com.php", + "generated/cubrid.php", + "generated/curl.php", + "generated/datetime.php", + "generated/dir.php", + "generated/eio.php", + "generated/errorfunc.php", + "generated/exec.php", + "generated/fileinfo.php", + "generated/filesystem.php", + "generated/filter.php", + "generated/fpm.php", + "generated/ftp.php", + "generated/funchand.php", + "generated/gettext.php", + "generated/gmp.php", + "generated/gnupg.php", + "generated/hash.php", + "generated/ibase.php", + "generated/ibmDb2.php", + "generated/iconv.php", + "generated/image.php", + "generated/imap.php", + "generated/info.php", + "generated/inotify.php", + "generated/json.php", + "generated/ldap.php", + "generated/libxml.php", + "generated/lzf.php", + "generated/mailparse.php", + "generated/mbstring.php", + "generated/misc.php", + "generated/mysql.php", + "generated/mysqli.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pgsql.php", + "generated/posix.php", + "generated/ps.php", + "generated/pspell.php", + "generated/readline.php", + "generated/rnp.php", + "generated/rpminfo.php", + "generated/rrd.php", + "generated/sem.php", + "generated/session.php", + "generated/shmop.php", + "generated/sockets.php", + "generated/sodium.php", + "generated/solr.php", + "generated/spl.php", + "generated/sqlsrv.php", + "generated/ssdeep.php", + "generated/ssh2.php", + "generated/stream.php", + "generated/strings.php", + "generated/swoole.php", + "generated/uodbc.php", + "generated/uopz.php", + "generated/url.php", + "generated/var.php", + "generated/xdiff.php", + "generated/xml.php", + "generated/xmlrpc.php", + "generated/yaml.php", + "generated/yaz.php", + "generated/zip.php", + "generated/zlib.php" + ], + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "generated/Exceptions/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", + "support": { + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://github.com/OskarStark", + "type": "github" + }, + { + "url": "https://github.com/shish", + "type": "github" + }, + { + "url": "https://github.com/silasjoisten", + "type": "github" + }, + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2026-02-04T18:08:13+00:00" + }, { "name": "tijsverkoyen/css-to-inline-styles", "version": "v2.4.0", diff --git a/konzept.png b/konzept.png new file mode 100644 index 0000000..c3688b1 Binary files /dev/null and b/konzept.png differ diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..58e8f87 Binary files /dev/null and b/logo.png differ diff --git a/public/wbm.png b/public/wbm.png new file mode 100644 index 0000000..a6410c7 Binary files /dev/null and b/public/wbm.png differ diff --git a/resources/js/app.js b/resources/js/app.js index ec94d36..952f441 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -14,8 +14,8 @@ import { faStar, faClock, faCircleQuestion, faSliders, faBell, faMagnifyingGlass, faGraduationCap, faFileInvoice, faHeart, faCertificate, - faChevronRight, faArrowRightFromBracket, faCube, - faTriangleExclamation, + faChevronRight, faChevronLeft, faArrowRightFromBracket, faCube, + faTriangleExclamation, faPlus, faFilePdf, faDownload, } from '@fortawesome/free-solid-svg-icons' library.add( @@ -24,8 +24,8 @@ library.add( faStar, faClock, faCircleQuestion, faSliders, faBell, faMagnifyingGlass, faGraduationCap, faFileInvoice, faHeart, faCertificate, - faChevronRight, faArrowRightFromBracket, faCube, - faTriangleExclamation, + faChevronRight, faChevronLeft, faArrowRightFromBracket, faCube, + faTriangleExclamation, faPlus, faFilePdf, faDownload, ) InertiaProgress.init() diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php index a05f46c..ec0d11d 100644 --- a/resources/views/app.blade.php +++ b/resources/views/app.blade.php @@ -3,6 +3,7 @@ + {{ config('app.name', 'Nexus') }} diff --git a/resources/views/pdf/rechnung.blade.php b/resources/views/pdf/rechnung.blade.php new file mode 100644 index 0000000..e5aa029 --- /dev/null +++ b/resources/views/pdf/rechnung.blade.php @@ -0,0 +1,336 @@ + + + + +Rechnung {{ $rechnungsnummer }} + + + + + +
+ + + + + + + + + + + + + + +
+
+ BdP Bund der Pfadfinder*innen LV Sachsen e.V. · + c/o Mandy Grazek · Weststraße 53c · 09212 Limbach-Oberfrohna +
+
+ @if($organisation) +
{{ $organisation }}
+ @endif + @if($vorname || $nachname) +
+ {{ trim($anrede . ' ' . $vorname . ' ' . $nachname) }} +
+ @endif + @if($adresse) +
{{ $adresse }}
+ @endif + @if($plz || $ort) +
{{ trim($plz . ' ' . $ort) }}
+ @endif + @if(!$organisation && !$vorname && !$nachname) +
Kein Empfänger angegeben
+ @endif +
+
+ + + + + + + +
+
Bund der Pfadfinder*innen
+
Landesverband Sachsen e.V. (BdP)
+
c/o Mandy Grazek
+
Weststraße 53c
+
09212 Limbach‑Oberfrohna
+
Thomas Günther
+
{{ $absenderEmail }}
+ @if($absenderTelefon) +
{{ $absenderTelefon }}
+ @endif +
+ +
+ + +
Rechnung Nr. {{ $rechnungsnummer }}
+ + + + + + + + + + + @if($zahlungsziel) + + + + + @endif +
Rechnungsdatum:{{ $rechnungsdatumFormatiert }}Rechnungs-Nr.:{{ $rechnungsnummer }}
Zahlungsziel:{{ $zahlungszielFormatiert }}
+ + +
+ Hallo, +
+
+ anbei übersenden wir folgende Rechnungmit der Bitte um Überweisung des Gesamtbetrags + bis zum {{ $zahlungszielFormatiert }} auf das unten angegebene Konto. +
+ + + + + + + + + + + + + + @forelse($positionen as $i => $pos) + + + + + + + + @empty + + + + @endforelse + +
Nr.BezeichnungMengeEinzelpreisGesamt
{{ $i + 1 }}{{ $pos['bezeichnung'] }}{{ number_format((float)($pos['menge'] ?? 0), 2, ',', '.') }} {{ $pos['einheit'] ?? '' }}{{ number_format((float)($pos['einzelpreis'] ?? 0), 2, ',', '.') }} €{{ number_format((float)($pos['menge'] ?? 0) * (float)($pos['einzelpreis'] ?? 0), 2, ',', '.') }} €
Keine Positionen erfasst.
+ + + + + + + +
+ + + + + + + + + + + + + +
Nettobetrag{{ number_format($netto, 2, ',', '.') }} €
zzgl. {{ $mwstSatz }} % MwSt.{{ number_format($mwst, 2, ',', '.') }} €
Gesamtbetrag{{ number_format($brutto, 2, ',', '.') }} €
+
+ + + @if($iban || $bic) +
+
Bankverbindung
+
Kontoinhaber: BdP Landesverband Sachsen e.V.
+ @if($iban)
IBAN:       {{ $iban }}
@endif + @if($bic)
BIC:        {{ $bic }}
@endif +
+ @endif + + +
+
Herzlichst Gut Pfad.
+
+ BdP Landesverband Sachsen e.V.
+ Landesschatzmeister
+ Thomas Günther
+
+ +
+ +