form()->cart_enabled(); } /** * Build the step descriptor. * * @param BookingSession $session Session. */ public function descriptor( BookingSession $session ): StepDescriptor { return $this->build_descriptor( $session, [ 'cart_item_count' => count( $session->cart() ), 'has_draft' => null !== $session->draft()->service_id(), ], [ [ 'key' => 'coupon_code', 'type' => 'string', 'required' => false, ], [ 'key' => 'commit_draft', 'type' => 'boolean', 'required' => false, ], ] ); } /** * Validate submitted input. * * @param BookingSession $session Session. * @param array $input Payload. */ public function validate( BookingSession $session, array $input ): ValidationResult { unset( $input ); if ( null === $session->draft()->service_id() && [] === $session->cart() ) { return ValidationResult::invalid( [], [ 'Your cart is empty.' ] ); } return ValidationResult::ok(); } /** * Apply validated input. * * @param BookingSession $session Session. * @param array $input Payload. */ public function apply( BookingSession $session, array $input ): BookingSession { $coupon = $this->string_value( $input, 'coupon_code' ); $next = null !== $coupon ? $session->with_coupon_code( $coupon ) : $session; $commit = isset( $input['commit_draft'] ) && true === $input['commit_draft']; if ( $commit && null !== $next->draft()->service_id() ) { $cart = $next->cart(); $cart[] = $next->draft(); $next = $next->with_cart( $cart ); } return $next; } }