103 lines
3.6 KiB
PHP
103 lines
3.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Fixtures\Campaign;
|
|
|
|
use Domain\Models\Entities\Campaign;
|
|
use Domain\Models\ValueObjects\Actor\ActorId;
|
|
use Domain\Models\ValueObjects\Brand\BrandCode;
|
|
use Domain\Models\ValueObjects\Campaign\CampaignCode;
|
|
use Domain\Models\ValueObjects\Campaign\CampaignCoupon;
|
|
use Domain\Models\ValueObjects\Campaign\CampaignCouponArray;
|
|
use Domain\Models\ValueObjects\Campaign\CampaignId;
|
|
use Domain\Models\ValueObjects\Campaign\CampaignName;
|
|
use Domain\Models\ValueObjects\Coupon\CouponCode;
|
|
use Domain\Models\ValueObjects\PrintRules;
|
|
|
|
final class CampaignFactory
|
|
{
|
|
/**
|
|
* Campagne "neuve" (id, code générés, updatedAt = null), publiée par défaut.
|
|
*
|
|
* @param list<string|CouponCode>|null $couponCodes ignoré si $coupons est fourni
|
|
* @param list<CampaignCoupon>|null $coupons prioritaire sur $couponCodes
|
|
*/
|
|
public static function make(
|
|
string $name = 'Campaign name',
|
|
bool $printAllAtOnce = false,
|
|
?array $couponCodes = null,
|
|
?array $coupons = null,
|
|
?PrintRules $printRules = null,
|
|
string $brandCode = 'AAA01',
|
|
?ActorId $actorId = null,
|
|
): Campaign {
|
|
return Campaign::create(
|
|
name: new CampaignName($name),
|
|
printAllAtOnce: $printAllAtOnce,
|
|
coupons: self::coupons($coupons, $couponCodes, $printRules),
|
|
brandCode: new BrandCode($brandCode),
|
|
actorId: $actorId ?? ActorId::generate(),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Campagne reconstruite comme depuis la base : permet de fixer id, code et updatedAt.
|
|
* Nécessite que hydrate() accepte $updatedAt en dernier paramètre.
|
|
*
|
|
* @param list<string|CouponCode>|null $couponCodes
|
|
* @param list<CampaignCoupon>|null $coupons
|
|
*/
|
|
public static function hydrated(
|
|
?CampaignId $id = null,
|
|
?CampaignCode $code = null,
|
|
bool $published = true,
|
|
string $name = 'Campaign name',
|
|
bool $printAllAtOnce = false,
|
|
?array $couponCodes = null,
|
|
?array $coupons = null,
|
|
?PrintRules $printRules = null,
|
|
string $brandCode = 'AAA01',
|
|
?ActorId $actorId = null,
|
|
): Campaign {
|
|
return Campaign::hydrate(
|
|
id: $id ?? CampaignId::generate(),
|
|
code: $code ?? CampaignCode::generate(),
|
|
name: new CampaignName($name),
|
|
publication: $published,
|
|
printAllAtOnce: $printAllAtOnce,
|
|
coupons: self::coupons($coupons, $couponCodes, $printRules),
|
|
brandCode: new BrandCode($brandCode),
|
|
actorId: $actorId ?? ActorId::generate(),
|
|
);
|
|
}
|
|
|
|
public static function published(string ...$couponCodes): Campaign
|
|
{
|
|
return self::hydrated(published: true, couponCodes: $couponCodes ?: null);
|
|
}
|
|
|
|
public static function unpublished(string ...$couponCodes): Campaign
|
|
{
|
|
return self::hydrated(published: false, couponCodes: $couponCodes ?: null);
|
|
}
|
|
|
|
/**
|
|
* @param list<CampaignCoupon>|null $coupons
|
|
* @param list<string|CouponCode>|null $couponCodes
|
|
*/
|
|
private static function coupons(?array $coupons, ?array $couponCodes, ?PrintRules $printRules): CampaignCouponArray
|
|
{
|
|
if ($coupons !== null) {
|
|
return new CampaignCouponArray($coupons);
|
|
}
|
|
|
|
return new CampaignCouponArray(array_map(
|
|
static fn (string | CouponCode $code): CampaignCoupon => new CampaignCoupon(
|
|
$code instanceof CouponCode ? $code : CouponCode::generate(),
|
|
$printRules,
|
|
),
|
|
$couponCodes ?? [CouponCode::generate()],
|
|
));
|
|
}
|
|
}
|