Below Code is working for me.
Create required custom module files.
Setup/UpgradeSchema.php
<?php
namespace Custom\Module\Setup;
use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
class UpgradeSchema implements UpgradeSchemaInterface
{
public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
$setup->startSetup();
if (version_compare($context->getVersion(), '3.0.0', '<')) {
$setup->getConnection()->addColumn(
$setup->getTable('quote'),
'po_number',
[
'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
'nullable' => false,
'comment' => 'PO Number'
]
);
$setup->getConnection()->addColumn(
$setup->getTable('sales_order'),
'po_number',
[
'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
'nullable' => false,
'comment' => 'PO Number'
]
);
$setup->getConnection()->addColumn(
$setup->getTable('sales_order_grid'),
'po_number',
[
'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
'nullable' => false,
'comment' => 'PO Number'
]
);
}
$setup->endSetup();
}
}
etc/extension_attributes.xml
<extension_attributes for="Magento\Quote\Api\Data\PaymentInterface">
<attribute code="po_number" type="string"/>
</extension_attributes>
etc/di.xml
<virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid">
<arguments>
<argument name="columns" xsi:type="array">
<item name="po_number" xsi:type="string">sales_order.po_number</item>
</argument>
</arguments>
</virtualType>
<type name="Magento\Checkout\Api\PaymentInformationManagementInterface">
<plugin name="order_ponumber_save-in-order" type="Custom\Module\Plugin\Checkout\PaymentInformationManagementPlugin" sortOrder="10"/>
</type>
Custom/Module/Plugin/Checkout/PaymentInformationManagementPlugin.php
<?php
namespace Custom\Module\Plugin\Checkout;
use Magento\Quote\Api\Data\AddressInterface;
class PaymentInformationManagementPlugin
{
protected $orderRepository;
protected $paymentFactory;
protected $logger;
protected $quoteRepository;
public function __construct(
\Magento\Sales\Api\OrderRepositoryInterface $orderRepository,
\Magento\Quote\Api\Data\PaymentExtensionFactory $paymentFactory,
\Psr\Log\LoggerInterface $logger,
\Magento\Quote\Api\CartRepositoryInterface $quoteRepository
)
{
$this->orderRepository = $orderRepository;
$this->paymentFactory = $paymentFactory;
$this->logger = $logger;
$this->quoteRepository = $quoteRepository;
}
public function beforeSavePaymentInformationAndPlaceOrder(
\Magento\Checkout\Api\PaymentInformationManagementInterface $subject,
$cartId,
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod
)
{
if ($paymentMethod->getExtensionAttributes()->getPoNumber()) {
$quote = $this->quoteRepository->getActive($cartId);
$quote->setPoNumber($paymentMethod->getExtensionAttributes()->getPoNumber());
$this->quoteRepository->save($quote);
}
}
}
etc/events.xml
<event name="sales_model_service_quote_submit_before">
<observer name="sales_model_service_quote_submit_before" instance="Custom\Module\Observer\SalesModelServiceQuoteSubmitBefore"/>
</event>
Custom/Module/Observer/SalesModelServiceQuoteSubmitBefore.php
<?php
namespace Custom\Module\Observer;
class SalesModelServiceQuoteSubmitBefore implements \Magento\Framework\Event\ObserverInterface
{
protected $logger;
protected $objectCopyService;
private $quoteRepository;
public function __construct(
\Psr\Log\LoggerInterface $logger,
\Magento\Framework\DataObject\Copy $objectCopyService,
\Magento\Quote\Model\QuoteRepository $quoteRepository
)
{
$this->logger = $logger;
$this->objectCopyService = $objectCopyService;
$this->quoteRepository = $quoteRepository;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
$order = $observer->getEvent()->getOrder();
$quote = $observer->getEvent()->getQuote();
$quotes = $this->quoteRepository->get($order->getQuoteId());
if ($quotes->getPoNumber()) {
$order->setPoNumber($quotes->getPoNumber());
}
return $this;
}
}
API - /V1/carts/mine/payment-information
Request:
{
"billingAddress":{
"countryId":"IN",
"regionId":"564",
"regionCode":"TG",
"region":"Telangana",
"street":[
"high tech city"
],
"company":"pt",
"telephone":"09878787878",
"postcode":"500005",
"city":"sadsad",
"firstname":"sdasd",
"lastname":"sadsd",
"saveInAddressBook":null,
"extension_attributes": {
"landmark": "test"
}
},
"paymentMethod":{
"method":"ccavenue",
"extension_attributes":{
"po_number":"1996"
}
}
}