Added initial order confirmation e-mail template #48

This commit is contained in:
2025-10-29 12:07:30 +01:00
parent 039ffa6f2e
commit 59c5bd1e47
4 changed files with 468 additions and 15 deletions
+54
View File
@@ -0,0 +1,54 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Address;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class OrderConfirmation extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(public array $offer) {}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
// TODO: get from settings
from: new Address('buchhaltung@tooloop.de', 'Tooloop Multimedia'),
bcc: [new Address('daniel.stock@tooloop.de', '<Daniel Stock')],
subject: 'Auftragsbestätigung',
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
view: 'mail.offers.confirmation',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}
@@ -19,7 +19,7 @@
p {
font-size: 16px;
line-height: 20px;
line-height: 24px;
font-weight: 400;
}
@@ -148,7 +148,7 @@
<table width="636" cellpadding="0" cellspacing="0" border="0" class="container">
<tr>
<td valign="top">
<a href="https://www.tooloop.de@TrackLink"><img
<a href="https://www.tooloop.de"><img
src="http://newsletter.tooloop.de/uploads/tooloop-logo.png"
width="128px" alt="Tooloop"></a>
</td>
@@ -197,7 +197,7 @@
<td align="left" height="32" style="font-size:16px;">{{ $invoice['nr'] }}</td>
</tr>
<tr>
<th align="left" height="32" style="font-size:16px;">Beteff</th>
<th align="left" height="32" style="font-size:16px;">Betreff</th>
<td align="left" height="32" style="font-size:16px;">{{ $invoice['title'] }}</td>
</tr>
<tr>
@@ -255,44 +255,44 @@
<table width="636" cellpadding="0" cellspacing="0" border="0" class="container">
<tr>
<td align="center" valign="top">
<p style="font-size: 14px; line-height: 15px;">
<p style="font-size: 14px; line-height: 21px;">
<a style="color: #00264D;" href="tel:+4982165079983">+49 821
65079983</a>,
<a href="https://www.tooloop.de@TrackLink" style="color: #00264D;"
<a href="https://www.tooloop.de" style="color: #00264D;"
target="_blank">www.tooloop.de</a>,
<a style="color: #00264D;"
href="mailto:info@tooloop.de">info@tooloop.de</a>
</p>
<p style="color: #999999;font-size: 14px; line-height: 15px;">Tooloop
<p style="color: #999999;font-size: 14px; line-height: 21px;">Tooloop
Multimedia Daniel
Stock, Rehmstraße 4, 86161 Augsburg</p>
<p>
<a style="margin: 0 8px;"
href="https://threema.id/KACDAD2H@TrackLink"><img
href="https://threema.id/KACDAD2H"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_threema.png"
width="32px" alt="Threema"></a>
<a style="margin: 0 8px;"
href="https://matrix.to/#/@vollstock:matrix.org@TrackLink"><img
href="https://matrix.to/#/@vollstock:matrix.org"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_matrix.png"
width="32px" alt="Matrix"></a>
<a style="margin: 0 8px;"
href="https://www.github.com/tooloop@TrackLink"><img
href="https://www.github.com/tooloop"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_github.png"
width="32px" alt="Github"></a>
<a style="margin: 0 8px;"
href="https://www.linkedin.com/in/daniel-stock-749678123@TrackLink"><img
href="https://www.linkedin.com/in/daniel-stock-749678123"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_linkedin.png"
width="32px" alt="LinkedIn"></a>
<a style="margin: 0 8px;"
href="https://www.xing.com/profile/Daniel_Stock9@TrackLink"><img
href="https://www.xing.com/profile/Daniel_Stock9"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_xing.png"
width="32px" alt="Xing"></a>
<a style="margin: 0 8px;"
href="https://mastodon.social/@tooloop@TrackLink"><img
href="https://mastodon.social/@tooloop"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_mastodon.png"
width="32px" alt="Xing"></a>
<a style="margin: 0 8px;"
href="https://www.instagram.com/tooloop.multimedia/@TrackLink"><img
href="https://www.instagram.com/tooloop.multimedia/"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_instagram.png"
width="32px" alt="Xing"></a>
</p>
@@ -0,0 +1,351 @@
@php
$fmt = new \IntlDateFormatter('de_DE', NULL, NULL);
$fmt->setPattern('d. MMMM yyyy');
@endphp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Auftragsbestätigung</title>
<style type="text/css">
* {
font-family: system-ui, sans-serif;
}
a {
color: #00264D;
}
p {
font-size: 16px;
line-height: 24px;
font-weight: 400;
}
/* Outlines the grids, remove when sending */
/* table td {
border: 1px solid rgb(227, 238, 245);
} */
/* CLIENT-SPECIFIC STYLES */
body,
table,
td,
a {
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
table,
td {
mso-table-lspace: 0pt;
mso-table-rspace: 0pt;
}
img {
-ms-interpolation-mode: bicubic;
}
/* RESET STYLES */
img {
border: 0;
outline: none;
text-decoration: none;
max-width: 100%;
height: auto;
}
table {
border-collapse: collapse !important;
}
body {
margin: 0 !important;
padding: 0 !important;
width: 100% !important;
}
li {
font-size: 16px;
margin-bottom: 8px;
}
/* iOS BLUE LINKS */
a[x-apple-data-detectors] {
color: inherit !important;
text-decoration: none !important;
font-size: inherit !important;
font-family: inherit !important;
font-weight: inherit !important;
line-height: inherit !important;
}
/* ANDROID CENTER FIX */
div[style*="margin: 16px 0;"] {
margin: 0 !important;
}
/* MEDIA QUERIES */
@media all and (max-width:699px) {
.wrapper {
width: 100% !important;
padding: 0 !important;
}
.container {
width: calc(100% - 64px) !important;
padding: 0 !important;
}
.mobile {
width: 100% !important;
display: block !important;
padding: 0 !important;
}
.img {
width: 100% !important;
height: auto !important;
}
*[class="mobileOff"] {
width: 0px !important;
display: none !important;
}
*[class*="mobileOn"] {
display: block !important;
max-height: none !important;
}
}
.table tr {
border-top: 1px solid #cccccc;
border-bottom: 1px solid #cccccc;
}
</style>
</head>
<body style="margin:0; padding:0; background-color:#f2f2f2;">
<span style="display: block; width: 700px !important; max-width: 700px; height: 1px" class="mobileOff"></span>
<center>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#f2f2f2">
<tr>
<td align="center" valign="top">
<!-- Logo -->
<table width="700" cellpadding="0" cellspacing="0" border="0" class="wrapper" bgcolor="#FFFFFF">
<tr>
<td height="32" style="font-size:12px; line-height:15px;">&nbsp;</td>
</tr>
<tr>
<td align="center" valign="top">
<table width="636" cellpadding="0" cellspacing="0" border="0" class="container">
<tr>
<td valign="top">
<a href="https://www.tooloop.de"><img
src="http://newsletter.tooloop.de/uploads/tooloop-logo.png"
width="128px" alt="Tooloop"></a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td height="32" style="font-size:12px; line-height:15px;">&nbsp;</td>
</tr>
</table>
<!-- --------------------------------------------------- -->
<!-- Content -->
<!-- --------------------------------------------------- -->
<!-- schon angepasst -->
<table width="700" cellpadding="0" cellspacing="0" border="0" class="wrapper" bgcolor="#ffffff">
<tr>
<td height="32" style="font-size:12px; line-height:15px;">&nbsp;</td>
</tr>
<tr>
<td align="center" valign="top">
<table width="636" cellpadding="0" cellspacing="0" border="0" class="container">
<tr>
<td align="left" valign="top">
<p>Hallo {{ $offer['contact']['salutation'] ?? '' }} {{
$offer['contact']['lastName'] }},</p>
<p>wir bedanken uns herzlich für Ihren Auftrag und bestätigen Ihnen hiermit
den Eingang und die Annahme Ihres Auftrags vom {{
$fmt->format(strtotime($offer['orderDate'])) }}.</p>
</td>
</tr>
<tr>
<td height="32" style="font-size:12px; line-height:15px;">&nbsp;</td>
</tr>
<tr>
<td align="center" valign="top">
<table width="100%" class="table">
<!-- <tr>
<th align="left" height="32" style="font-size:16px;">Angebots-Nr.
</th>
<td align="left" height="32" style="font-size:16px;">{{ $offer['nr']
}}</td>
</tr> -->
<tr>
<th align="left" height="32" style="font-size:16px;">Betreff</th>
<td align="left" height="32" style="font-size:16px;">{{
$offer['title'] }}</td>
</tr>
<tr>
<th align="left" height="32" style="font-size:16px;">Unser Angebot
vom</th>
<td align="left" height="32" style="font-size:16px;">{{
$fmt->format(strtotime($offer['offerDate'])) }}</td>
</tr>
<tr>
<th align="left" height="32" style="font-size:16px;">Gesamtbetrag
</th>
<td align="left" height="32" style="font-size:16px;">
@toCurrency(round($offer['totalAmount'] * 1.19, 2))</td>
</tr>
<tr>
<th align="left" height="32" style="font-size:16px;">Zahlungsziel
</th>
@if($offer['paymentTerms']['isFixed'])
<td align="left" height="32" style="font-size:16px;">{{
$offer['paymentTerms']['description'] }}</td>
@else
<td align="left" height="32" style="font-size:16px;">{{
$offer['paymentTerms']['days'] }} Tage</td>
@endif
</tr>
</table>
</td>
</tr>
<tr>
<td height="32" style="font-size:12px; line-height:15px;">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">
<p>Falls Sie Fragen haben oder Änderungen am Auftrag vornehmen möchten,
stehen wir Ihnen gerne zur Verfügung. Wir freuen uns auf eine
erfolgreiche Zusammenarbeit.</p>
</td>
</tr>
<tr>
<td height="32" style="font-size:12px; line-height:15px;">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">
<p style="color: #999999; font-size: 14px; line-height: 21px;">Es gelten
unsere allgemeinen Geschäftsbedingungen, die Sie jederzeit unter <a
href="https://www.tooloop.de/de/agb">www.tooloop.de/agb</a> einsehen
können.</p>
<p style="color: #999999; font-size: 14px; line-height: 21px;">Dieses
Dokument dient als Auftragsbestätigung und ist nicht als
umsatzsteuerlich gültiges Dokument zu verstehen. Es berechtigt nicht zum
Vorsteuerabzug. <!-- Der ausgewiesene
Mehrwertsteuerbetrag dient lediglich zu Ihrer Information.--> Die
Rechnung
zu Ihrem Auftrag wird Ihnen in einer separaten Mail zugesendet.
</p>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td height="32" style="font-size:12px; line-height:15px;">&nbsp;</td>
</tr>
</table>
<!-- --------------------------------------------------- -->
<!-- End content -->
<!-- --------------------------------------------------- -->
<!-- Last Space -->
<table width="700" cellpadding="0" cellspacing="0" border="0" class="wrapper" bgcolor="#ffffff">
<tr>
<td height="32" style="font-size:12px; line-height:15px;">&nbsp;</td>
</tr>
</table>
<!-- Footer -->
<table width="700" cellpadding="0" cellspacing="0" border="0" class="wrapper" bgcolor="#f2f2f2">
<tr>
<td height="64" style="font-size:24px; line-height:30px;">&nbsp;</td>
</tr>
<tr>
<td align="center" valign="top">
<table width="636" cellpadding="0" cellspacing="0" border="0" class="container">
<tr>
<td align="center" valign="top">
<p style="font-size: 14px; line-height: 21px;">
<a style="color: #00264D;" href="tel:+4982165079983">+49 821
65079983</a>,
<a href="https://www.tooloop.de" style="color: #00264D;"
target="_blank">www.tooloop.de</a>,
<a style="color: #00264D;"
href="mailto:info@tooloop.de">info@tooloop.de</a>
</p>
<p style="color: #999999; font-size: 14px; line-height: 21px;">Tooloop
Multimedia Daniel
Stock, Rehmstraße 4, 86161 Augsburg</p>
<p>
<a style="margin: 0 8px;" href="https://threema.id/KACDAD2H"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_threema.png"
width="32px" alt="Threema"></a>
<a style="margin: 0 8px;"
href="https://matrix.to/#/@vollstock:matrix.org"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_matrix.png"
width="32px" alt="Matrix"></a>
<a style="margin: 0 8px;" href="https://www.github.com/tooloop"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_github.png"
width="32px" alt="Github"></a>
<a style="margin: 0 8px;"
href="https://www.linkedin.com/in/daniel-stock-749678123"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_linkedin.png"
width="32px" alt="LinkedIn"></a>
<a style="margin: 0 8px;"
href="https://www.xing.com/profile/Daniel_Stock9"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_xing.png"
width="32px" alt="Xing"></a>
<a style="margin: 0 8px;" href="https://mastodon.social/@tooloop"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_mastodon.png"
width="32px" alt="Xing"></a>
<a style="margin: 0 8px;"
href="https://www.instagram.com/tooloop.multimedia/"><img
src="http://newsletter.tooloop.de/uploads/contact_logo_instagram.png"
width="32px" alt="Xing"></a>
</p>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td height="64" style="font-size:24px; line-height:30px;">&nbsp;</td>
</tr>
</table>
</td>
</tr>
</table>
</center>
</body>
</html>
+50 -2
View File
@@ -8,15 +8,18 @@
use App\Models\Invoice;
use App\Http\Controllers\PaymentTermsController;
use App\Http\Controllers\SettingController;
use App\Mail\OrderConfirmation;
use App\Support\ApiDataTransformer;
use Illuminate\Support\Facades\Mail;
Route::get('customers/{id}', [CustomerController::class, 'single']);
Route::get('customers', [CustomerController::class, 'index']);
// ->middleware('auth:sanctum');
// Route::apiResource('invoices', InvoiceController::class);
// ->middleware('auth:sanctum');
Route::get('/invoices', [InvoiceController::class, 'index']);
Route::post('/invoices', [InvoiceController::class, 'store']);
Route::get('/invoices/{id}', [InvoiceController::class, 'single']);
@@ -25,7 +28,52 @@
Route::get('/invoices/{id}/remind', function ($id) {
$invoice = InvoiceController::single($id);
return new Reminder($invoice);
Mail::to('daniel@vollstock.de')->send(new Reminder($invoice));
// return new Reminder($invoice);
});
Route::get('/offers/{id}/confirmation', function ($id) {
// $offer = offerController::single($id);
$offer = [
'nr' => 0,
'offerDate' => '2025-10-01',
'orderDate' => '2025-10-28',
'customerId' => 0,
'customer' => [
'companyName' => '',
'vatId' => '',
'billingAddress' => [
'lineOne' => '',
'lineTwo' => '',
'city' => '',
'postalCode' => '',
'countryCode' => 'DE',
]
],
'contact' => [
'salutation' => 'Frau',
'firstName' => '',
'lastName' => '',
'email' => '',
'phone' => '',
'position' => null,
'isPrimary' => false,
'avatar' => null,
],
'totalAmount' => '13575.88',
'title' => "",
'text' => '',
'items' => [],
'paymentTerms' => [
'name' => 'onReceipt',
'description' => 'Bei Rechnungserhalt',
'isFixed' => true,
'days' => null,
]
];
// Mail::to('')->cc([''])->send(new OrderConfirmation($offer));
return new OrderConfirmation($offer);
});
Route::get('/paymentterms', [PaymentTermsController::class, 'index']);