how can I add a custom column into an order invoice table and use extension attribute to save some data in this column via REST Api.
thank you!!
Hi thank you very much for your answer, it seems to work when retrieving data but when i tried to create invoice via postman using
/rest/default/V1/order/{orderId}/invoice
{ "capture": true, "items": [ { "extension_attributes": {}, "order_item_id": 0, "qty": 0 } ], "notify": true, "appendComment": true, "comment": { "extension_attributes": {}, "comment": "string", "is_visible_on_front": 0 }, "arguments": { "extension_attributes": { "custom_column": "My Custom Value"} } }
it throws me an error
"message": ""%fieldName" is not supported. Correct the field name and try again.", "parameters": { "fieldName": "CustomColumn" },
1 Answer 1
1. Add a Custom Column to the Sales Invoice Table
Create a Setup Upgrade Schema to add a custom column.You Can use the db_schema.xml as well to create the column.
Create app/code/Vendor/Module/Setup/UpgradeSchema.php
<?php
namespace Vendor\Module\Setup;
use Magento\Framework\DB\Ddl\Table;
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(), '1.0.1', '<')) {
$connection = $setup->getConnection();
$tableName = $setup->getTable('sales_invoice');
if (!$connection->tableColumnExists($tableName, 'custom_column')) {
$connection->addColumn(
$tableName,
'custom_column',
[
'type' => Table::TYPE_TEXT,
'nullable' => true,
'length' => 255,
'comment' => 'Custom Column for Invoice'
]
);
}
}
$setup->endSetup();
}
}
Run the Upgrade Command
php bin/magento setup:upgrade
2. Create an Extension Attribute for the Invoice
Extension attributes allow you to add custom fields to Magento's core APIs.
Create app/code/Vendor/Module/etc/extension_attributes.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Sales\Api\Data\InvoiceInterface">
<attribute code="custom_column" type="string"/>
</extension_attributes>
</config>
3. Create a Plugin to Handle Extension Attribute Save
We need a plugin to save the data in the custom column when an invoice is created via REST API.
Create app/code/Vendor/Module/Plugin/InvoiceRepositoryPlugin.php
<?php
namespace Vendor\Module\Plugin;
use Magento\Sales\Api\Data\InvoiceExtensionFactory;
use Magento\Sales\Api\Data\InvoiceInterface;
use Magento\Sales\Api\InvoiceRepositoryInterface;
use Magento\Framework\Api\SearchResultsInterface;
class InvoiceRepositoryPlugin
{
protected $extensionFactory;
public function __construct(InvoiceExtensionFactory $extensionFactory)
{
$this->extensionFactory = $extensionFactory;
}
/**
* Load custom column into invoice extension attribute
*/
public function afterGet(
InvoiceRepositoryInterface $subject,
InvoiceInterface $result
) {
$extensionAttributes = $result->getExtensionAttributes() ?? $this->extensionFactory->create();
$result->setExtensionAttributes($extensionAttributes);
$extensionAttributes->setCustomColumn($result->getData('custom_column'));
return $result;
}
/**
* Load custom column into invoice extension attributes in getList
*/
public function afterGetList(
InvoiceRepositoryInterface $subject,
SearchResultsInterface $searchResults
) {
foreach ($searchResults->getItems() as $invoice) {
$this->afterGet($subject, $invoice);
}
return $searchResults;
}
/**
* Save custom column from extension attribute
*/
public function beforeSave(
InvoiceRepositoryInterface $subject,
InvoiceInterface $invoice
) {
$extensionAttributes = $invoice->getExtensionAttributes();
if ($extensionAttributes && $extensionAttributes->getCustomColumn()) {
$invoice->setData('custom_column', $extensionAttributes->getCustomColumn());
}
}
}
4. Expose the Extension Attribute in di.xml
Create app/code/Vendor/Module/etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework/ObjectManager/etc/config.xsd">
<type name="Magento\Sales\Api\Data\InvoiceInterface">
<plugin name="add_custom_column_invoice_repository_plugin"
type="Vendor\Module\Plugin\InvoiceRepositoryPlugin" sortOrder="10"/>
</type>
</config>
5. Verify the REST API
Now, when you fetch an invoice via API, your custom column will be included.
GET Invoice API Example
GET /rest/V1/invoices/:invoice_id
Response Example
{
"entity_id": 10,
"increment_id": "100000001",
"custom_column": "Custom Data",
"extension_attributes": {
"custom_column": "Custom Data"
}
}
POST Invoice API Example (Save Custom Data)
POST /rest/V1/invoices
Request Body
{
"entity": {
"order_id": 1,
"extension_attributes": {
"custom_column": "My Custom Value"
}
}
}
6. Flush Cache & Test
Run:
php bin/magento cache:flush
Then test the API via Postman or cURL.
Explore related questions
See similar questions with these tags.