"CARD_NOT_FOUND", self::CUSTOMER_NOT_FOUND => "CUSTOMER_NOT_FOUND", self::TICKET_NOT_FOUND => "TICKET_NOT_FOUND", self::NO_FREE_SEATS => "NO_FREE_SEATS", self::EVENT_TYPE_NOT_FOUND => "EVENT_TYPE_NOT_FOUND", self::TICKET_INSUFFICIENT => "TICKET_INSUFFICIENT", self::UNKNOWN_ERROR => "UNKNOWN_ERROR", self::MAX_SEAT_COUNT_EXCEEDED => "MAX_SEAT_COUNT_EXCEEDED", ]; /** * @param \common\models\CardEventRegistrationForm $cardEventForm * @throws NotFoundHttpException * @throws BadRequestHttpException * @throws ServerErrorHttpException * @throws \yii\web\HttpException */ public function registerCard($cardEventForm){ if ( $cardEventForm->validate() ){ /** @var \common\models\Card $card */ $card = Card::readCard($cardEventForm->card_number,false); if ( !isset($card )){ throw new NotFoundHttpException("Card not found: " . $cardEventForm->card_number,self::CARD_NOT_FOUND); } if ( $card->isFree() ){ throw new NotFoundHttpException("Customer not found", self::CUSTOMER_NOT_FOUND); } $activeTickets = $card->getActiveTickets(); if ( sizeof($activeTickets) == 0 ){ throw new NotFoundHttpException("Ticket not found", self::TICKET_NOT_FOUND); } /** @var \common\models\Event $event */ $event = Event::find()->andWhere(['id' => $cardEventForm->event_id])->one(); if ( !isset($event)){ throw new NotFoundHttpException("Event not found: " . $cardEventForm->event_id); } if ( !$event->hasFreeSeats() ){ throw new BadRequestHttpException("No free seats", self::NO_FREE_SEATS); } $eventType = $event->eventType; if ( !isset($eventType) ){ throw new ServerErrorHttpException("Event type not found", self::EVENT_TYPE_NOT_FOUND); } $selectedTicket = $eventType->findTicketAllowingEventType($activeTickets); if ( !isset($selectedTicket) ){ throw new NotFoundHttpException("Ticket not found", self::TICKET_INSUFFICIENT); } if ( $selectedTicket->hasOpenReservationCount() ){ $selectedTicket->consumeReservationCount(1); } $selectedTicket->save(); $registration = new EventRegistration(); $registration->id_event = $event->id; $registration->id_card = $card->id_card; $registration->id_ticket = $selectedTicket->id_ticket; try{ $registration->save(false); }catch (\Throwable $exception){ throw new ServerErrorHttpException("Failed to save", self::UNKNOWN_ERROR); } $cardEventForm->registration = $registration; } } public function createFindRegistrationsQuery($idEvent){ $query = new Query(); $query->select([ "event_registration.id as event_registration_id", "event_registration.created_at as event_registration_created_at", "event_registration.canceled_at as event_registration_canceled_at", "card.number as card_number", "card.number as card_number", "customer.name as customer_name", "customer.email as customer_email", ]); $query->from(EventRegistration::tableName()); $query->innerJoin(Event::tableName(), "event_registration.id_event = event.id"); $query->innerJoin(Card::tableName(), "event_registration.id_card = card.id_card"); $query->innerJoin(Customer::tableName(), "customer.id_customer_card = card.id_card"); $query->andWhere(["event_registration.id_event" => $idEvent ]); return $query; } /** * @param $idRegistration * @return array|EventRegistration|\yii\db\ActiveRecord|null * @throws NotFoundHttpException */ public function loadRegistration($idRegistration) { $registration = EventRegistration::find()->andWhere(['id' => $idRegistration ])->one(); if ($registration == null) { throw new NotFoundHttpException('The requested registration does not exist.'); } return $registration; } /** * @param \common\models\EventRegistration $registration * @throws ServerErrorHttpException */ public function cancelRegistration($registration){ if ( isset($registration->canceled_at)){ throw new ServerErrorHttpException('The registration is already canceled'); } $ticket = Ticket::findOne(['id' => $registration->id_ticket ]); $ticket->restoreReservationCount(1); $ticket->save(false); $registration->canceled_at = date('Y-m-d H:i:s' ); $registration->save(false); } }