36967cf6 by Hoang Bien

Override Create Invoice module - version 1.0.0

0 parents
.vscode
.history
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
// @codingStandardsIgnoreFile
namespace FGCT\OverrideCreateInvoice\Block\Adminhtml\Items\Renderer;
use Magento\Sales\Model\Order\CreditMemo\Item as CreditMemoItem;
use Magento\Sales\Model\Order\Invoice\Item as InvoiceItem;
use Magento\Sales\Model\Order\Item as OrderItem;
/**
* Order item render block
*
* @api
* @since 100.0.2
*/
class DefaultRenderer extends \Magento\Sales\Block\Adminhtml\Items\Renderer\DefaultRenderer {
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry,
\Magento\CatalogInventory\Api\StockConfigurationInterface $stockConfiguration,
\Magento\CatalogInventory\Model\Stock\StockItemRepository $stockItemRepository,
\Magento\Framework\Registry $registry,
array $data = []
) {
$this->_coreRegistry = $registry;
$this->_stockItemRepository = $stockItemRepository;
parent::__construct($context, $stockRegistry, $stockConfiguration, $registry, $data);
}
public function getErrorOutStock($productId) {
$_productStock = $this->_stockItemRepository->get($productId);
$html = '';
if(!$_productStock->getIsInStock()) {
$html = '<div class="message message-error error"><div data-ui-id="messages-message-error">This product is out of stock</div></div>';
}
return $html;
}
}
<?php
namespace FGCT\OverrideCreateInvoice\Controller\Adminhtml\Order\Invoice;
use Magento\Backend\App\Action;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Registry;
use Magento\Sales\Model\Order\Email\Sender\InvoiceSender;
use Magento\Sales\Model\Order\Email\Sender\ShipmentSender;
use Magento\Sales\Model\Order\ShipmentFactory;
use Magento\Sales\Model\Order\Invoice;
use Magento\Sales\Model\Service\InvoiceService;
/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class Save extends \Magento\Sales\Controller\Adminhtml\Order\Invoice\Save {
/**
* @var InvoiceSender
*/
protected $invoiceSender;
/**
* @var ShipmentSender
*/
protected $shipmentSender;
/**
* @var ShipmentFactory
*/
protected $shipmentFactory;
/**
* @var Registry
*/
protected $registry;
/**
* @var InvoiceService
*/
private $invoiceService;
/**
* @param Action\Context $context
* @param Registry $registry
* @param InvoiceSender $invoiceSender
* @param ShipmentSender $shipmentSender
* @param ShipmentFactory $shipmentFactory
* @param InvoiceService $invoiceService
*/
public function __construct(
Action\Context $context,
Registry $registry,
InvoiceSender $invoiceSender,
ShipmentSender $shipmentSender,
ShipmentFactory $shipmentFactory,
InvoiceService $invoiceService,
\Magento\CatalogInventory\Model\Stock\StockItemRepository $stockItemRepository
) {
$this->registry = $registry;
$this->invoiceSender = $invoiceSender;
$this->shipmentSender = $shipmentSender;
$this->shipmentFactory = $shipmentFactory;
$this->invoiceService = $invoiceService;
$this->_stockItemRepository = $stockItemRepository;
parent::__construct($context, $registry, $invoiceSender, $shipmentSender, $shipmentFactory, $invoiceService);
}
public function execute() {
/** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultRedirectFactory->create();
$formKeyIsValid = $this->_formKeyValidator->validate($this->getRequest());
$isPost = $this->getRequest()->isPost();
if (!$formKeyIsValid || !$isPost) {
$this->messageManager->addError(__('We can\'t save the invoice right now.'));
return $resultRedirect->setPath('sales/order/index');
}
$data = $this->getRequest()->getPost('invoice');
$orderId = $this->getRequest()->getParam('order_id');
if (!empty($data['comment_text'])) {
$this->_objectManager->get(\Magento\Backend\Model\Session::class)->setCommentText($data['comment_text']);
}
try {
$invoiceData = $this->getRequest()->getParam('invoice', []);
$invoiceItems = isset($invoiceData['items']) ? $invoiceData['items'] : [];
/** @var \Magento\Sales\Model\Order $order */
$order = $this->_objectManager->create(\Magento\Sales\Model\Order::class)->load($orderId);
if (!$order->getId()) {
throw new \Magento\Framework\Exception\LocalizedException(__('The order no longer exists.'));
}
if (!$order->canInvoice()) {
throw new \Magento\Framework\Exception\LocalizedException(
__('The order does not allow an invoice to be created.')
);
}
$invoice = $this->invoiceService->prepareInvoice($order, $invoiceItems);
foreach ($invoice->getAllItems() as $item) {
$_productStock = $this->_stockItemRepository->get($item->getProductId());
if(!$_productStock->getIsInStock()) {
$this->messageManager->addError(__('Some of the products are out of stock!'));
return $resultRedirect->setPath('sales/order_invoice/new/*', ['order_id' => $order->getId()]);
}
}
$invoice = false;
if (!$invoice) {
throw new LocalizedException(__('We can\'t save the invoice right now.'));
}
if (!$invoice->getTotalQty()) {
throw new \Magento\Framework\Exception\LocalizedException(
__('You can\'t create an invoice without products.')
);
}
$this->registry->register('current_invoice', $invoice);
if (!empty($data['capture_case'])) {
$invoice->setRequestedCaptureCase($data['capture_case']);
}
if (!empty($data['comment_text'])) {
$invoice->addComment(
$data['comment_text'],
isset($data['comment_customer_notify']),
isset($data['is_visible_on_front'])
);
$invoice->setCustomerNote($data['comment_text']);
$invoice->setCustomerNoteNotify(isset($data['comment_customer_notify']));
}
$invoice->register();
$invoice->getOrder()->setCustomerNoteNotify(!empty($data['send_email']));
$invoice->getOrder()->setIsInProcess(true);
$transactionSave = $this->_objectManager->create(
\Magento\Framework\DB\Transaction::class
)->addObject(
$invoice
)->addObject(
$invoice->getOrder()
);
$shipment = false;
if (!empty($data['do_shipment']) || (int)$invoice->getOrder()->getForcedShipmentWithInvoice()) {
$shipment = $this->_prepareShipment($invoice);
if ($shipment) {
$transactionSave->addObject($shipment);
}
}
$transactionSave->save();
if (!empty($data['do_shipment'])) {
$this->messageManager->addSuccess(__('You created the invoice and shipment.'));
} else {
$this->messageManager->addSuccess(__('The invoice has been created.'));
}
// send invoice/shipment emails
try {
if (!empty($data['send_email'])) {
$this->invoiceSender->send($invoice);
}
} catch (\Exception $e) {
$this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e);
$this->messageManager->addError(__('We can\'t send the invoice email right now.'));
}
if ($shipment) {
try {
if (!empty($data['send_email'])) {
$this->shipmentSender->send($shipment);
}
} catch (\Exception $e) {
$this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e);
$this->messageManager->addError(__('We can\'t send the shipment right now.'));
}
}
$this->_objectManager->get(\Magento\Backend\Model\Session::class)->getCommentText(true);
return $resultRedirect->setPath('sales/order/view', ['order_id' => $orderId]);
} catch (LocalizedException $e) {
$this->messageManager->addError($e->getMessage());
} catch (\Exception $e) {
$this->messageManager->addError(__('We can\'t save the invoice right now.'));
$this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e);
}
return $resultRedirect->setPath('sales/*/new', ['order_id' => $orderId]);
}
}
<?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\Block\Adminhtml\Items\Renderer\DefaultRenderer" type="FGCT\OverrideCreateInvoice\Block\Adminhtml\Items\Renderer\DefaultRenderer" />
<preference for="Magento\Sales\Controller\Adminhtml\Order\Invoice\Save" type="FGCT\OverrideCreateInvoice\Controller\Adminhtml\Order\Invoice\Save" />
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
<module name="FGCT_OverrideCreateInvoice" setup_version="1.0.0"></module>
</config>
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'FGCT_OverrideCreateInvoice',
__DIR__
);
<?xml version="1.0"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<update handle="sales_invoice_item_price"/>
<body>
<!-- <referenceBlock name="order_items.default" remove="true"/> -->
<!-- <referenceContainer name="content">
<block class="FGCT\OverrideCreateInvoice\Block\Adminhtml\Items\Renderer\FgcDefaultRenderer" name="order_items.default" template="FGCT_OverrideCreateInvoice::order/invoice/create/items/renderer/default.phtml"/>
</referenceContainer> -->
<referenceBlock name="order_items.default">
<action method="setTemplate">
<argument name="template" translate="true" xsi:type="string">FGCT_OverrideCreateInvoice::order/invoice/create/items/renderer/default.phtml</argument>
</action>
</referenceBlock>
</body>
</page>
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
// @codingStandardsIgnoreFile
?>
<?php /** @var $block \Magento\Sales\Block\Adminhtml\Items\Renderer\DefaultRenderer */ ?>
<?php $_item = $block->getItem() ?>
<?php $block->setPriceDataObject($_item)?>
<td class="col-product"><?= $block->getColumnHtml($_item, 'name') ?>
<?= $block->getErrorOutStock($_item->getProductId()) ?>
</td>
<td class="col-price">
<?= $block->getColumnHtml($_item, 'price') ?>
</td>
<td class="col-qty"><?= $block->getColumnHtml($_item, 'qty') ?></td>
<td class="col-qty-invoice">
<?php if ($block->canEditQty()) : ?>
<input type="text" class="input-text admin__control-text qty-input"
name="invoice[items][<?= /* @escapeNotVerified */ $_item->getOrderItemId() ?>]"
value="<?= /* @escapeNotVerified */ $_item->getQty()*1 ?>"/>
<?php else : ?>
<?= /* @escapeNotVerified */ $_item->getQty()*1 ?>
<?php endif; ?>
</td>
<td class="col-subtotal">
<?= $block->getColumnHtml($_item, 'subtotal') ?>
</td>
<td class="col-tax"><?= /* @escapeNotVerified */ $block->displayPriceAttribute('tax_amount') ?></td>
<td class="col-discount"><?= /* @escapeNotVerified */ $block->displayPriceAttribute('discount_amount') ?></td>
<td class="col-total last">
<?= $block->getColumnHtml($_item, 'total') ?>
</td>
app/code/FGCT/OverrideCreateInvoice app/code/FGCT/OverrideCreateInvoice
# GET EXTENSION
Use git:
git clone https://github.com/devfgct/M2OverrideCreateInvoice.git
cp M2OverrideCreateInvoice/* magento_root/
# INSTALLATION
bin/magento setup:upgrade