ldc-mesbr-app/tests/Fixtures/CampaignRequest/CampaignRequestFactory.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,
);
}
}