Add Username to Order Comment History
Asked Answered
S

3

13

Is there a simple way to add the username of the person who is making the comment in the admin history to the comment thread on the order?

-- edit --

Another way of asking this would be how do I add an additional field to the comment history model so that I can override the appropriate models and templates inserting that data into the data structure.

Susie answered 2/6, 2011 at 19:51 Comment(1)
The answer to your first question is no :)Juryman
H
8

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

Howard answered 3/6, 2011 at 15:29 Comment(4)
thanks for the help on this one. I had to make a few tweaks but your code was pretty much dead on.Susie
one big problem I'm finding is that Mage::getSingleton('admin/session')->getUser(); is not available on the front end and causes my normal checkouts to fail. Have you run into this? How did you overcome it?Susie
I found the work around, you need to do this on the Model $UserInfo = Mage::getSingleton('admin/session')->getUser(); if ($UserInfo) $UserName = $UserInfo->getUsername();Susie
if() { // if logged in as adminstrator } else { if(Mage::getSingleton('customer/session')->isLoggedIn()) { $UserId=Mage::getSingleton('customer/session')->getCustomer()->getId(); $UserName='Customer'.Mage::getSingleton('customer/session')->getCustomer()->getName(); } else { $UserId="Store Purchase"; $UserName="Frontend";} }Howard
T
6

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
        }            
    }
}  
Tampa answered 20/12, 2012 at 6:34 Comment(2)
Hello, How to get order comments history in magento 1? @TampaMillrun
To get all comment history of an order, try $historyCollection = Mage::getModel('sales/order')->load($orderId)->getStatusHistoryCollection();Tampa
M
1

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/*/');
}
}
Melesa answered 22/1, 2019 at 8:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.