*/ public static function all(): array { return [ self::ACCESS_ADMIN => esc_html__('Access DayTidy admin', 'daytidy'), self::MANAGE_SETTINGS => esc_html__('Manage DayTidy settings', 'daytidy'), self::MANAGE_OFFERINGS => esc_html__('Manage offerings', 'daytidy'), self::MANAGE_BOOKINGS => esc_html__('Manage bookings', 'daytidy'), self::MANAGE_RESOURCES => esc_html__('Manage resources', 'daytidy'), self::VIEW_REPORTS => esc_html__('View reports', 'daytidy'), self::MANAGE_CUSTOMERS => esc_html__('Manage customers', 'daytidy'), self::ACCESS_FRONTEND_DASHBOARD => esc_html__('Access frontend dashboard', 'daytidy'), self::MANAGE_OWN_SCHEDULE => esc_html__('Manage own schedule', 'daytidy'), self::MANAGE_OWN_RESOURCES => esc_html__('Manage own resources', 'daytidy'), ]; } /** * @return array */ public static function roleLabels(): array { return [ self::ROLE_BOOKING_MANAGER => esc_html__('DayTidy Booking Manager', 'daytidy'), self::ROLE_STAFF_PROVIDER => esc_html__('DayTidy Staff / Provider', 'daytidy'), ]; } /** * @return array */ public static function roleCapabilities(): array { $capabilities = [ 'administrator' => array_keys(self::all()), self::ROLE_BOOKING_MANAGER => [ self::READ, self::UPLOAD_FILES, self::ACCESS_ADMIN, self::MANAGE_OFFERINGS, self::MANAGE_BOOKINGS, self::MANAGE_RESOURCES, self::VIEW_REPORTS, self::MANAGE_CUSTOMERS, self::ACCESS_FRONTEND_DASHBOARD, self::MANAGE_OWN_SCHEDULE, self::MANAGE_OWN_RESOURCES, ], self::ROLE_STAFF_PROVIDER => [ self::READ, self::UPLOAD_FILES, self::ACCESS_FRONTEND_DASHBOARD, self::MANAGE_OWN_SCHEDULE, self::MANAGE_OWN_RESOURCES, ], ]; /** @var array $capabilities */ $capabilities = (array) apply_filters('DayTidy/F__DayTidy/Capabilities__roleCapabilities/capabilities', $capabilities); return $capabilities; } public static function maybeSync(): void { if (get_option(self::OPTION_KEY) === self::VERSION) return; self::sync(); } public static function sync(): void { foreach (self::roleCapabilities() as $role => $capabilities) { $role_object = get_role($role); if (!$role_object && $role !== 'administrator') { add_role($role, self::roleLabels()[$role] ?? $role, array_fill_keys($capabilities, true)); $role_object = get_role($role); } if (!$role_object) continue; foreach ($capabilities as $capability) { $role_object->add_cap($capability); } } update_option(self::OPTION_KEY, self::VERSION, false); } /** * @return array */ public static function postTypeCapabilities(string $capability): array { return [ 'edit_post' => $capability, 'read_post' => $capability, 'delete_post' => $capability, 'edit_posts' => $capability, 'edit_others_posts' => $capability, 'delete_posts' => $capability, 'publish_posts' => $capability, 'read_private_posts' => $capability, 'delete_private_posts' => $capability, 'delete_published_posts' => $capability, 'delete_others_posts' => $capability, 'edit_private_posts' => $capability, 'edit_published_posts' => $capability, 'create_posts' => $capability, ]; } /** * @return array */ public static function taxonomyCapabilities(string $capability): array { return [ 'manage_terms' => $capability, 'edit_terms' => $capability, 'delete_terms' => $capability, 'assign_terms' => $capability, ]; } public static function canAccessFrontendDashboard(): bool { if (!is_user_logged_in()) return false; foreach ([self::ACCESS_FRONTEND_DASHBOARD, self::MANAGE_OFFERINGS, self::MANAGE_BOOKINGS, self::MANAGE_RESOURCES] as $capability) { if (current_user_can($capability)) return true; } return false; } public static function canCreateOffering(): bool { return current_user_can(self::MANAGE_OFFERINGS) || current_user_can(self::MANAGE_OWN_SCHEDULE); } public static function canManageOffering(int $offering_id): bool { if ($offering_id <= 0) return self::canCreateOffering(); if (current_user_can(self::MANAGE_OFFERINGS)) return true; if (!current_user_can(self::MANAGE_OWN_SCHEDULE)) return false; $post = get_post($offering_id); if (!$post || $post->post_type !== Offering::PT) return false; $user_id = get_current_user_id(); return $user_id > 0 && absint($post->post_author) === $user_id; } public static function canDeleteOffering(int $offering_id): bool { return self::canManageOffering($offering_id); } public static function canManageAllOfferings(): bool { return current_user_can(self::MANAGE_OFFERINGS); } public static function canManageAllResources(): bool { return current_user_can(self::MANAGE_RESOURCES); } public static function canManageOwnResources(): bool { return current_user_can(self::MANAGE_RESOURCES) || current_user_can(self::MANAGE_OWN_RESOURCES); } }