Skip to content

Commit 40a144d

Browse files
committed
ACP2E-279: Customer details are lost after editing an order.
1 parent 2e8f212 commit 40a144d

File tree

4 files changed

+184
-124
lines changed

4 files changed

+184
-124
lines changed

app/code/Magento/Sales/Model/AdminOrder/Create.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,6 +2008,7 @@ public function createOrder()
20082008
$oldOrder->setRelationChildId($order->getId());
20092009
$oldOrder->setRelationChildRealId($order->getIncrementId());
20102010
$oldOrder->save();
2011+
$this->updateGuestName($oldOrder, $order);
20112012
$this->orderManagement->cancel($oldOrder->getEntityId());
20122013
$order->save();
20132014
}
@@ -2020,6 +2021,25 @@ public function createOrder()
20202021
return $order;
20212022
}
20222023

2024+
/**
2025+
* Update guest name after create order
2026+
*
2027+
* @param Order $oldOrder
2028+
* @param Order $order
2029+
* @return Order
2030+
*/
2031+
private function updateGuestName(Order $oldOrder, Order $order): Order
2032+
{
2033+
if ($order->getCustomerIsGuest()) {
2034+
$order->setCustomerFirstname($oldOrder->getCustomerFirstname());
2035+
$order->setCustomerLastname($oldOrder->getCustomerLastname());
2036+
if ($oldOrder->getMiddlename() === null) {
2037+
$order->setCustomerMiddlename($oldOrder->getCustomerMiddlename());
2038+
}
2039+
}
2040+
return $order;
2041+
}
2042+
20232043
/**
20242044
* Validate quote data before order creation
20252045
*

app/code/Magento/Sales/Test/Unit/Model/AdminOrder/CreateTest.php

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,14 @@
2020
use Magento\Framework\App\RequestInterface;
2121
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
2222
use Magento\Quote\Api\CartRepositoryInterface;
23+
use Magento\Quote\Api\CartManagementInterface;
2324
use Magento\Quote\Model\Quote;
25+
use Magento\Quote\Model\Quote\Payment;
26+
use Magento\Payment\Model\MethodInterface;
2427
use Magento\Quote\Model\Quote\Address;
2528
use Magento\Quote\Model\Quote\Item;
29+
use Magento\Catalog\Model\Product;
30+
use Magento\Catalog\Model\Product\Type\AbstractType;
2631
use Magento\Quote\Model\Quote\Item\Updater;
2732
use Magento\Quote\Model\QuoteFactory;
2833
use Magento\Sales\Model\AdminOrder\Create;
@@ -51,6 +56,11 @@ class CreateTest extends TestCase
5156
*/
5257
private $quoteRepository;
5358

59+
/**
60+
* @var CartManagementInterface|MockObject
61+
*/
62+
private $quoteManagement;
63+
5464
/**
5565
* @var QuoteFactory|MockObject
5666
*/
@@ -104,6 +114,10 @@ protected function setUp(): void
104114
$this->formFactory = $this->createPartialMock(FormFactory::class, ['create']);
105115
$this->quoteFactory = $this->createPartialMock(QuoteFactory::class, ['create']);
106116
$this->customerFactory = $this->createPartialMock(CustomerInterfaceFactory::class, ['create']);
117+
$this->quoteManagement = $this->getMockBuilder(CartManagementInterface::class)
118+
->disableOriginalConstructor()
119+
->setMethods(['submit'])
120+
->getMockForAbstractClass();
107121

108122
$this->itemUpdater = $this->createMock(Updater::class);
109123

@@ -117,6 +131,7 @@ protected function setUp(): void
117131
->setMethods(
118132
[
119133
'getQuote',
134+
'getOrder',
120135
'getStoreId',
121136
'getCustomerId',
122137
'setData',
@@ -134,6 +149,8 @@ protected function setUp(): void
134149
$storeMock = $this->getMockBuilder(StoreInterface::class)
135150
->setMethods(['getId'])
136151
->getMockForAbstractClass();
152+
$storeMock->method('getId')
153+
->willReturn(1);
137154
$this->sessionQuote->method('getStore')
138155
->willReturn($storeMock);
139156

@@ -161,6 +178,15 @@ protected function setUp(): void
161178
'getShippingAddress',
162179
'getBillingAddress',
163180
'getCouponCode',
181+
'getCustomerFirstname',
182+
'getCustomerLastname',
183+
'getCustomerMiddlename',
184+
'getIncrementId',
185+
'getOriginalIncrementId',
186+
'getEditIncrement',
187+
'setRelationChildId',
188+
'setRelationChildRealId',
189+
'save',
164190
]
165191
)
166192
->getMock();
@@ -178,6 +204,7 @@ protected function setUp(): void
178204
'dataObjectHelper' => $this->dataObjectHelper,
179205
'quoteRepository' => $this->quoteRepository,
180206
'quoteFactory' => $this->quoteFactory,
207+
'quoteManagement' => $this->quoteManagement,
181208
]
182209
);
183210
}
@@ -461,4 +488,141 @@ public function testInitFromOrder()
461488

462489
$this->adminOrderCreate->initFromOrder($this->orderMock);
463490
}
491+
492+
public function testCreateOrder()
493+
{
494+
$method = $this->getMockBuilder(MethodInterface::class)
495+
->disableOriginalConstructor()
496+
->setMethods(
497+
[
498+
'isAvailable',
499+
'validate',
500+
]
501+
)
502+
->getMockForAbstractClass();
503+
$method->method('isAvailable')
504+
->willReturn(true);
505+
$method->method('validate')
506+
->willReturn(true);
507+
$payment = $this->getMockBuilder(Payment::class)
508+
->disableOriginalConstructor()
509+
->setMethods(
510+
[
511+
'getMethod',
512+
'getMethodInstance',
513+
]
514+
)
515+
->getMock();
516+
$payment->method('getMethod')
517+
->willReturn('checkmo');
518+
$payment->method('getMethodInstance')
519+
->willReturn($method);
520+
521+
$type = $this->getMockBuilder(AbstractType::class)
522+
->disableOriginalConstructor()
523+
->setMethods(
524+
[
525+
'getOrderOptions',
526+
]
527+
)
528+
->getMockForAbstractClass();
529+
$type->method('getOrderOptions')
530+
->willReturn(false);
531+
532+
$product = $this->getMockBuilder(Product::class)
533+
->disableOriginalConstructor()
534+
->setMethods(
535+
[
536+
'getTypeInstance',
537+
]
538+
)
539+
->getMockForAbstractClass();
540+
$product->method('getTypeInstance')
541+
->willReturn($type);
542+
543+
$item = $this->getMockBuilder(Item::class)
544+
->disableOriginalConstructor()
545+
->setMethods(
546+
[
547+
'getHasError',
548+
'getProduct',
549+
'getOptionByCode',
550+
]
551+
)
552+
->getMockForAbstractClass();
553+
$item->method('getHasError')
554+
->willReturn(false);
555+
$item->method('getProduct')
556+
->willReturn($product);
557+
$item->method('getOptionByCode')
558+
->willReturn(false);
559+
$items = [
560+
$item
561+
];
562+
563+
$quote = $this->getMockBuilder(Quote::class)
564+
->disableOriginalConstructor()
565+
->setMethods(
566+
[
567+
'getCustomerIsGuest',
568+
'getAllItems',
569+
'isVirtual',
570+
'getPayment',
571+
'getItemById',
572+
]
573+
)
574+
->getMock();
575+
$quote->method('getCustomerIsGuest')
576+
->willReturn(true);
577+
$quote->method('getAllItems')
578+
->willReturn($items);
579+
$quote->method('isVirtual')
580+
->willReturn(true);
581+
$quote->method('getPayment')
582+
->willReturn($payment);
583+
$quote->method('getItemById')
584+
->willReturn($item);
585+
586+
$this->sessionQuote
587+
->method('getQuote')
588+
->willReturn($quote);
589+
$this->orderMock->method('getId')
590+
->willReturn(1);
591+
$this->orderMock->method('getCustomerFirstname')
592+
->willReturn('firstname');
593+
$this->orderMock->method('getCustomerLastname')
594+
->willReturn('lastname');
595+
$this->orderMock->method('getCustomerMiddlename')
596+
->willReturn('middlename');
597+
$this->orderMock->method('getIncrementId')
598+
->willReturn('100000001');
599+
$this->orderMock->method('getEditIncrement')
600+
->willReturn(0);
601+
$this->sessionQuote
602+
->method('getOrder')
603+
->willReturn($this->orderMock);
604+
605+
$guestOrder = $this->getMockBuilder(Order::class)
606+
->disableOriginalConstructor()
607+
->setMethods(
608+
[
609+
'getId',
610+
'getIncrementId',
611+
'getCustomerIsGuest',
612+
'save',
613+
]
614+
)
615+
->getMock();
616+
$guestOrder->method('getId')
617+
->willReturn(2);
618+
$guestOrder->method('getIncrementId')
619+
->willReturn('100000001-1');
620+
$guestOrder->method('getCustomerIsGuest')
621+
->willReturn(true);
622+
$this->quoteManagement->method('submit')
623+
->willReturn($guestOrder);
624+
625+
$object = $this->adminOrderCreate->createOrder();
626+
self::assertEquals($this->orderMock->getCustomerFirstname(), $object->getCustomerFirstname());
627+
}
464628
}

app/code/Magento/Sales/Test/Unit/Plugin/Model/AdminOrder/GuestNameUpdateTest.php

Lines changed: 0 additions & 121 deletions
This file was deleted.

app/code/Magento/Sales/etc/adminhtml/di.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,4 @@
5151
<type name="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
5252
<plugin name="orderGridCollectionFilterPlugin" type="Magento\Sales\Plugin\Model\ResourceModel\Order\OrderGridCollectionFilter"/>
5353
</type>
54-
<type name="Magento\Sales\Model\AdminOrder\Create">
55-
<plugin name="guestNameUpdate" type="Magento\Sales\Plugin\Model\AdminOrder\GuestNameUpdate"/>
56-
</type>
5754
</config>

0 commit comments

Comments
 (0)