@@ -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