Автоматическое создание PDF-файла счета-фактуры и сохранение на сервере при создании счета-фактуры


Надеюсь, что кто-нибудь укажет мне правильное направление.

Я бы хотел, чтобы Magento 2 автоматически создавал PDF-файл счета-фактуры и сохранял его где-нибудь на сервере при создании/создании счета-фактуры.

Возможно ли это?

Magento 2.2.7

Спасибо

Author: user1155594, 2019-01-31

2 answers

Я не думаю, что в Magento 2 есть что-то "из коробки" для этого. Но вы можете легко создать наблюдателя для события sales_order_invoice_register. Это событие вызывается после создания нового счета-фактуры. Вы можете понять это с помощью чего-то вроде этого:

1. зарегистрировать наблюдателя в events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
  <event name="sales_order_invoice_register">
    <observer name="yourObserverName" instance="YourCompany\YourModule\Observer\YourObserver" />
  </event>
</config>

2. создать YourObserver.php

<?php
namespace YourCompany\YourModule\Observer;

use Magento\Framework\Event\ObserverInterface;

class SavePdfInvoices implements ObserverInterface
{
    protected $_pdfInvoiceModel;
    protected $_outputDirectory;
    private $_myPdfStorageSubDirectory = "pdfinvoices";

    public function __construct(
        \Magento\Sales\Model\Order\Pdf\Invoice $pdfInvoiceModel,
        \Magento\Framework\Filesystem $filesystem
        ) {
            $this->_pdfInvoiceModel = $pdfInvoiceModel;
            $this->_outputDirectory = $filesystem->getDirectoryWrite(\Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR);
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        try{
            $order = $observer->getData('order');
            if (!$order->hasInvoices()){
               return $this;
            }
            $invoice =  $order->getInvoiceCollection()->getFirstItem();
            $pdfContent = $this->_pdfInvoiceModel->getPdf([$invoice])->render();
            //save to file wherever you want, in this example in var/pdfinvoices/[IncrementID].pdf
            $this->_outputDirectory->writeFile($this->_myPdfStorageSubDirectory. "/" . $invoice->getIncrementId() . ".pdf" ,$pdfContent);
        } catch (Exception $e){
            //some usefull exception handling if you need
        }
        return $this;
    }
}
 3
Author: HelgeB, 2019-02-02 07:52:24

Нет, дорогая, это не работает. Неустранимая ошибка: Неперехваченное исключение: Ошибка пользователя: Некоторые транзакции не были зафиксированы или откатаны sales_order_invoice_save_after

Пожалуйста, направьте меня по адресу

 0
Author: Omar Farooq, 2020-03-02 13:20:39