sports->find($sport))CatalogValidator::invalid('sport_id',__('The selected sport does not exist.','abece-booking')); $data=$this->repository->suggestionData($sport);$name=null; if($data['names']&&!array_filter($data['names'],static fn($n)=>!preg_match('/^[1-9][0-9]*$/D',$n)||strlen($n)>15))$name=(string)(max(array_map('intval',$data['names']))+1); return ['sort_order'=>$data['max_sort_order']+1,'name'=>$name]; } public function fields(): array { return array_merge(\ABeCe\Booking\Edition\Modules::current()->resourceFields(), [ 'name', 'slug', 'description', 'is_active', 'sort_order', 'sport_id', 'resource_type', 'surface', 'capacity', 'is_visible', 'is_bookable', 'access_mode', 'member_booking_days', 'guest_booking_days', 'public_release_hours', 'min_booking_minutes', 'max_booking_minutes', 'booking_step_minutes', 'payment_methods_override' ]); } public function save(array $input,?int $id=null):array{ return \ABeCe\Booking\Edition\Modules::current()->resourceSave($this->repository,$input,$id,fn($data)=>parent::save($data,$id)); } protected function validate( array $input, array $current ): array { unset($current['online_booking_enabled']); $defaults = [ 'sport_id' => null, 'resource_type' => 'court', 'surface' => null, 'capacity' => null, 'is_visible' => true, 'is_bookable' => true, 'access_mode' => 'public', 'member_booking_days' => null, 'guest_booking_days' => null, 'public_release_hours' => null, 'min_booking_minutes' => 30, 'max_booking_minutes' => 120, 'booking_step_minutes' => 30, 'payment_methods_override' => null ]; $data = CatalogValidator::common( $input, array_replace( $defaults, $current ) ); $data['payment_methods_override'] = array_key_exists('payment_methods_override',$input)||!$current?PaymentMethodAvailabilityService::override($data['payment_methods_override']):$data['payment_methods_override']; if($data['payment_methods_override']!==null)$data['payment_methods_override']=wp_json_encode($data['payment_methods_override']); $data['surface'] = MembershipValidator::text( $data['surface'], 'surface', 150, true ); $data['sport_id'] = CatalogValidator::integer( $data['sport_id'], 'sport_id', 1, PHP_INT_MAX, true ); if ( null !== $data['sport_id'] && ! $this->sports->find( $data['sport_id'] ) ) { CatalogValidator::invalid( 'sport_id', __( 'The selected sport does not exist.', 'abece-booking' ) ); } $data['resource_type'] = MembershipValidator::text( $data['resource_type'], 'resource_type', 50 ); $data['access_mode'] = CatalogValidator::choice( $data['access_mode'], 'access_mode', CatalogValidator::ACCESS_MODES ); foreach ( [ 'capacity', 'member_booking_days', 'guest_booking_days', 'public_release_hours' ] as $field ) { $minimum = 'capacity' === $field ? 0 : 1; // Preserve old zero horizons on unrelated edits; new values are positive or NULL. if ( ! array_key_exists( $field, $input ) && 0 === $data[$field] ) { continue; } $data[ $field ] = CatalogValidator::integer( $data[ $field ], $field, $minimum, 65535, true ); } if ( 'members_priority' === $data['access_mode'] && (null === $data['public_release_hours'] || $data['public_release_hours'] <= 0) && (array_key_exists('access_mode',$input)||array_key_exists('public_release_hours',$input)||!$current) ) { CatalogValidator::invalid('public_release_hours', __('Set a positive release period for member priority.', 'abece-booking')); } foreach ( [ 'min_booking_minutes', 'max_booking_minutes', 'booking_step_minutes' ] as $field ) { $data[ $field ] = CatalogValidator::integer( $data[ $field ], $field, 1, 65535 ); } if ( $data['min_booking_minutes'] > $data['max_booking_minutes'] ) { CatalogValidator::invalid( 'min_booking_minutes', __( 'Minimum booking duration must not exceed the maximum.', 'abece-booking' ) ); } foreach ( [ 'is_visible', 'is_bookable' ] as $field ) { $data[ $field ] = CatalogValidator::boolean( $data[ $field ], $field ); } $e=\ABeCe\Booking\Edition\Entitlements::current(); if(!$e->has('memberships')&&(($input['access_mode']??'public')!=='public'||isset($input['member_booking_days'])||isset($input['public_release_hours'])))$e->require('memberships'); return $data; } }