wpdb;$count=$wpdb->get_var($wpdb->prepare('SELECT COUNT(*) FROM %i WHERE is_active=1 AND is_bookable=1',$this->table));$this->checkRead();return (int)$count;} public function serializeCapacityWrites(callable $operation):mixed{ $wpdb = $this->wpdb;$key=\ABeCe\Booking\Infrastructure\Database\Tables::lock($wpdb,'resources');if((string)$wpdb->get_var($wpdb->prepare('SELECT GET_LOCK(%s,10)',$key))!=='1')throw new \ABeCe\Booking\Domain\CatalogException('abece_booking_resource_busy',__('Another resource change is in progress. Try again.','abece-booking'),409);try{return $operation();}finally{$wpdb->get_var($wpdb->prepare('SELECT RELEASE_LOCK(%s)',$key));}} public function suggestionData(?int $sport): array { $wpdb = $this->wpdb; $max=$wpdb->get_var($wpdb->prepare('SELECT MAX(sort_order) FROM %i',$this->table));$this->checkRead(); $names=$sport===null?[]:$wpdb->get_col($wpdb->prepare('SELECT name FROM %i WHERE sport_id=%d',$this->table,$sport));$this->checkRead();return ['max_sort_order'=>$max===null?0:(int)$max,'names'=>$names]; } public function __construct( \wpdb $wpdb ) { parent::__construct( $wpdb, 'resources' ); } public function serialize( array $row ): array { $row=parent::serialize($row); if(array_key_exists('payment_methods_override',$row)&&is_string($row['payment_methods_override']))$row['payment_methods_override']=json_decode($row['payment_methods_override'],true);return \ABeCe\Booking\Edition\Modules::current()->resourceProjection($row); } public function transaction( ?array $ids, callable $operation ): mixed { return ( new ResourceLockRepository( $this->wpdb ) )->run( $ids, $operation ); } /** Public projection only; admin catalog remains protected. */ public function bookingOptions(bool $admin=false): array { $wpdb = $this->wpdb; if($admin){ $rows = $wpdb->get_results( $wpdb->prepare( 'SELECT id, sport_id, name, resource_type, capacity, min_booking_minutes, max_booking_minutes, booking_step_minutes FROM %i WHERE is_active = 1 AND is_bookable = 1 ORDER BY sort_order, name, id', $this->table ), ARRAY_A ); }else{ $rows = $wpdb->get_results( $wpdb->prepare( 'SELECT id, sport_id, name, resource_type, capacity, min_booking_minutes, max_booking_minutes, booking_step_minutes FROM %i WHERE is_active = 1 AND is_bookable = 1 AND is_visible=1 ORDER BY sort_order, name, id', $this->table ), ARRAY_A ); } $this->checkRead(); return array_map( [ $this, 'serialize' ], $rows ); } }