diff --git a/app/Actions/SendMail/SendNewsletter.php b/app/Actions/SendMail/SendNewsletter.php new file mode 100644 index 0000000..1f5dd13 --- /dev/null +++ b/app/Actions/SendMail/SendNewsletter.php @@ -0,0 +1,83 @@ + "Arch Versand 2026" + "mail_gruppen_id" => 1 + "mail_vorlage_id" => 2 + "sende_zeitpunkt" => "2026-05-08 10:00:00" + "versand_am" => null + "ist_active" => 0 + */ + + $template = MailVorlage::where('id', $record->mail_vorlage_id)->first(); + + /*** + "titel" => "Ein weiteres Beispiel" + "subjekt" => "Was ich noch sagen wollte" + "inhalt" => "
Hallo ###vorname###
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolor ▶" + */ + + $gruppe = MailGruppen::where('id', $record->mail_gruppen_id)->first(); + + /*** + "name" => "Test Versand" + "created_at" => "2026-05-06 06:42:16" + "absender_name" => "" + "absender_mail" => "" + */ + + $adressen = MailAdressen::where('mail_gruppen_id', $record->mail_gruppen_id)->where('deaktiviert', 0)->get(); + + /*** + "mail_gruppen_id" => 1 + "email" => "ht@webwerkstatt.tirol" + "company" => "WebWerkstatt.tirol" + "anrede" => "Freundschaftlich" + "gender" => "0" + "first_name" => "Hermann" + "last_name" => "Telser" + */ + + // dd($record, $template, $gruppe, $adressen); + + // "email" => "ht@webwerkstatt.tirol" + // "company" => "WebWerkstatt.tirol" + // "gender" => "0" + // "first_name" => "Hermann" + // "last_name" => "Telser" + + foreach ($adressen as $mail_data) { + + $mail_data->subjekt = $template->subjekt; + $mail_data->email = $template->email; + $mail_data->absender_name = $gruppe->absender_name; + $mail_data->absender_mail = $gruppe->absender_mail; + + if ($mail_data->anrede == 'Höflich') { + if ($mail_data->gender) { + $anrede = 'Sehr geehrte Frau '.$mail_data->last_name; + } else { + $anrede = 'Sehr geehrter Herr '.$mail_data->last_name; + } + } else { + $anrede = 'Hallo '.$mail_data->first_name; + } + + $mail_data->inhalt = str_replace('###anrede###', $anrede, $template->inhalt); + + SendNewsletterJob::dispatch($mail_data); + + } + } +} diff --git a/app/Filament/Resources/MailAdressens/Schemas/MailAdressenForm.php b/app/Filament/Resources/MailAdressens/Schemas/MailAdressenForm.php index b95ae49..fa3bf40 100644 --- a/app/Filament/Resources/MailAdressens/Schemas/MailAdressenForm.php +++ b/app/Filament/Resources/MailAdressens/Schemas/MailAdressenForm.php @@ -3,6 +3,7 @@ namespace App\Filament\Resources\MailAdressens\Schemas; use Filament\Forms\Components\DatePicker; +use Filament\Forms\Components\Radio; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Forms\Components\Toggle; @@ -30,12 +31,18 @@ class MailAdressenForm ->required() ->label('Mail Gruppe') ->relationship(name: 'mail_gruppen', titleAttribute: 'name'), - Toggle::make('im_newsletter')->label('Im Newsletter'), + Toggle::make('deaktiviert'), ]), Section::make('Persönliche Anrede') ->columns(2) ->columnSpanFull() ->schema([ + Radio::make('anrede') + ->required() + ->options([ + 'Höflich' => 'Höflich', + 'Freundschaftlich' => 'Freundschaftlich', + ]), Select::make('gender') ->required() ->label('Geschlecht') diff --git a/app/Filament/Resources/MailAdressens/Tables/MailAdressensTable.php b/app/Filament/Resources/MailAdressens/Tables/MailAdressensTable.php index ec84469..b33f2a1 100644 --- a/app/Filament/Resources/MailAdressens/Tables/MailAdressensTable.php +++ b/app/Filament/Resources/MailAdressens/Tables/MailAdressensTable.php @@ -25,13 +25,19 @@ class MailAdressensTable public static function configure(Table $table): Table { return $table + ->defaultSort('vereidigung', direction: 'desc') ->columns([ - ToggleColumn::make('im_newsletter') - ->onColor('success') - ->label('Senden'), - TextColumn::make('company')->label('Firma'), - TextColumn::make('email'), - TextColumn::make('vereidigung')->date()->sortable(), + ToggleColumn::make('deaktiviert') + ->alignCenter(), + TextColumn::make('anrede') + ->badge() + ->color(fn (string $state): string => match ($state) { + 'Höflich' => 'primary', + 'Freundschaftlich' => 'success', + default => 'gray', + }), + // TextColumn::make('company')->label('Firma') + // ->description(fn ($record): string => $record->first_name.' '.$record->last_name), TextColumn::make('gender') ->label('Geschlecht') ->formatStateUsing(fn (string $state): string => match ($state) { @@ -41,6 +47,8 @@ class MailAdressensTable }), TextColumn::make('first_name')->label('Vorname'), TextColumn::make('last_name')->label('Nachname'), + TextColumn::make('email'), + TextColumn::make('vereidigung')->date()->sortable(), ]) ->filters([ Filter::make('mail_gruppen_id') @@ -55,7 +63,7 @@ class MailAdressensTable ->options(function (): array { return MailGruppen::pluck('name', 'id')->toArray(); }), - Toggle::make('im_newsletter')->label('Im Newsletter'), + Toggle::make('deaktiviert')->label('Deaktivierte'), DatePicker::make('vereidigung_von')->native(false)->hiddenLabel()->placeholder('Vereidigung von'), DatePicker::make('vereidigung_bis')->native(false)->hiddenLabel()->placeholder('Vereidigung bis'), ]) @@ -65,8 +73,8 @@ class MailAdressensTable $data['mail_gruppen_id'], fn (Builder $query, $mail_gruppen_id): Builder => $query->where('mail_gruppen_id', $mail_gruppen_id), )->when( - $data['im_newsletter'], - fn (Builder $query, $im_newsletter): Builder => $query->where('im_newsletter', $im_newsletter), + $data['deaktiviert'], + fn (Builder $query, $deaktiviert): Builder => $query->where('deaktiviert', $deaktiviert), )->when( $data['vereidigung_von'], fn (Builder $query, $date): Builder => $query->whereDate('vereidigung', '>=', $date), @@ -87,35 +95,65 @@ class MailAdressensTable ]) ->toolbarActions([ BulkActionGroup::make([ - BulkAction::make('im_newsletter_on') - ->label('An Adressen senden') - ->tooltip('Ausgewählte Adressen dem Newsletter hinzufügen') - ->icon('heroicon-o-envelope') + BulkAction::make('deaktiviert_off') + ->label('Auswahl Aktivieren') + ->tooltip('Auswahl aktivieren') + ->icon('heroicon-o-play') + ->action(function (Collection $records, array $data): void { + foreach ($records as $record) { + /** @var object $record */ + MailAdressen::where('id', '=', $record->id) + ->update( + ['deaktiviert' => 0] + ); + } + }), + BulkAction::make('deaktiviert_on') + ->color('primary') + ->label('Auswahl Deaktivieren') + ->tooltip('Auswahl deaktivieren') + ->icon('heroicon-o-stop') + ->action(function (Collection $records, array $data): void { + foreach ($records as $record) { + /** @var object $record */ + MailAdressen::where('id', '=', $record->id) + ->update( + ['deaktiviert' => 1] + ); + } + }), + DeleteBulkAction::make()->label('Auswahl Löschen'), + ])->label('Status'), + BulkActionGroup::make([ + BulkAction::make('anrede_hoflich') + ->label('Auswahl Höflichkeitsform') + ->tooltip('Für ausgewählte Adressen Höflichkeitsform') + ->icon('heroicon-o-user-circle') + ->color('primary') + ->action(function (Collection $records, array $data): void { + foreach ($records as $record) { + /** @var object $record */ + MailAdressen::where('id', '=', $record->id) + ->update( + ['anrede' => 'Höflich'] + ); + } + }), + BulkAction::make('anrede_vertraulich') + ->label('Auswahl Freundschaftlich') + ->tooltip('Für ausgewählte Adressen freundschaftliche Anrede verwenden') ->color('success') + ->icon('heroicon-o-user') ->action(function (Collection $records, array $data): void { foreach ($records as $record) { /** @var object $record */ MailAdressen::where('id', '=', $record->id) ->update( - ['im_newsletter' => 1] + ['anrede' => 'Freundschaftlich'] ); } }), - BulkAction::make('im_newsletter_off') - ->label('Nicht an Adressen senden') - ->tooltip('Ausgewählte Adressen aus dem Newsletter herausnehmen') - ->icon('heroicon-o-envelope') - ->action(function (Collection $records, array $data): void { - foreach ($records as $record) { - /** @var object $record */ - MailAdressen::where('id', '=', $record->id) - ->update( - ['im_newsletter' => 0] - ); - } - }), - DeleteBulkAction::make(), - ]), + ])->label('Anrede'), ]); } } diff --git a/app/Filament/Resources/MailVersands/Schemas/MailVersandForm.php b/app/Filament/Resources/MailVersands/Schemas/MailVersandForm.php index 0ea02ac..a3b82aa 100644 --- a/app/Filament/Resources/MailVersands/Schemas/MailVersandForm.php +++ b/app/Filament/Resources/MailVersands/Schemas/MailVersandForm.php @@ -16,10 +16,12 @@ class MailVersandForm TextInput::make('name')->label('Benennung')->required(), DateTimePicker::make('sende_zeitpunkt')->native(false)->required(), Select::make('mail_gruppen_id') + ->label('Versand an Empfänger Grupper') ->required() ->relationship(name: 'mail_gruppen', titleAttribute: 'name'), Select::make('mail_vorlage_id') ->required() + ->label('Vorlage für den Versand') ->relationship(name: 'mail_vorlage', titleAttribute: 'titel'), ]); } diff --git a/app/Filament/Resources/MailVersands/Tables/MailVersandsTable.php b/app/Filament/Resources/MailVersands/Tables/MailVersandsTable.php index d2331c1..b640070 100644 --- a/app/Filament/Resources/MailVersands/Tables/MailVersandsTable.php +++ b/app/Filament/Resources/MailVersands/Tables/MailVersandsTable.php @@ -2,11 +2,11 @@ namespace App\Filament\Resources\MailVersands\Tables; +use App\Actions\SendMail\SendNewsletter; use Filament\Actions\Action; use Filament\Actions\EditAction; use Filament\Tables\Columns\SelectColumn; use Filament\Tables\Columns\TextColumn; -use Filament\Tables\Columns\ToggleColumn; use Filament\Tables\Table; class MailVersandsTable @@ -23,29 +23,44 @@ class MailVersandsTable ->optionsRelationship(name: 'mail_vorlage', titleAttribute: 'titel') ->label('Vorlage'), TextColumn::make('sende_zeitpunkt') + ->alignCenter() ->since() - ->dateTooltip() + ->badge() + ->dateTimeTooltip() ->label('Sende Zeitpunkt'), TextColumn::make('versand_am') + ->alignCenter() ->since() - ->dateTooltip(), - ToggleColumn::make('ist_active') - ->label('Senden') - ->tooltip('Wenn aktive wird der Newsletter zum eingestellten Zeitpunkt versand'), + ->badge() + ->dateTimeTooltip(), ]) ->filters([ // ]) ->recordActions([ - Action::make('testmail') - ->modalHeading('Sende Test-Mail') - ->modalIcon('heroicon-o-paper-airplane') - ->modalDescription('Eine Test-Mail wird an alle aktiven Benutzers der Test-Mail Gruppe gesandt.') + Action::make('sendmail-bytime') + ->tooltip('Sende zum Zeitpunkt') + ->modalHeading('Newsletter Versand') + ->icon('heroicon-o-envelope') + ->modalDescription('E-Mails werden gelisted und zum gewählten Datum versandt.') ->requiresConfirmation() ->modalSubmitActionLabel('Senden') ->iconButton() - ->icon('heroicon-o-paper-airplane'), - EditAction::make()->iconButton(), + ->modalIcon('heroicon-o-paper-airplane') + ->action(fn ($record) => SendNewsletter::mailit($record)), + Action::make('sendmail-now') + ->color('warning') + ->tooltip('Sende Jetzt') + ->modalHeading('Newsletter Versand') + ->icon('heroicon-o-envelope') + ->modalDescription('E-Mails werden gelisted und zum gewählten Datum versandt.') + ->requiresConfirmation() + ->modalSubmitActionLabel('Senden') + ->iconButton() + ->modalIcon('heroicon-o-paper-airplane') + ->action(fn ($record) => SendNewsletter::mailit($record)), + EditAction::make()->iconButton() + ->tooltip('Newsletter Einstellungen'), ]); } } diff --git a/app/Filament/Resources/MailVorlages/Schemas/MailVorlageForm.php b/app/Filament/Resources/MailVorlages/Schemas/MailVorlageForm.php index c771e9e..647c2c2 100644 --- a/app/Filament/Resources/MailVorlages/Schemas/MailVorlageForm.php +++ b/app/Filament/Resources/MailVorlages/Schemas/MailVorlageForm.php @@ -14,8 +14,9 @@ class MailVorlageForm return $schema ->components([ TextInput::make('titel')->suffix('Nur zur Kennung'), + TextInput::make('subjekt')->label('Betreff'), RichEditor::make('inhalt') - ->belowContent(new HtmlString('
- "{{ $quote->absender_mail }}" --
- {{ $quote->absender_name ?? 'Unknown' }}
-