Skip to content

Commit cd1a6ad

Browse files
committed
fix: add promo code max usage per order
Change-Id: Idfd03cb851bb772f48b685eba6d608e237b7ac69
1 parent 27ddb41 commit cd1a6ad

2 files changed

Lines changed: 45 additions & 7 deletions

File tree

app/Models/Foundation/Summit/Registration/PromoCodes/SummitRegistrationPromoCode.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,4 +789,7 @@ public function getSentDate(): ?\DateTime
789789
return $this->sent_date;
790790
}
791791

792+
public function getMaxUsagePerOrder():int{
793+
return 1;
794+
}
792795
}

app/Services/Model/Imp/SummitOrderService.php

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ private function buildPrePaidSaga(Member $owner, Summit $summit, array $payload)
252252
Log::debug(sprintf("SagaFactory::buildPrePaidSaga - summit id %s", $summit->getId()));
253253
return Saga::start()
254254
->addTask(new PreOrderValidationTask($summit, $payload, $this->ticket_type_repository, $this->tx_service))
255-
->addTask(new PreProcessReservationTask($payload))
255+
->addTask(new PreProcessReservationTask($summit, $payload))
256256
->addTask(new AutoAssignPrePaidTicketTask(
257257
$owner,
258258
$summit,
@@ -269,7 +269,7 @@ private function buildRegularSaga(Member $owner, Summit $summit, array $payload)
269269
Log::debug(sprintf("SagaFactory::buildRegularSaga - summit id %s", $summit->getId()));
270270
return Saga::start()
271271
->addTask(new PreOrderValidationTask($summit, $payload, $this->ticket_type_repository, $this->tx_service))
272-
->addTask(new PreProcessReservationTask($payload))
272+
->addTask(new PreProcessReservationTask($summit, $payload))
273273
->addTask(new ReserveTicketsTask($summit, $this->ticket_type_repository, $this->tx_service, $this->lock_service))
274274
->addTask(new ApplyPromoCodeTask($summit, $payload, $this->promo_code_repository, $this->tx_service, $this->lock_service))
275275
->addTask(new ReserveOrderTask(
@@ -878,12 +878,12 @@ public function run(array $formerState): array
878878
foreach ($ticket_types as $ticket_type) {
879879

880880
if (!empty($former_currency) && $ticket_type->getCurrency() != $former_currency) {
881-
throw new ValidationException("order should have tickets with same currency");
881+
throw new ValidationException("Order should have tickets with same currency.");
882882
}
883883

884884
$former_currency = $ticket_type->getCurrency();
885885
if (!$ticket_type instanceof SummitTicketType) {
886-
throw new EntityNotFoundException("ticket type not found");
886+
throw new EntityNotFoundException("Ticket type not found.");
887887
}
888888
if (!$ticket_type->canSell()) {
889889
throw new ValidationException(sprintf('The ticket “%s” is not available. Please go back and select a different ticket.', $ticket_type->getName()));
@@ -927,12 +927,21 @@ final class PreProcessReservationTask extends AbstractTask
927927
private $payload;
928928

929929
/**
930-
* PreProcessReservationTask constructor.
930+
* @var Summit
931+
*/
932+
private $summit;
933+
/**
934+
* @param Summit $summit
931935
* @param array $payload
932936
*/
933-
public function __construct(array $payload)
937+
public function __construct
938+
(
939+
Summit $summit,
940+
array $payload
941+
)
934942
{
935943
$this->payload = $payload;
944+
$this->summit = $summit;
936945
}
937946

938947
/**
@@ -949,11 +958,17 @@ public function run(array $formerState): array
949958
$tickets = $this->payload['tickets'];
950959

951960
foreach ($tickets as $ticket_dto) {
961+
952962
if (!isset($ticket_dto['type_id']))
953963
throw new ValidationException('type_id is mandatory.');
954964

955965
$type_id = intval($ticket_dto['type_id']);
956966

967+
$ticket_type = $this->summit->getTicketTypeById($type_id);
968+
969+
if(is_null($ticket_type) || !$ticket_type->isLive())
970+
throw new ValidationException(sprintf("Ticket Type %s is not available.", $type_id));
971+
957972
if (!in_array($type_id, $ticket_types_ids))
958973
$ticket_types_ids[] = $type_id;
959974

@@ -965,6 +980,13 @@ public function run(array $formerState): array
965980
$reservations[$type_id] = $reservations[$type_id] + 1;
966981

967982
if (!empty($promo_code_value)) {
983+
$promo_code =$this->summit->getPromoCodeByCode($promo_code_value);
984+
985+
if(is_null($promo_code))
986+
throw new ValidationException("Promo Code is invalid.");
987+
988+
if(!$promo_code->canBeAppliedTo($ticket_type))
989+
throw new ValidationException("Promo Code is invalid.");
968990

969991
if (!isset($promo_codes_usage[$promo_code_value])) {
970992
$promo_codes_usage[$promo_code_value] = [
@@ -976,12 +998,24 @@ public function run(array $formerState): array
976998
$info = $promo_codes_usage[$promo_code_value];
977999
$info['qty'] = $info['qty'] + 1;
9781000

1001+
if($promo_code->getMaxUsagePerOrder() < $info['qty'])
1002+
throw new ValidationException
1003+
(
1004+
sprintf
1005+
(
1006+
"Promo Code %s can not be used more than %s times per order.",
1007+
$promo_code_value,
1008+
$promo_code->getMaxUsagePerOrder()
1009+
)
1010+
);
1011+
9791012
if (!in_array($type_id, $info['types']))
9801013
$info['types'] = array_merge($info['types'], [$type_id]);
9811014

9821015
$promo_codes_usage[$promo_code_value] = $info;
9831016
}
9841017
}
1018+
9851019
return [
9861020
"reservations" => $reservations,
9871021
"promo_codes_usage" => $promo_codes_usage,
@@ -1029,7 +1063,8 @@ final class PreOrderValidationTask extends AbstractTask
10291063
*/
10301064
public function __construct
10311065
(
1032-
Summit $summit, array $payload,
1066+
Summit $summit,
1067+
array $payload,
10331068
ISummitTicketTypeRepository $ticket_type_repository,
10341069
ITransactionService $tx_service
10351070
)

0 commit comments

Comments
 (0)