feat: clean Weeztix and Mailwizz when admin deletes subscriber

Run CleanupSubscriberIntegrationsService before delete: remove coupon code
in Weeztix via list+DELETE API; update Mailwizz contact to strip configured
source tag from the tag field and clear the mapped coupon field.

Extract MailwizzCheckboxlistTags and MailwizzSubscriberFormPayload for
shared sync/cleanup behaviour. Add WeeztixService list and delete helpers.

Integration failures are logged only; local delete always proceeds.
Feature tests cover Mailwizz strip+clear and Weeztix delete paths.

Made-with: Cursor
This commit is contained in:
2026-04-05 11:57:16 +02:00
parent de83a6fb76
commit 7eda51f52a
7 changed files with 552 additions and 64 deletions

View File

@@ -0,0 +1,40 @@
<?php
declare(strict_types=1);
namespace App\Services;
use App\Models\MailwizzConfig;
use App\Models\Subscriber;
/**
* Shared Mailwizz list subscriber field payload for create/update (excluding tag merge logic).
*/
final class MailwizzSubscriberFormPayload
{
/**
* @return array<string, mixed>
*/
public static function baseFields(Subscriber $subscriber, MailwizzConfig $config, bool $phoneEnabled): array
{
$data = [
$config->field_email => $subscriber->email,
$config->field_first_name => $subscriber->first_name,
$config->field_last_name => $subscriber->last_name,
];
if ($phoneEnabled && $config->field_phone !== null && $config->field_phone !== '') {
$phone = $subscriber->phoneDisplay();
if ($phone !== null && $phone !== '') {
$data[$config->field_phone] = $phone;
}
}
$couponField = $config->field_coupon_code;
if (is_string($couponField) && $couponField !== '' && $subscriber->coupon_code !== null && $subscriber->coupon_code !== '') {
$data[$couponField] = $subscriber->coupon_code;
}
return $data;
}
}