| @@ -16,8 +16,9 @@ | ||
| 16 | 16 | use FluentCart\App\Models\ProductVariation; |
| 17 | 17 | use FluentCart\App\Models\Subscription; |
| 18 | 18 | use FluentCart\App\Modules\Subscriptions\Services\SystemChargeService; |
| 19 | 19 | use FluentCart\App\Services\Payments\PaymentHelper; |
| 20 | +use FluentCart\App\Services\Renderer\CheckoutFieldsSchema; | |
| 20 | 21 | use FluentCart\Framework\Support\Arr; |
| 21 | 22 | |
| 22 | 23 | class OrderService |
| 23 | 24 | { |
| @@ -81,13 +82,24 @@ | ||
| 81 | 82 | private static function finalizeAddress($address, $type): array |
| 82 | 83 | { |
| 83 | 84 | $fullName = Arr::get($address, 'full_name', ''); |
| 84 | 85 | $name = Arr::get($address, 'name', ''); |
| 86 | + $explicitFirstName = trim((string) Arr::get($address, 'first_name', '')); | |
| 87 | + $explicitLastName = trim((string) Arr::get($address, 'last_name', '')); | |
| 85 | 88 | $address['full_name'] = $fullName ?? $name; |
| 86 | 89 | $address['first_name'] = AddressHelper::guessFirstNameAndLastName($address['full_name']); |
| 87 | 90 | $address['type'] = $type; |
| 88 | 91 | $name = $fullName ?? $name; |
| 89 | - $address = array_merge($address, AddressHelper::guessFirstNameAndLastName($name)); | |
| 92 | + | |
| 93 | + // In First/Last mode the customer typed both names, so keep them as | |
| 94 | + // typed. Guessing from the joined name would turn "Alex" + "de Silva" | |
| 95 | + // into "Alex de" + "Silva". Full-name-only addresses are still guessed. | |
| 96 | + if (!CheckoutFieldsSchema::isFullNameRequired() && $explicitFirstName !== '') { | |
| 97 | + $address['first_name'] = $explicitFirstName; | |
| 98 | + $address['last_name'] = $explicitLastName; | |
| 99 | + } else { | |
| 100 | + $address = array_merge($address, AddressHelper::guessFirstNameAndLastName($name)); | |
| 101 | + } | |
| 90 | 102 | $address['name'] = Arr::get($address, 'first_name', '') . ' ' . Arr::get($address, 'last_name', ''); |
| 91 | 103 | return $address; |
| 92 | 104 | } |
| 93 | 105 | |