false, self::BASE_URL => '', self::CLIENT_ID => '', self::CLIENT_SECRET => '', self::BEARER_TOKEN => '', self::REFRESH_TOKEN => '', self::SYNC_ON_ORDER_CREATED => false, self::SYNC_ON_PAYMENT_COMPLETE => true, self::SYNC_FAILED_ORDERS => true, self::SYNC_ORDER_STATUSES => ['processing', 'completed', 'failed'], self::CONTACT_TAGS => 'woocommerce, customer', self::CONTACT_SEGMENTS => [], self::CONTACT_CAMPAIGNS => [], self::CONTACT_ACTIONS_NEW_ORDER_ONLY => true, self::USE_TRACKING_CONTACT_ID => true, self::TRACKING_CONTACT_COOKIE => 'mtc_id', self::SOURCE => 'woocommerce', self::SOURCE_TYPE => 'shop', self::TIMEOUT => 15, self::INCLUDE_PRIVATE_META => false, self::INCLUDE_ORDER_ITEM_META => true, self::ORDER_ITEM_FIELD_MAPPINGS => [], self::MAX_META_VALUE_LENGTH => 1000, self::DEBUG_LOGGING => false, self::TAX_TREATMENT_MAP => [], ]; public static function get(string $key, mixed $fallback = null): mixed { $default = $fallback ?? (self::$defaults[$key] ?? null); return get_option($key, $default); } public static function getBool(string $key): bool { return (bool) self::get($key); } public static function getInt(string $key): int { return (int) self::get($key); } public static function getString(string $key): string { return (string) self::get($key, ''); } public static function getArray(string $key): array { $value = self::get($key, []); return is_array($value) ? $value : []; } /** * Saved WooCommerce tax rate ID => Aivie tax treatment mapping. * * @return array */ public static function getTaxTreatmentMap(): array { $map = []; foreach (self::getArray(self::TAX_TREATMENT_MAP) as $rateId => $treatment) { if (is_string($treatment) && '' !== $treatment) { $map[(int) $rateId] = $treatment; } } return $map; } /** * Saved mapping rows from WooCommerce order item meta to Aivie order item fields. * * @return array */ public static function getOrderItemFieldMappings(): array { $mappings = []; foreach (self::getArray(self::ORDER_ITEM_FIELD_MAPPINGS) as $row) { if (! is_array($row)) { continue; } $sourceKey = trim((string) ($row['source_key'] ?? '')); $target = trim((string) ($row['target'] ?? '')); $transform = trim((string) ($row['transform'] ?? '')); if ('' === $sourceKey || '' === $target || '' === $transform) { continue; } $mappings[] = [ 'source_key' => $sourceKey, 'target' => $target, 'transform' => $transform, 'enabled' => ! empty($row['enabled']), ]; } return $mappings; } public static function getTags(): array { $raw = self::getString(self::CONTACT_TAGS); if ('' === $raw) { return []; } return array_map('trim', array_filter(explode(',', $raw))); } /** * @return int[] */ public static function getContactSegmentIds(): array { return self::getPositiveIntArray(self::CONTACT_SEGMENTS); } /** * @return int[] */ public static function getContactCampaignIds(): array { return self::getPositiveIntArray(self::CONTACT_CAMPAIGNS); } /** * @return int[] */ private static function getPositiveIntArray(string $key): array { $ids = array_map('absint', self::getArray($key)); $ids = array_filter($ids, static fn (int $id): bool => $id > 0); return array_values(array_unique($ids)); } public static function isEnabled(): bool { return self::getBool(self::ENABLED); } public static function getBaseUrl(): string { return rtrim(self::getString(self::BASE_URL), '/'); } public static function getBearerToken(): string { return self::getString(self::BEARER_TOKEN); } public static function getRefreshToken(): string { return self::getString(self::REFRESH_TOKEN); } public static function getClientId(): string { return self::getString(self::CLIENT_ID); } public static function getClientSecret(): string { return self::getString(self::CLIENT_SECRET); } public static function hasOAuthCredentials(): bool { return '' !== self::getClientId() && '' !== self::getClientSecret(); } public static function storeBearerToken(string $accessToken, string $refreshToken = ''): void { update_option(self::BEARER_TOKEN, $accessToken); if ('' !== $refreshToken) { update_option(self::REFRESH_TOKEN, $refreshToken); } } public static function deleteAll(): void { foreach (array_keys(self::$defaults) as $key) { delete_option($key); } } }