Add Username to Order Comment History

If you want to add the username who is currently logged in and making change in order or commenting on order. you need to add an attribute to magento.

Create a Module say Audit app / etc / modules / Namespace_Audit.xml

<?xml version="1.0"?> 
<config> 
    <modules>
        <Namespace_Audit>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Sales/>
            </depends>
        </Namespace_Audit>
    </modules>
</config>

then Create a folder Audit in you namespace and create the config file. purpose of this is to rewrite the core class and extending for modified method

app / code / local / Namespace / Audit / etc / config.xml

`<?xml version="1.0"?>
<config>
    <modules>
        <Namespace_Audit>
            <version>0.1.0</version>
        </Namespace_Audit>
    </modules>
     <global>
        <blocks>
            <adminhtml>
                <rewrite>
                    <sales_order_view_tab_history before="Mage_Adminhtml_Block">Namespace_Audit_Block_Sales_Order_View_Tab_History<sales_order_view_tab_history>
                </rewrite>
            </adminhtml>
        </blocks>                    
        <global>
                <models>
                        <audit>
                                <class>Bigadda_Audit_Model</class>
                        </audit>
                </models>
        <resources>       
            <audit_setup>
                <setup>
                    <module>Bigadda_Audit</module>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </audit_setup>
            <audit_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </audit_write>
            <audit_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </audit_read>
        </resources>
        </global>
    </global>  
</config>`

create a setup to make a new attribute in database local / Namespace / Audit / sql / audit_setup / mysql4-install-0.1.0.php

`
<?php
$installer = $this;
$installer->startSetup();
$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
$setup->addAttribute('order_status_history', 'track_user', array('type' => 'varchar'));
$installer->endSetup();
`

Now extending the existing class . create a class file History.php

Namespace/Audit/Block/Sales/Order/View/Tab/History

and copy the functions in that

` public function getFullHistory() { $order = $this->getOrder();

    $history = array();
    foreach ($order->getAllStatusHistory() as $orderComment){
        $history[$orderComment->getEntityId()] = $this->_prepareHistoryItem(
            $orderComment->getStatusLabel(),
            $orderComment->getIsCustomerNotified(),
            $orderComment->getCreatedAtDate(),
            $orderComment->getComment(),
            $orderComment->getTrackUser(),
            $orderComment->getTrackUserName()
        );
    }

    foreach ($order->getCreditmemosCollection() as $_memo){
        $history[$_memo->getEntityId()] =
            $this->_prepareHistoryItem($this->__('Credit Memo #%s created', $_memo->getIncrementId()),
                $_memo->getEmailSent(), $_memo->getCreatedAtDate());

        foreach ($_memo->getCommentsCollection() as $_comment){
            $history[$_comment->getEntityId()] =
                $this->_prepareHistoryItem($this->__('Credit Memo #%s comment added', $_memo->getIncrementId()),
                    $_comment->getIsCustomerNotified(), $_comment->getCreatedAtDate(), $_comment->getComment(),$_comment->getTrackUser(),$_comment->getTrackUserName());
        }
    }

    foreach ($order->getShipmentsCollection() as $_shipment){
        $history[$_shipment->getEntityId()] =
            $this->_prepareHistoryItem($this->__('Shipment #%s created', $_shipment->getIncrementId()),
                $_shipment->getEmailSent(), $_shipment->getCreatedAtDate());

        foreach ($_shipment->getCommentsCollection() as $_comment){
            $history[$_comment->getEntityId()] =
                $this->_prepareHistoryItem($this->__('Shipment #%s comment added', $_shipment->getIncrementId()),
                    $_comment->getIsCustomerNotified(), $_comment->getCreatedAtDate(), $_comment->getComment(),$_comment->getTrackUser(),$_comment->getTrackUserName());
        }
    }

    foreach ($order->getInvoiceCollection() as $_invoice){
        $history[$_invoice->getEntityId()] =
            $this->_prepareHistoryItem($this->__('Invoice #%s created', $_invoice->getIncrementId()),
                $_invoice->getEmailSent(), $_invoice->getCreatedAtDate());

        foreach ($_invoice->getCommentsCollection() as $_comment){
            $history[$_comment->getEntityId()] =
                $this->_prepareHistoryItem($this->__('Invoice #%s comment added', $_invoice->getIncrementId()),
                    $_comment->getIsCustomerNotified(), $_comment->getCreatedAtDate(), $_comment->getComment(),$_comment->getTrackUser(),$_comment->getTrackUserName());
        }
    }

    foreach ($order->getTracksCollection() as $_track){
        $history[$_track->getEntityId()] =
            $this->_prepareHistoryItem($this->__('Tracking number %s for %s assigned', $_track->getNumber(), $_track->getTitle()),
                false, $_track->getCreatedAtDate());
    }

    krsort($history);
    return $history;
}`

protected function _prepareHistoryItem($label, $notified, $created, $comment = '' , $trackUser = '' , $trackUserName ='')
    {
        return array(
            'title'      => $label,
            'notified'   => $notified,
            'track_user' => $trackUser,
            'track_user_name' => $trackUserName,
            'comment'    => $comment,
            'created_at' => $created            
        );
    }

extend the class order.php and add this method to set the comment to update the database. app / code / local / Mynamespace / Sales / Model / Order.php

public function addStatusHistoryComment($comment, $status = false)
        {
                if (false === $status) {
                        $status = $this->getStatus();
                } elseif (true === $status) {
                        $status = $this->getConfig()->getStateDefaultStatus($this->getState());
                } else {
                        $this->setStatus($status);
                }
                $UserInfo = Mage::getSingleton('admin/session')->getUser();
                $UserName='';
                $UserName=$UserInfo->getUsername();
                $history = Mage::getModel('sales/order_status_history')
                ->setStatus($status)
                ->setComment($comment)
                ->setTrackUser($UserName); //added by vipul dadhich to add audits in the 
                $this->addStatusHistory($history);
                return $history;

        }

finally updating the phtml files. app / design / adminhtml / default / default / template / sales / order / view / history.phtml place this code wherever u want to show the username

<?php if ($_item->getTrackUser()): ?>
                <br/><?php  echo "<b>Updated By ( User ) :-  </b>".$this->htmlEscape($_item->getTrackUser(), array('b','br','strong','i','u')) ?>
            <?php endif; ?>

app / design / adminhtml / default / default / template / sales / order / view / tab / history.phtml

 <?php if ($_comment = $this->getItemTrackUser($_item)): ?>
                    <br/><?php echo "<b>Updated By (User) :- </b>".$_comment ?>
                <?php endif; ?>

Thats All folks..

Vipul Dadhich


In Magento 2

You need to override the AddComment.php file in vendor/magento/module-sales

If you want to edit the core file AddComment.php then you can add the following code to your AddComment.php file

$username = $this->authSession->getUser()->getUsername();
$append = " (by ".$username.")";
$history = $order->addStatusHistoryComment($data['comment'].$append, $data['status']);

But this is not a good practice to modify core files directly. You need to make your new module and override

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">
<preference for="Magento\Sales\Controller\Adminhtml\Order\AddComment" type="Vendor\Module\Controller\Adminhtml\Order\AddComment" />
</config>

Vendor\Module\Controller\Adminhtml\Order\AddComment.php

<?php
namespace Vendor\Module\Controller\Adminhtml\Order;

use Magento\Backend\App\Action;
use Magento\Sales\Model\Order\Email\Sender\OrderCommentSender;

use Magento\Sales\Api\OrderManagementInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Exception\InputException;
use Psr\Log\LoggerInterface;

class AddComment extends \Magento\Sales\Controller\Adminhtml\Order
{
/**
 * Authorization level of a basic admin session
 *
 * @see _isAllowed()
 */
const ADMIN_RESOURCE = 'Magento_Sales::comment';

/**
 * Core registry
 *
 * @var \Magento\Framework\Registry
 */
protected $_coreRegistry = null;

/**
 * @var \Magento\Framework\App\Response\Http\FileFactory
 */
protected $_fileFactory;

/**
 * @var \Magento\Framework\Translate\InlineInterface
 */
protected $_translateInline;

/**
 * @var \Magento\Framework\View\Result\PageFactory
 */
protected $resultPageFactory;

/**
 * @var \Magento\Framework\Controller\Result\JsonFactory
 */
protected $resultJsonFactory;

/**
 * @var \Magento\Framework\View\Result\LayoutFactory
 */
protected $resultLayoutFactory;

/**
 * @var \Magento\Framework\Controller\Result\RawFactory
 */
protected $resultRawFactory;

/**
 * @var OrderManagementInterface
 */
protected $orderManagement;

/**
 * @var OrderRepositoryInterface
 */
protected $orderRepository;

/**
 * @var LoggerInterface
 */
protected $logger;

protected $authSession;

public function __construct(
    Action\Context $context,
    \Magento\Framework\Registry $coreRegistry,
    \Magento\Framework\App\Response\Http\FileFactory $fileFactory,
    \Magento\Framework\Translate\InlineInterface $translateInline,
    \Magento\Framework\View\Result\PageFactory $resultPageFactory,
    \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
    \Magento\Framework\View\Result\LayoutFactory $resultLayoutFactory,
    \Magento\Framework\Controller\Result\RawFactory $resultRawFactory,
    OrderManagementInterface $orderManagement,
    OrderRepositoryInterface $orderRepository,
    LoggerInterface $logger,
    \Magento\Backend\Model\Auth\Session $authSession
) {
    $this->authSession = $authSession;
    parent::__construct($context, $coreRegistry,$fileFactory,$translateInline,$resultPageFactory,$resultJsonFactory,$resultLayoutFactory,$resultRawFactory,$orderManagement,$orderRepository,$logger);
}

/**
 * Add order comment action
 *
 * @return \Magento\Framework\Controller\ResultInterface
 */
public function execute()
{
    $order = $this->_initOrder();
    if ($order) {
        try {
            $data = $this->getRequest()->getPost('history');
            if (empty($data['comment']) && $data['status'] == $order->getDataByKey('status')) {
                throw new \Magento\Framework\Exception\LocalizedException(__('Please enter a comment.'));
            }

            $notify = isset($data['is_customer_notified']) ? $data['is_customer_notified'] : false;
            $visible = isset($data['is_visible_on_front']) ? $data['is_visible_on_front'] : false;

            $username = $this->authSession->getUser()->getUsername();
            $append = " (by ".$username.")";

            $history = $order->addStatusHistoryComment($data['comment'].$append, $data['status']);
            $history->setIsVisibleOnFront($visible);
            $history->setIsCustomerNotified($notify);
            $history->save();

            $comment = trim(strip_tags($data['comment']));

            $order->save();
            /** @var OrderCommentSender $orderCommentSender */
            $orderCommentSender = $this->_objectManager
                ->create(\Magento\Sales\Model\Order\Email\Sender\OrderCommentSender::class);

            $orderCommentSender->send($order, $notify, $comment);

            return $this->resultPageFactory->create();
        } catch (\Magento\Framework\Exception\LocalizedException $e) {
            $response = ['error' => true, 'message' => $e->getMessage()];
        } catch (\Exception $e) {
            $response = ['error' => true, 'message' => __('We cannot add order history.')];
        }
        if (is_array($response)) {
            $resultJson = $this->resultJsonFactory->create();
            $resultJson->setData($response);
            return $resultJson;
        }
    }
    return $this->resultRedirectFactory->create()->setPath('sales/*/');
}
}

A different take by observing the event *sales_order_status_history_save_before*

Define the setup and observer in your config:

<config>
    <modules>
        <Name_Module>
            <version>0.0.1</version>
        </Name_Module>
    </modules>
    <global> 
        <resources>
            <module_setup>
                <setup>
                    <module>Name_Module</module>                    
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </module_setup>
        </resources>    
        <events>
            <sales_order_status_history_save_before> 
                <observers>
                    <sales_order_status_history_save_before_observer>
                        <type>singleton</type>
                        <class>Name_Module_Model_Observer</class>
                        <method>orderStatusHistorySaveBefore</method>
                    </sales_order_status_history_save_before_observer>
                </observers>
            </sales_order_status_history_save_before>    
        </events>
   <!-- and so on ->

In your module_setup file app\code\local\Name\Module\sql\module_setup\install-0.0.1.php

$installer = $this;
$installer->startSetup();
$table = $installer->getTable('sales/order_status_history');
$installer->getConnection()
    ->addColumn($table, 'username', array(
        'type'      => Varien_Db_Ddl_Table::TYPE_TEXT,
        'length'    => 40,
        'nullable'  => true,
        'comment'   => 'Admin user name'
    ));
$installer->getConnection()
    ->addColumn($table, 'userrole', array(
        'type'      => Varien_Db_Ddl_Table::TYPE_TEXT,
        'length'    => 50,
        'nullable'  => true,
        'comment'   => 'Admin user role'
    ));    
$installer->endSetup();

Then in Name_Module_Model_Observer:

public function orderStatusHistorySaveBefore($observer)  
{
    $session = Mage::getSingleton('admin/session');
    if ($session->isLoggedIn()) { //only for login admin user
        $user = $session->getUser();
        $history = $observer->getEvent()->getStatusHistory();
        if (!$history->getId()) { //only for new entry
            $history->setData('username', $user->getUsername());
            $role = $user->getRole(); //if you have the column userrole
            $history->setData('userrole', $role->getRoleName()); //you can save it too
        }            
    }
}