wpdb; if($range=BookingReadScope::range()){ [$from,$to]=$range; $rows=BookingReadScope::remember($wpdb,'series-occupied:'.$resource_id,function()use($resource_id,$from,$to){ $wpdb = $this->wpdb; $out=[];foreach(['resource_blocks','bookings']as $suffix){$extra=$suffix==='bookings'?" AND status NOT IN ('cancelled','voided')":'';$items=$wpdb->get_results($wpdb->prepare('SELECT id,starts_at,ends_at FROM %i WHERE (resource_id IS NULL OR resource_id=%d) AND starts_at<%s AND ends_at>%s'.$extra,\ABeCe\Booking\Infrastructure\Database\Tables::name( $wpdb, $suffix ),$resource_id,$to,$from),ARRAY_A);if($wpdb->last_error)throw new CatalogException('abece_booking_database_error',__('The items could not be loaded. Please try again.','abece-booking'),500);foreach($items as $row)$out[]=$row+['kind'=>$suffix];}return $out; }); return array_values(array_filter($rows,static fn($r)=>($r['kind']!=='bookings'||(int)$r['id']!==($exclude??0))&&$r['starts_at']<$ends_at&&$r['ends_at']>$starts_at)); } $intervals = []; foreach ( [ 'resource_blocks', 'bookings' ] as $suffix ) { $condition = 'bookings' === $suffix ? " AND status NOT IN ('cancelled','voided') AND id <> " . (int) ( $exclude ?? 0 ) : ''; $rows = $wpdb->get_results( $wpdb->prepare( 'SELECT starts_at, ends_at FROM %i WHERE (resource_id IS NULL OR resource_id = %d) AND starts_at < %s AND ends_at > %s' . $condition, \ABeCe\Booking\Infrastructure\Database\Tables::name( $wpdb, $suffix ), $resource_id, $ends_at, $starts_at ), ARRAY_A ); if ( $wpdb->last_error ) { throw new CatalogException( 'abece_booking_database_error', __( 'The items could not be loaded. Please try again.', 'abece-booking' ), 500 ); } $intervals = array_merge( $intervals, $rows ); } return $intervals; } }