135 lines
5.6 KiB
PHP
135 lines
5.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Fixtures\CampaignRequest;
|
|
|
|
use Domain\Models\Entities\CampaignRequest;
|
|
use Domain\Models\ValueObjects\Brand\BrandCode;
|
|
use Domain\Models\ValueObjects\Campaign\CampaignName;
|
|
use Domain\Models\ValueObjects\CampaignRequest\Applicant;
|
|
use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestId;
|
|
use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestStatus;
|
|
use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestType;
|
|
use Domain\Models\ValueObjects\CampaignRequest\RejectionReason;
|
|
use Domain\Models\ValueObjects\Coupon\CouponLegalInformation;
|
|
use Domain\Models\ValueObjects\Coupon\CouponLegalInformationArray;
|
|
use Domain\Models\ValueObjects\Coupon\CouponName;
|
|
use Domain\Models\ValueObjects\Coupon\CouponPicture;
|
|
use Domain\Models\ValueObjects\Coupon\CouponProductArray;
|
|
use Domain\Models\ValueObjects\Coupon\CouponValidityInformation;
|
|
use Domain\Models\ValueObjects\Coupon\CouponValidityInformationArray;
|
|
use Domain\Models\ValueObjects\IncoCode;
|
|
use Domain\Models\ValueObjects\MoneyAmount;
|
|
use Domain\Models\ValueObjects\Period;
|
|
use Domain\Models\ValueObjects\PicturePath;
|
|
use Domain\Models\ValueObjects\PrintRules;
|
|
use Domain\Models\ValueObjects\ProcessingCode;
|
|
use Domain\Models\ValueObjects\ProcessingCodeArray;
|
|
use Domain\Models\ValueObjects\RequestedCoupon\RequestedCoupon;
|
|
use Domain\Models\ValueObjects\RequestedCoupon\RequestedCouponQuantity;
|
|
use Shared\Enums\Country;
|
|
use Shared\Enums\Currency;
|
|
use Shared\ValueObjects\Email;
|
|
use Shared\ValueObjects\Money;
|
|
|
|
final class CampaignRequestFactory
|
|
{
|
|
/** Demande neuve : id généré, statut CREATED, updatedAt = null. */
|
|
public static function make(
|
|
string $brandCode = 'AAA01',
|
|
string $name = 'Campaign request',
|
|
?Applicant $applicant = null,
|
|
CampaignRequestType $campaignType = CampaignRequestType::CLUB,
|
|
?RequestedCoupon $requestedCoupon = null,
|
|
): CampaignRequest {
|
|
return CampaignRequest::create(
|
|
brandCode: new BrandCode($brandCode),
|
|
name: new CampaignName($name),
|
|
applicant: $applicant ?? self::applicant(),
|
|
campaignType: $campaignType,
|
|
requestedCoupon: $requestedCoupon ?? self::requestedCoupon(),
|
|
);
|
|
}
|
|
|
|
/** Demande reconstruite comme depuis la base (id et statut contrôlables). */
|
|
public static function hydrated(
|
|
?CampaignRequestId $id = null,
|
|
CampaignRequestStatus $status = CampaignRequestStatus::CREATED,
|
|
?RejectionReason $rejectionReason = null,
|
|
string $brandCode = 'AAA01',
|
|
string $name = 'Campaign request',
|
|
?Applicant $applicant = null,
|
|
CampaignRequestType $campaignType = CampaignRequestType::CLUB,
|
|
?RequestedCoupon $requestedCoupon = null,
|
|
): CampaignRequest {
|
|
if ($status === CampaignRequestStatus::REJECTED) {
|
|
$rejectionReason ??= self::rejectionReason();
|
|
}
|
|
|
|
return CampaignRequest::hydrate(
|
|
id: $id ?? CampaignRequestId::generate(),
|
|
brandCode: new BrandCode($brandCode),
|
|
name: new CampaignName($name),
|
|
applicant: $applicant ?? self::applicant(),
|
|
campaignType: $campaignType,
|
|
requestedCoupon: $requestedCoupon ?? self::requestedCoupon(),
|
|
status: $status,
|
|
rejectionReason: $rejectionReason,
|
|
);
|
|
}
|
|
|
|
/** Demande rejetée, obtenue par la vraie transition métier. */
|
|
public static function rejected(?RejectionReason $reason = null): CampaignRequest
|
|
{
|
|
return self::make()->reject($reason ?? self::rejectionReason());
|
|
}
|
|
|
|
/** Demande transformée en campagne, obtenue par la vraie transition métier. */
|
|
public static function transformed(): CampaignRequest
|
|
{
|
|
return self::make()->updateStatusWhenTransformed();
|
|
}
|
|
|
|
public static function applicant(
|
|
string $firstname = 'Jane',
|
|
string $lastname = 'Doe',
|
|
string $email = 'jane.doe@example.com',
|
|
): Applicant {
|
|
return new Applicant($firstname, $lastname, new Email($email)); // Email : À VÉRIFIER
|
|
}
|
|
|
|
public static function rejectionReason(string $reason = 'Not eligible'): RejectionReason
|
|
{
|
|
return new RejectionReason($reason);
|
|
}
|
|
|
|
public static function requestedCoupon(
|
|
string $couponName = 'Coupon name',
|
|
int $quantity = 1000,
|
|
?PrintRules $printRules = null,
|
|
): RequestedCoupon {
|
|
return new RequestedCoupon(
|
|
couponName: new CouponName($couponName),
|
|
quantity: new RequestedCouponQuantity($quantity), // À VÉRIFIER
|
|
diffusion: new Period(new \DateTime()->modify('+1 month'), new \DateTime()->modify('+2 months')),
|
|
moneyAmount: new MoneyAmount(new Money(Currency::EUR, 100)),
|
|
couponPicture: new CouponPicture(
|
|
new PicturePath('files/product.jpg'),
|
|
new PicturePath('files/thumbnail.jpg'),
|
|
new PicturePath('files/mobile_thumbnail.jpg'),
|
|
),
|
|
couponProcessingCodes: new ProcessingCodeArray([
|
|
new ProcessingCode('5425003944130', Country::FRANCE),
|
|
]),
|
|
couponValidityInformations: new CouponValidityInformationArray([
|
|
new CouponValidityInformation('Lorem ipsum dolor sit amet consectetur.', Country::FRANCE),
|
|
]),
|
|
couponLegalInformations: new CouponLegalInformationArray([
|
|
new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur.', Country::FRANCE),
|
|
]),
|
|
couponProducts: new CouponProductArray([new IncoCode(35784)]),
|
|
printRules: $printRules,
|
|
);
|
|
}
|
|
}
|