| @@ -380,8 +380,58 @@ | ||
| 380 | 380 | })); |
| 381 | 381 | } |
| 382 | 382 | |
| 383 | 383 | /** |
| 384 | + * The operator's own business address, one entry per line. | |
| 385 | + * | |
| 386 | + * Settings hold the address in separate fields (street, city, state, postcode, | |
| 387 | + * country) but documents only ever printed `company_address` — so everything | |
| 388 | + * after the street silently vanished and the address looked truncated at its | |
| 389 | + * final line. Composed the same way as {@see customerAddressLines()} so both | |
| 390 | + * sides of a document read identically. | |
| 391 | + * | |
| 392 | + * @return list<string> | |
| 393 | + */ | |
| 394 | + public static function companyAddressLines(): array | |
| 395 | + { | |
| 396 | + $get = static function (string $key): string { | |
| 397 | + return trim((string) \Yatra\Services\SettingsService::get($key, '')); | |
| 398 | + }; | |
| 399 | + | |
| 400 | + $street = $get('company_address'); | |
| 401 | + $city = $get('company_city'); | |
| 402 | + $state = $get('company_state'); | |
| 403 | + $zip = $get('company_zip'); | |
| 404 | + $countryRaw = $get('company_country'); | |
| 405 | + | |
| 406 | + // "City, State 12345" reads as one line; street and country get their own. | |
| 407 | + $locality = trim(implode(', ', array_filter([$city, $state]))); | |
| 408 | + if ($zip !== '') { | |
| 409 | + $locality = trim($locality . ' ' . $zip); | |
| 410 | + } | |
| 411 | + | |
| 412 | + $country = $countryRaw !== '' ? self::getCountryName($countryRaw) : ''; | |
| 413 | + | |
| 414 | + // The street field may itself carry line breaks (an operator pasting a full | |
| 415 | + // address), so keep those as separate lines rather than one run-on entry. | |
| 416 | + $lines = []; | |
| 417 | + foreach (preg_split('/\R/', $street) ?: [] as $streetLine) { | |
| 418 | + $streetLine = trim($streetLine); | |
| 419 | + if ($streetLine !== '') { | |
| 420 | + $lines[] = $streetLine; | |
| 421 | + } | |
| 422 | + } | |
| 423 | + | |
| 424 | + foreach ([$locality, $country] as $line) { | |
| 425 | + if ($line !== '') { | |
| 426 | + $lines[] = $line; | |
| 427 | + } | |
| 428 | + } | |
| 429 | + | |
| 430 | + return array_values($lines); | |
| 431 | + } | |
| 432 | + | |
| 433 | + /** | |
| 384 | 434 | * Canonical country list — single source of truth used by every |
| 385 | 435 | * country / nationality dropdown in both Free and Pro plugins. |
| 386 | 436 | * |
| 387 | 437 | * Returns the full ISO-3166-1 alpha-2 set (sovereign states + |
| @@ -750,10 +800,20 @@ | ||
| 750 | 800 | */ |
| 751 | 801 | public static function formatRatingStars(float $rating, bool $showNumber = false): string |
| 752 | 802 | { |
| 753 | 803 | $rating = max(0, min(5, $rating)); |
| 754 | - $fullStars = (int) floor($rating); | |
| 755 | - $hasHalfStar = ($rating - $fullStars) >= 0.5; | |
| 804 | + | |
| 805 | + // Rounds to the nearest half star (see yatra_rating_star_parts), so this | |
| 806 | + // renderer agrees with the confirmation page and reviews block. | |
| 807 | + if (function_exists('yatra_rating_star_parts')) { | |
| 808 | + $parts = yatra_rating_star_parts($rating); | |
| 809 | + $fullStars = $parts['full']; | |
| 810 | + $hasHalfStar = $parts['half']; | |
| 811 | + } else { | |
| 812 | + $halves = (int) round($rating * 2); | |
| 813 | + $fullStars = intdiv($halves, 2); | |
| 814 | + $hasHalfStar = ($halves % 2) === 1; | |
| 815 | + } | |
| 756 | 816 | |
| 757 | 817 | $html = '<span class="yatra-rating-stars">'; |
| 758 | 818 | |
| 759 | 819 | for ($i = 1; $i <= 5; $i++) { |