Tribe__Tickets__REST__V1__Endpoints__QR::check_in( WP_REST_Request $request )

Check in attendee.


Parameters

$request

(WP_REST_Request) (Required) The request.


Top ↑

Return

(WP_REST_Response)


Top ↑

Source

File: src/Tribe/REST/V1/Endpoints/QR.php

	public function check_in( WP_REST_Request $request ) {
		$this->serving = $request;

		$qr_arr = $this->prepare_qr_arr( $request );

		if ( is_wp_error( $qr_arr ) ) {
			$response = new WP_REST_Response( $qr_arr );
			$response->set_status( 400 );

			return $response;
		}

		$api_key_is_valid = $this->has_api( $qr_arr );

		/**
		 * Allow filtering the API key validation status.
		 *
		 * @since 5.2.5
		 *
		 * @param bool  $is_valid Whether the provided API key is valid or not.
		 * @param array $qr_arr The request data for Check in.
		 */
		$api_key_is_valid = apply_filters_deprecated( 'event_tickets_plus_requested_api_is_valid', [ $api_key_is_valid, $qr_arr ], '5.7.0', 'tec_tickets_requested_api_is_valid' );

		/**
		 * Allow filtering the API key validation status.
		 *
		 * @since 5.7.0
		 *
		 * @param bool  $is_valid Whether the provided API key is valid or not.
		 * @param array $qr_arr The request data for Check in.
		 */
		$api_key_is_valid = apply_filters( 'tec_tickets_requested_api_is_valid', $api_key_is_valid, $qr_arr );

		// Check all the data we need is there.
		if ( empty( $api_key_is_valid ) || empty( $qr_arr['ticket_id'] ) ) {
			$response = new WP_REST_Response( $qr_arr );
			$response->set_status( 400 );

			return $response;
		}

		$event_id      = (int) $qr_arr['event_id'];
		$ticket_id     = (int) $qr_arr['ticket_id'];
		$security_code = (string) $qr_arr['security_code'];

		/** @var Tribe__Tickets__Data_API $data_api */
		$data_api = tribe( 'tickets.data_api' );

		$service_provider = $data_api->get_ticket_provider( $ticket_id );
		if (
			empty( $service_provider->security_code )
			|| get_post_meta( $ticket_id, $service_provider->security_code, true ) !== $security_code
		) {
			$response = new WP_REST_Response(
				[
					'msg'   => __( 'Security code is not valid!', 'event-tickets' ),
					'error' => 'security_code_not_valid',
				]
			);
			$response->set_status( 403 );

			return $response;
		}

		// Add check for attendee data.
		$attendee = $service_provider->get_attendees_by_id( $ticket_id );
		$attendee = reset( $attendee );
		if ( ! is_array( $attendee ) ) {
			$response = new WP_REST_Response(
				[
					'msg'   => __( 'An attendee is not found with this ID.', 'event-tickets' ),
					'error' => 'attendee_not_found',
				]
			);
			$response->set_status( 403 );

			return $response;
		}

		// Get the attendee data to populate the response.
		$attendee_id   = (int) $attendee['attendee_id'];
		$attendee_data = tribe( 'tickets.rest-v1.attendee-repository' )->format_item( $attendee_id );

		/** @var Tribe__Tickets__Status__Manager $status */
		$status = tribe( 'tickets.status' );

		$complete_statuses = (array) $status->get_completed_status_by_provider_name( $service_provider );

		if ( ! in_array( $attendee['order_status'], $complete_statuses, true ) ) {
			$response = new WP_REST_Response(
				[
					'msg'      => esc_html(
						sprintf(
							// Translators: %s: 'ticket' label (singular, lowercase).
							__( "This attendee's %s is not authorized to be Checked in. Please check the order status.", 'event-tickets' ),
							tribe_get_ticket_label_singular_lowercase( 'rest_qr' )
						)
					),
					'error'    => 'attendee_not_authorized',
					'attendee' => $attendee_data,
				]
			);

			$response->set_status( 403 );

			return $response;
		}

		// Check if the attendee is checked in.
		$checked_status = get_post_meta( $ticket_id, '_tribe_qr_status', true );
		if ( $checked_status ) {
			$response = new WP_REST_Response(
				[
					'msg'      => __( 'Already checked in!', 'event-tickets' ),
					'error'    => 'attendee_already_checked_in',
					'attendee' => $attendee_data,
				]
			);
			$response->set_status( 403 );

			return $response;
		}

		// Check if TEC is enabled, and if we want to only check in when the event is happening.
		if ( $this->should_checkin_qr_events_happening_now( $event_id, $attendee_id ) ) {

			// Check if the current event is on date and time.
			if ( ! $this->is_tec_event_happening_now( $event_id ) ) {

				$response = new WP_REST_Response(
					[
						'msg'      => __( 'Event has not started or it has finished.', 'event-tickets' ),
						'error'    => 'event_not_happening_now',
						'attendee' => $attendee_data,
					]
				);

				$response->set_status( 403 );

				return $response;
			}
		}

		$checked = $this->_check_in( $ticket_id, $service_provider );
		if ( ! $checked ) {
			$msg_arr = [
				'msg'             => esc_html(
					sprintf(
						// Translators: %s: 'ticket' label (singular, lowercase).
						__( '%s not checked in!', 'event-tickets' ),
						tribe_get_ticket_label_singular( 'rest_qr' )
					)
				),
				'error'           => 'attendee_failed_check_in',
				'tribe_qr_status' => get_post_meta( $ticket_id, '_tribe_qr_status', 1 ),
				'attendee'        => $attendee_data,
			];
			$result  = array_merge( $msg_arr, $qr_arr );

			$response = new WP_REST_Response( $result );
			$response->set_status( 403 );

			return $response;
		}

		$response = new WP_REST_Response(
			[
				'msg'      => __( 'Checked In!', 'event-tickets' ),
				'attendee' => $attendee_data,
			]
		);
		$response->set_status( 201 );

		return $response;
	}

Top ↑

Changelog

Changelog
Version Description
5.7.0 Introduced.