Массовая печать счетов из списка. AOS_Invoices

Приветствую. Сделал массовую печать в PDF из списка для кастомных модулей, также решил сделать это для печати счетов. Внес изменения по инструкции Bulk Print to pdf custom module . Но для модуля AOS_Invoices не выгружается вся информация в шаблон PDF при выгрузке из списка.
В теме Invoice Print as pdf from list view указано, что это не сложно, нужно просто в папку custom/modules⁩/⁨AOS_PDF_Templates⁩ добавить formLetterPdf.php.

Got this working as i wanted, Actually was a lot simpler than I thought
By creating a custom formLetterPdf.php I can now mass print invoices from the list view with all relationship data B)

Я это сделал, после чего создал entry_point. custom/Extension/application/Ext/EntryPointRegistry/formLetter.php:

<?php
  $entry_point_registry['formLetter'] = array(
      'file' => 'custom/modules/AOS_PDF_Templates/formLetterPdf.php',
      'auth' => true,
  );

Но при выгрузке все равно получаю в печатных формах следующее:

Снимок экрана 2021-02-14 в 08.44.43
Что нужно отредактировать в custom/modules/AOS_PDF_Templates/formLetterPdf.php?
Спасибо

@anyketua
Посмотри на переменную $text в файле formLetterPdf.php. Она содержит данные шаблона для подстановки.

Она встречается в 4 местах. Что именно нужно добавить/изменить?
$text = preg_replace($search, $replace, $template->description);
$text = preg_replace_callback(
‘/{DATE\s+(.*?)}/’,
function ($matches) {
return date($matches[1]);
},
$text
);
$header = preg_replace($search, $replace, $template->pdfheader);
$footer = preg_replace($search, $replace, $template->pdffooter);
$converted = templateParser::parse_template($text, $object_arr);
$header = templateParser::parse_template($header, $object_arr);
$footer = templateParser::parse_template($footer, $object_arr);
$printable = str_replace("\n", “
”, $converted);

Что-то из этого добавить?

$text = str_replace("$aos_quotes", “$” . $variableName, $text);
$text = str_replace("$aos_invoices", “$” . $variableName, $text);
$text = str_replace("$total_amt", “$” . $variableName . “_total_amt”, $text);
$text = str_replace("$discount_amount", “$” . $variableName . “_discount_amount”, $text);
$text = str_replace("$subtotal_amount", “$” . $variableName . “_subtotal_amount”, $text);
$text = str_replace("$tax_amount", “$” . $variableName . “_tax_amount”, $text);
$text = str_replace("$shipping_amount", “$” . $variableName . “_shipping_amount”, $text);
$text = str_replace("$total_amount", “$” . $variableName . “_total_amount”, $text);

$text = populate_group_lines($text, $lineItemsGroups, $lineItems);

Я бы сначала проверил что сохраняется в переменной после замены.

Поле description модуля AOS_PDF_Templates содержит саму форму с именами переменных, которые заменяются на значения при вызове:

$converted = templateParser::parse_template($text, $object_arr);

Предложенные замены добавлять не нужно.

Не могу понять. Можете помочь?

@anyketua

$converted = templateParser::parse_template($text, $object_arr);

То есть они не выводятся на печать потому как я не правильно создаю шаблон?
Или не то?

Поля как название контрагента, номер, название и так далее без проблем выводятся при массовой выгрузке из списка…

@anyketua

Я не могу это утверждать, так как не вижу ваших данных. Я только говору, где и что можно посмотреть и проверить.

Вот шаблон:

Поставщик: ООО "НАЗВАНИЕ"

Получатель: $billing_account_name

Плательщин: тот же

Счет № $aos_invoices_number от $aos_invoices_invoice_date

согласно договора № $billing_account_contract_rel1_c от $billing_account_contract_date_c

Наименование работ, услуг Ед. Количество Цена без НДС Сумма без НДС
$aos_products_quotes_number $aos_products_description усл. $aos_products_quotes_product_qty $aos_products_quotes_product_unit_price $aos_products_quotes_product_total_price
Всего без НДС: $total_amt
НДС: $tax_amount
Всего с НДС:
$total_amount

Выписал ФИО.

При печати непосредственно из счета - все ОК:


Но если печать из списка, все, что касается услуг, сумм - выводится просто переменной, например $aos_products_quotes_product_unit_price, а не число:

@anyketua
Проверьте следующее:

  • $_REQUEST[‘module’]== ‘AOS_Invoices’
  • $_REQUEST[‘current_post’] содержит с id записей, которые надо печатать ИЛИ $_REQUEST[‘uid’] содержит список через запятую id записей, которые надо печатать

Такое впечатление, что номера id не соответствуют модулю.
Я обычно вывожу информацию в лог. В данном случае значение уровень легирования должно быть равно fatal

$GLOBALS['log']->fatal(get_class()." ". __FUNCTION__." _REQUEST:\n ".print_r($_REQUEST,true));

Ошибки только с планировщиком показывает, хотя workflows работают

Я вижу, что line items попросту не тянутся при печати PDF из list view, но не понимаю почему и как это побороть

Тогда надо вернуться к:

$converted = templateParser::parse_template($text, $object_arr);

Посмотрите метод parse_template_bean в файле modules/AOS_PDF_Templates/templateParser.php именно он заменяет имя поля на данные. Он не берет данные из связанных объектов. Возможно, вместо formLetterPdf.php за основу стоит взять generatePdf.php, там уже присутствует анализ связанного модуля AOS_Line_Item_Groups.

Складывается впечатление, что не line items подключено не в formLetterPdf.php, а ранее - например в view.list.php или AOS_InvoicesListViewSmarty.php:

/custom/modules/AOS_Invoices/views/view.list.php (с <?php в начале):

    require_once('include/MVC/View/views/view.list.php');
    require_once('modules/AOS_Invoices/AOS_InvoicesListViewSmarty.php');
    class AOS_InvoicesViewList extends ViewList
    {
    /**
     * @see ViewList::preDisplay()
     */
    public function preDisplay()
    {
        require_once('modules/AOS_PDF_Templates/formLetter.php');
        formLetter::LVPopupHtml('AOS_Invoices');
        parent::preDisplay();

        $this->lv = new ContactsListViewSmarty();
    }
    }

/custom/modules/AOS_Invoices/AOS_InvoicesListViewSmarty.php (с <?php в начале):

	require_once('include/ListView/ListViewSmarty.php');
	require_once('modules/AOS_PDF_Templates/formLetter.php');


	class AOS_InvoicesListViewSmarty extends ListViewSmarty
	{
	    public function __construct()
	    {
	        parent::__construct();
	        $this->targetList = true;
	    }

	    /**
	     * @deprecated deprecated since version 7.6, PHP4 Style Constructors are deprecated and will be remove in 7.8, please update your code, use __construct instead
	     */
	    public function AOS_InvoicesListViewSmarty()
	    {
	        $deprecatedMessage = 'PHP4 Style Constructors are deprecated and will be remove in 7.8, please update your code';
	        if (isset($GLOBALS['log'])) {
	            $GLOBALS['log']->deprecated($deprecatedMessage);
	        } else {
	            trigger_error($deprecatedMessage, E_USER_DEPRECATED);
	        }
	        self::__construct();
	    }


	    /**
	     *
	     * @param file $file Template file to use
	     * @param array $data from ListViewData
	     * @param string $htmlVar the corresponding html public in xtpl per row
	     * @return bool|void
	     */
	    public function process($file, $data, $htmlVar)
	    {
	        $configurator = new Configurator();
	        if ($configurator->isConfirmOptInEnabled()) {
	            $this->actionsMenuExtraItems[] = $this->buildSendConfirmOptInEmailToPersonAndCompany();
	        }

	        $ret = parent::process($file, $data, $htmlVar);

	        if (!ACLController::checkAccess($this->seed->module_dir, 'export', true) || !$this->export) {
	            $this->ss->assign('exportLink', $this->buildExportLink());
	        }

	        return $ret;
	    }

	    public function buildExportLink($id = 'export_link')
	    {
	        global $app_strings;
	        global $sugar_config;

	        $script = "";
	        if (ACLController::checkAccess($this->seed->module_dir, 'export', true)) {
	            if ($this->export) {
	                $script = parent::buildExportLink($id);
	            }
	        }

	        $script .= "<a href='javascript:void(0)' id='map_listview_top' " .
	                    " onclick=\"return sListView.send_form(true, 'jjwg_Maps', " .
	                    "'index.php?entryPoint=jjwg_Maps&display_module={$_REQUEST['module']}', " .
	                    "'{$app_strings['LBL_LISTVIEW_NO_SELECTED']}')\">{$app_strings['LBL_MAP']}</a>";

	        return formLetter::LVSmarty().$script;
	    }
	}

Нет. Все делает formLetterPdf.php и templateParser.php, получая на входе название модуля и список его id, для которых надо собрать pdf файлы на основе соответствующего шаблона. В view.list.php формируется только экранная форма вывода.

templateParser.php не учитывает связи модуля с другими модулями. templateParser.php будет нормально работать только если в шаблоне pdf используются только поля текущего модуля. generatePdf.php как раз учитывает связь именно с модулем AOS_Line_Item_Groups.

Без сторонней помощи не могу, увы :frowning:

@anyketua
Если нужна помощь, напишите личное сообщение, обсудим.