Перейти к содержимому


Счет на оплату в PDF


  • Вы не можете ответить в тему
Сообщений в теме: 6

#1 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 31 January 2014 - 01:28 PM

Модуль Счет в PDF - модуль, заменяющий штатную форму счета в модуле оплаты "Выставление счетов".

Основных отличий от штатной формы три:
1. несколько переделан внешний вид в угоду красивости
2. в админке добавлен модуль, где вводятся фамилии директора/бухгалтера, загружаются их подписи и печать.
3. производится конвертация счета в PDF

А поскольку фамилии, подписи и печать представляют собой доступные везде константы, то использовать их можно и при создании других документов - фактур, накладных и т.п.

Установка:
----------
1. копируем файлы

modules_shtamp.php -> core/includes/admin/sub/
modules_shtamp.tpl.html -> core/tpl/admin/
invoice_jur.php -> core/includes/processor/
invoice_jur.tpl.html -> core/modules/tpl/

2. в файле default.tpl.html перед строкой


<div class="marg"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&amp;sub=yandex">{$smarty.const.ADMIN_STRING_YANDEX}</a></div>


вставляем


{* BEGIN shtamp *}
<div class="marg"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&amp;sub=shtamp">Печать и подписи</a></div>
{* END shtamp *}



3. в файле core/tpl/admin/menu.tpl.html перед строкой


<table class="adn topj"><tr><td><img src="data/admin/drs.gif" alt=""></td><td width="100%"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&amp;sub=yandex">{$smarty.const.ADMIN_STRING_YANDEX}</a></td></tr></table>


вставляем


{* BEGIN shtamp *}
<table class="adn topj"><tr><td><img src="data/admin/drs.gif" alt=""></td><td width="100%"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&amp;sub=shtamp">Печать и подписи</a></td></tr></table>
{* END shtamp *}



4. в файле core/includes/admin/modules.php перед строкой


array("id"=>"yandex", "name"=>"Яндекс.Маркет" )


вставляем


# BEGIN shtamp
array("id"=>"shtamp", "name"=>"Печать и подписи"),
# END shtamp



5. в файле core/modules/payment/invoice_jur.php

5.1. вместо (можно просто закомментировать этот кусок)


if ($this->_getSettingValue('CONF_PAYMENTMODULE_INVOICE_JUR_EMAIL_HTML_INVOICE') == 1) //html
{
...
}
else


вставляем


if ($this->_getSettingValue('CONF_PAYMENTMODULE_INVOICE_JUR_EMAIL_HTML_INVOICE') != 1)


таким образом мы отключим отсылку email-а со счетом, т.к. он теперь отсылается из core/includes/processor/invoice_jur.php

5.2. (совершенно не обязательно) вместо


"<script>\n".
" open_window('index.php?do=invoice_jur&moduleID=".(int)$this->ModuleConfigID."&orderID=".(int)$orderID."&order_time=".base64_encode( $order["order_time_mysql"] )."&customer_email=".base64_encode( $order["customer_email"] )."',700,600);\n".
"</script>\n";


вставляем

[php]
# BEGIN order_confirm
/*
"<script>\n".
" open_window('index.php?do=invoice_jur&moduleID=".(int)$this->ModuleConfigID."&orderID=".(int)$orderID."&order_time=".base64_encode( $order["order_time_mysql"] )."&customer_email=".base64_encode( $order["customer_email"] )."',700,600);\n".
"</script>\n";
*/
"<a href='index.php?do=invoice_jur&moduleID=".(int)$this->ModuleConfigID."&orderID=".(int)$orderID."&order_time=".base64_encode( $order["order_time_mysql"] )."&customer_email=".base64_encode( $order["customer_email"] )."' id='adddoc'>если через 5 секунд на экране не появится счет - перейдите по этой ссылке</a>".
"<script>setTimeout('document.getElementById(\'adddoc\').click()',5000);</script>";
# END order_confirm

Таким образом мы откроем счет не в новом окне (что может быть заблокировано браузером), а в текущем.


6. добавляем конвертер HTML->PDF

6.1 скачиваем из http://www.mpdf1.com/mpdf/download последнюю версию mPDF

6.2 распаковываем в корень сайта, переименовываем каталог (на текущий момент это MPDF54) в mpdf


------------------

После всего этого в админке в разделе "Модули" появится новый модуль "Печать и подписи".
Уровень доступа к этому модулю "Общие настройки" (это для тех, у кого кроме админов с полным доступом и клиентов есть еще пользователи с разными уровнями доступа в админке).

Прикрепленные файлы

  • Прикрепленный файл  Invoice2PDF.zip   135.59К   26 Количество загрузок:

  • 3
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#2 ssergioss25

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 56 сообщений
Репутация: 24
Ассистент
  • ГородСПБ

Отправлено 28 December 2014 - 10:39 AM

Спасибо за модуль. Все работает. Единственное что. В счете,который отправляется покупателю на почту, у меня почему то упорно пишет, что весь товар без ндс. При этом общую сумму ндс пишет. В счете PDF , который открывается в окне с ндс проблем нет, везде пишет правильно. badisoft, в чем может быть причина? Я бегло глянул и так и не понял. Вроде бы, что счет в PDF, что счет для отправки формирует один и тот же участок кода.
  • 0

#3 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 28 December 2014 - 03:39 PM

В счете,который отправляется покупателю на почту, у меня почему то упорно пишет, что весь товар без ндс

Эээ.... Т.е. на экран и в почту формируются два разных счета? Один с НДС, второй с фразой "без НДС"?

Вроде бы, что счет в PDF, что счет для отправки формирует один и тот же участок кода.

Именно так. Вкратце (убрав вспомогательную обвязку) код выглядит как

$html = $smarty->fetch("invoice_jur.tpl.html");
$mpdf->WriteHTML($html);
if ($InvoiceModule->_getSettingValue(CONF_PAYMENTMODULE_INVOICE_JUR_EMAIL_HTML_INVOICE) == 1)
{
$is_sent = @mail($mailto, $subject, "", $header);
}
$mpdf->Output('', 'I');

Т.е. получаем из шаблона HTML-версию счета, затем конвертим ее в PDF-версию, затем (по if) отправляем ее почтой, затем выводим на экран. Соответственно, на экране и в письме в принципе никак не могут получиться хоть в чем-либо разные версии счета.
Если они таки разные, то мне в голову не приходит, почему такое может быть.

PS. Вот если бы оба счета были одинаковыми и оба "без НДС", тогда можно предположить, что в админке модуля счета поле НДС не заполнено (ноль), т.к. именно исходя из значения этого поля выводится строка "без НДС".
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#4 ssergioss25

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 56 сообщений
Репутация: 24
Ассистент
  • ГородСПБ

Отправлено 28 December 2014 - 03:54 PM

Соответственно, на экране и в письме в принципе никак не могут получиться хоть в чем-либо разные версии счета.

А вот именно так и происходит. Я тоже понимаю,что счет то один, но все равно именно на почту приходит без ндс. Никак это не может быть связано с еще одним фалом invoice_jur.php, который находится в core\modules\payment ?
  • 0

#5 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 28 December 2014 - 05:16 PM

Никак это не может быть связано с еще одним фалом invoice_jur.php, который находится в core\modules\payment ?

Поскольку на текущий момент ошибка (проблема) явно где-то на уровне "чудеса таки происходят", то связана она может быть с чем угодно. В том числе и с этим файлом. Невзирая на то, что в этом файле явно нет (откуда бы?) преобразования в PDF.

Может, емейлом приходит файл (c "без НДС") вовсе не в PDF, а в HTML?
Тогда с некоторой вероятностью Вы не совсем верно выполнили пункт 5.1 интструкции.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#6 ssergioss25

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 56 сообщений
Репутация: 24
Ассистент
  • ГородСПБ

Отправлено 29 December 2014 - 10:54 AM

Тогда с некоторой вероятностью Вы не совсем верно выполнили пункт 5.1 интструкции.

Да, действительно,спасибо. Счет на почту отправлялся оттуда в HTML. Однако, если отключить отправку счета из core\modules\payment , то счет теперь на почту не отправляется вовсе. То есть, отправка счета из файла invoice_jur.php -> core/includes/processor/ не происходит.
Так понимаю, этот код отвечает за отправку ?
$is_sent = @mail($mailto, $subject, "", $header);

  • 0

#7 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 29 December 2014 - 12:40 PM

Так понимаю, этот код отвечает за отправку ?

Да.
Тогда я знал еще довольно мало как по потрохам ShopCMS, так и вообще по PHP и, скорее всего, мне где-то попался такой вариант отправки почты с приаттаченным файлом. Возможно, он даже взят из документации по mMDF, я уже не помню.
Как я понимаю, mail() отправляет письмо только способом "mail" (в терминах настроек shopCMS), т.е. если у Вас этот способ не работает, а все настроено через сторонний smtp-сервер, то письмо со счетом не отправится.

Сейчас бы я, конечно, делал этот кусочек кода совершенно по другому, взяв за основу любую из трех штатных функций ShopCMS по отправке почты и добавив туда вложенный файл примерно так:http://www.askapache.com/php/phpfreaks-eric-rosebrocks-phpmailer-tutorial.html#File_Attachments_PHP_Mail_PHPMailer либо вообще использовал штатную функцию вместо mail(), оставив практически все остальное как было.

PS.

либо вообще использовал штатную функцию вместо mail(), оставив практически все остальное как было.

Например, так:
================================
5. в файле functions.php в функции xMailTxtHTMLDATA

5.1 вместо строки


function xMailTxtHTMLDATA($_Email, $_Subject, $_Text, $castmail = CONF_GENERAL_EMAIL, $castname = CONF_SHOP_NAME)


вставляем


# BEGIN file-to-email
# function xMailTxtHTMLDATA($_Email, $_Subject, $_Text, $castmail = CONF_GENERAL_EMAIL, $castname = CONF_SHOP_NAME)
function xMailTxtHTMLDATA($_Email, $_Subject, $_Text, $castmail = CONF_GENERAL_EMAIL, $castname = CONF_SHOP_NAME, $filename = "")
# END file-to-email


5.2 после строки


$mail->AltBody = ERROR_NO_TEXT_IN_MAILDATA;


вставляем


# BEGIN file-to-email
if ($filename) $mail->AddAttachment($filename);
# END file-to-email

===============================
Ну и переменную $content надо будет перед этим в файл сохранить. Смутно помню (возможно, не верно), что mPDF и сам может сгенерированный PDF сохранить в файл, а не только отдать в виде переменной.

mPDF и сам может сгенерированный PDF сохранить в файл, а не только отдать в виде переменной.

Да, так и есть. http://mpdf1.com/man...dex.php?tid=125
Т.е. надо заменить $content = $mpdf->Output('', 'S'); на что-нибудь типа $mpdf->Output('/core/temp/invoice.pdf', 'F');
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)