Skip to content

Commit 42d85ba

Browse files
committed
MC-35353: Localised region name is not showing on order page if it is edited
1 parent 735579d commit 42d85ba

File tree

4 files changed

+192
-8
lines changed

4 files changed

+192
-8
lines changed

app/code/Magento/Sales/Model/ResourceModel/Order/Address/Collection.php

Lines changed: 86 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,19 @@
66
namespace Magento\Sales\Model\ResourceModel\Order\Address;
77

88
use Magento\Sales\Api\Data\OrderAddressSearchResultInterface;
9-
use \Magento\Sales\Model\ResourceModel\Order\Collection\AbstractCollection;
9+
use Magento\Sales\Model\ResourceModel\Order\Collection\AbstractCollection;
10+
use Magento\Framework\Locale\ResolverInterface;
11+
use Magento\Framework\Data\Collection\EntityFactoryInterface;
12+
use Magento\Framework\Data\Collection\Db\FetchStrategyInterface;
13+
use Magento\Framework\Event\ManagerInterface;
14+
use Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot;
15+
use Magento\Framework\DB\Adapter\AdapterInterface;
16+
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
17+
use Magento\Framework\App\ObjectManager;
18+
use Psr\Log\LoggerInterface;
1019

1120
/**
12-
* Flat sales order payment collection
13-
*
14-
* @author Magento Core Team <core@magentocommerce.com>
21+
* Order addresses collection
1522
*/
1623
class Collection extends AbstractCollection implements OrderAddressSearchResultInterface
1724
{
@@ -29,6 +36,44 @@ class Collection extends AbstractCollection implements OrderAddressSearchResultI
2936
*/
3037
protected $_eventObject = 'order_address_collection';
3138

39+
/**
40+
* @var ResolverInterface
41+
*/
42+
private $localeResolver;
43+
44+
/**
45+
* @param EntityFactoryInterface $entityFactory
46+
* @param LoggerInterface $logger
47+
* @param FetchStrategyInterface $fetchStrategy
48+
* @param ManagerInterface $eventManager
49+
* @param Snapshot $entitySnapshot
50+
* @param AdapterInterface|null $connection
51+
* @param AbstractDb|null $resource
52+
* @param ResolverInterface|null $localeResolver
53+
*/
54+
public function __construct(
55+
EntityFactoryInterface $entityFactory,
56+
LoggerInterface $logger,
57+
FetchStrategyInterface $fetchStrategy,
58+
ManagerInterface $eventManager,
59+
Snapshot $entitySnapshot,
60+
AdapterInterface $connection = null,
61+
AbstractDb $resource = null,
62+
ResolverInterface $localeResolver = null
63+
) {
64+
$this->localeResolver = $localeResolver ?: ObjectManager::getInstance()
65+
->get(ResolverInterface::class);
66+
parent::__construct(
67+
$entityFactory,
68+
$logger,
69+
$fetchStrategy,
70+
$eventManager,
71+
$entitySnapshot,
72+
$connection,
73+
$resource
74+
);
75+
}
76+
3277
/**
3378
* Model initialization
3479
*
@@ -42,6 +87,16 @@ protected function _construct()
4287
);
4388
}
4489

90+
/**
91+
* @inheritdoc
92+
*/
93+
protected function _initSelect()
94+
{
95+
parent::_initSelect();
96+
$this->joinRegions();
97+
return $this;
98+
}
99+
45100
/**
46101
* Redeclare after load method for dispatch event
47102
*
@@ -55,4 +110,31 @@ protected function _afterLoad()
55110

56111
return $this;
57112
}
113+
114+
/**
115+
* Join region name table with current locale
116+
*
117+
* @return $this
118+
*/
119+
private function joinRegions()
120+
{
121+
$locale = $this->localeResolver->getLocale();
122+
$connection = $this->getConnection();
123+
124+
$defaultNameExpr = $connection->getIfNullSql(
125+
$connection->quoteIdentifier('rct.default_name'),
126+
$connection->quoteIdentifier('main_table.region')
127+
);
128+
$expression = $connection->getIfNullSql($connection->quoteIdentifier('rnt.name'), $defaultNameExpr);
129+
130+
$regionId = $connection->quoteIdentifier('main_table.region_id');
131+
$condition = $connection->quoteInto("rnt.locale=?", $locale);
132+
$rctTable = $this->getTable('directory_country_region');
133+
$rntTable = $this->getTable('directory_country_region_name');
134+
135+
$this->getSelect()
136+
->joinLeft(['rct' => $rctTable], "rct.region_id={$regionId}", [])
137+
->joinLeft(['rnt' => $rntTable], "rnt.region_id={$regionId} AND {$condition}", ['region' => $expression]);
138+
return $this;
139+
}
58140
}

dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderAddressUpdateTest.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\Sales\Service\V1;
78

89
use Magento\Sales\Api\Data\OrderAddressInterface as OrderAddress;
910
use Magento\TestFramework\TestCase\WebapiAbstract;
1011

1112
/**
12-
* Class OrderAddressUpdateTest
13+
* Test for address update
1314
*/
1415
class OrderAddressUpdateTest extends WebapiAbstract
1516
{
@@ -28,7 +29,7 @@ public function testOrderAddressUpdate()
2829
$order = $objectManager->get(\Magento\Sales\Model\Order::class)->loadByIncrementId('100000001');
2930

3031
$address = [
31-
OrderAddress::REGION => 'CA',
32+
OrderAddress::REGION => 'California',
3233
OrderAddress::POSTCODE => '11111',
3334
OrderAddress::LASTNAME => 'lastname',
3435
OrderAddress::STREET => ['street'],
@@ -75,7 +76,7 @@ public function testOrderAddressUpdate()
7576
$billingAddress = $actualOrder->getBillingAddress();
7677

7778
$validate = [
78-
OrderAddress::REGION => 'CA',
79+
OrderAddress::REGION => 'California',
7980
OrderAddress::POSTCODE => '11111',
8081
OrderAddress::LASTNAME => 'lastname',
8182
OrderAddress::STREET => 'street',

dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderGetTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public function testOrderGet(): void
7676
'city' => 'Los Angeles',
7777
'email' => 'customer@null.com',
7878
'postcode' => '11111',
79-
'region' => 'CA'
79+
'region' => 'California'
8080
];
8181

8282
$result = $this->makeServiceCall(self::ORDER_INCREMENT_ID);
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Sales\Model\ResourceModel\Order\Address;
9+
10+
use Magento\Store\Model\StoreManagerInterface;
11+
use Magento\Sales\Model\Order\Payment;
12+
use Magento\Sales\Model\Order;
13+
use Magento\Sales\Api\Data\OrderAddressInterface as OrderAddress;
14+
use Magento\Backend\Model\Locale\Resolver;
15+
use Magento\Framework\Locale\ResolverInterface;
16+
use Magento\TestFramework\Helper\Bootstrap;
17+
use PHPUnit\Framework\MockObject\MockObject;
18+
use PHPUnit\Framework\TestCase;
19+
20+
/**
21+
* Test for address collection
22+
*
23+
* @magentoAppArea adminhtml
24+
*/
25+
class CollectionTest extends TestCase
26+
{
27+
/**
28+
* @var ResolverInterface|MockObject
29+
*/
30+
private $localeResolverMock;
31+
32+
/**
33+
* @var CollectionFactory
34+
*/
35+
private $addressCollectionFactory;
36+
37+
/**
38+
* @inheritdoc
39+
*/
40+
protected function setUp(): void
41+
{
42+
$this->localeResolverMock = $this->createMock(ResolverInterface::class);
43+
Bootstrap::getObjectManager()->removeSharedInstance(ResolverInterface::class);
44+
Bootstrap::getObjectManager()->removeSharedInstance(Resolver::class);
45+
Bootstrap::getObjectManager()->addSharedInstance($this->localeResolverMock, ResolverInterface::class);
46+
Bootstrap::getObjectManager()->addSharedInstance($this->localeResolverMock, Resolver::class);
47+
48+
$addressData = [
49+
OrderAddress::REGION => 'Alabama',
50+
OrderAddress::REGION_ID => '1',
51+
OrderAddress::POSTCODE => '11111',
52+
OrderAddress::LASTNAME => 'lastname',
53+
OrderAddress::FIRSTNAME => 'firstname',
54+
OrderAddress::STREET => 'street',
55+
OrderAddress::CITY => 'Montgomery',
56+
OrderAddress::EMAIL => 'admin@example.com',
57+
OrderAddress::TELEPHONE => '11111111',
58+
OrderAddress::COUNTRY_ID => 'US'
59+
];
60+
$billingAddress = Bootstrap::getObjectManager()->create(OrderAddress::class, ['data' => $addressData]);
61+
$billingAddress->setAddressType('billing');
62+
$shippingAddress = clone $billingAddress;
63+
$shippingAddress->setId(null)->setAddressType('shipping');
64+
$payment = Bootstrap::getObjectManager()->create(Payment::class);
65+
$payment->setMethod('payflowpro')
66+
->setCcExpMonth('5')
67+
->setCcLast4('0005')
68+
->setCcType('AE')
69+
->setCcExpYear('2022');
70+
$order = Bootstrap::getObjectManager()->create(Order::class);
71+
$order->setIncrementId('100000001')
72+
->setSubtotal(100)
73+
->setBaseSubtotal(100)
74+
->setCustomerEmail('admin@example.com')
75+
->setCustomerIsGuest(true)
76+
->setBillingAddress($billingAddress)
77+
->setShippingAddress($shippingAddress)
78+
->setStoreId(Bootstrap::getObjectManager()->get(StoreManagerInterface::class)->getStore()->getId())
79+
->setPayment($payment);
80+
$order->save();
81+
82+
$this->addressCollectionFactory = Bootstrap::getObjectManager()->get(CollectionFactory::class);
83+
}
84+
85+
/**
86+
* @magentoDataFixture Magento/Directory/_files/region_name_jp.php
87+
*/
88+
public function testCollectionWithJpLocale(): void
89+
{
90+
$locale = 'JA_jp';
91+
$this->localeResolverMock->method('getLocale')->willReturn($locale);
92+
93+
$order = Bootstrap::getObjectManager()->create(Order::class)
94+
->loadByIncrementId('100000001');
95+
96+
$collection = $this->addressCollectionFactory->create()->setOrderFilter($order);
97+
foreach ($collection as $address) {
98+
$this->assertEquals('アラバマ', $address->getData(OrderAddress::REGION));
99+
}
100+
}
101+
}

0 commit comments

Comments
 (0)