Счет на оплату безналичным расчетом для JoomShopping

JoomShopping компании MAXX marketing достойный компонент для создания интернет-магазинов. Но как и любой другой компонент, он имеет свои недостатки и порой требует немалых правок и изменений. В этой статье поговорим о том, как реализовать способ оплаты "Счет на оплату безналичным расчетом".

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

Совет: Прежде чем производить какие-либо изменения, сделайте резервные копии файлов, с которыми работаете.

Как это работает:

Имеется два варианта решения вопроса.

1 - Свой вариант шаблона PDF

Для начала скачайте файл шаблона PDF (generete_pdf_order.php) из вложения в конце статьи, либо, если Вы не плохо обладаете знаниями PHP можете сами отредактировать имеющийся шаблон.

Итак, скачанный файл загрузите в директорию сайта /components/com_jshopping/lib/ заменив имеющийся.

В административной части сайта в разделе «Опции» создайте новый способ оплаты, если это необходимо.

Перейдите в настройки магазина на вкладку «Заказ» и установите галочку напротив значения «Присылать PDF-счет для заказчика», для того, чтобы счет приходил на почту заказчику в виде вложения.

Также в настройках магазина перейдите на вкладку «Информация о магазине» и заполните все поля в соответствии с пояснениями на изображении ниже

"Счет на оплату безналичным расчетом" для JoomShopping. Способ 1-ый.

После сохранения всех данных, там же на вкладке «Информация о магазине» в самом низу, кликнув на ссылку «Просмотреть PDF», Вы сможете увидеть как примерно будет выглядеть Ваш счет.

Прежде, чем переходить к другим настройкам, давайте разберем второй способ.

2 - Addon RUS Invoice

Данный метод более оптимален, т.к. Вы спокойно сможете обновлять компонент JoomShopping.

Разработчики позаботились и о русскоязычном населении, предложив дополнение для компонента. Скачайте это дополнение по ссылке или из вложения в конце статьи. Установите его с помощью «Установка и обновление» внутри компонента JoomShopping.

Перейдите в «Опции → Дополнения» и нажмите кнопку редактирования напротив установленного дополнения. Укажите все необходимые данные в открывшемся окне.

В административной части сайта в разделе «Опции» создайте новый способ оплаты, если это необходимо.

Перейдите в настройки магазина на вкладку «Заказ» и установите галочку напротив значения «Присылать PDF-счет для заказчика», для того, чтобы счет приходил на почту заказчику в виде вложения.

Также в настройках магазина перейдите на вкладку «Информация о магазине» и заполните все поля в соответствии с пояснениями на изображении ниже

"Счет на оплату безналичным расчетом" для JoomShopping. Способ 2-ой.

Как добавить подпись и штамп (печать)?

Вариант, который использую я - в настройках магазина на вкладке «Информация о магазине» в самом низу есть возможность указать изображения для верхнего и нижнего колонтитула. Добавьте в верхний колонтитул изображение штампа (печати), а в нижний - изображение подписи. Изображения должны быть на белом фоне и в формате JPG.

Теперь необходимо отредактировать файл шаблона PDF. Если Вы воспользовались первым способом, тогда Вам необходимо редактировать файл /components/com_jshopping/lib/generete_pdf_order.pdf, если же второй - /plugins/jshoppingorder/addon_rus_invoices_for_payment/ addon_rus_invoices_for_payment.php

Я использую второй метод, думаю им воспользуются большинство, поэтому опишу как править этот шаблон.

В файле addon_rus_invoices_for_payment.php найдите и закомментируйте следующие строки:

$pdf->Image($jshopConfig->path.'images/header.jpg',1,1,$jshopConfig->pdf_header_width,$jshopConfig->pdf_header_height);
$pdf->Image($jshopConfig->path.'images/footer.jpg',1,265,$jshopConfig->pdf_footer_width,$jshopConfig->pdf_footer_height);

Поднимитесь и найдите следующие строки

$pdf->MultiCell(180, 1 , $this->mb_ucfirst($this->SumProp($this->formatprice($order->order_total),$order->currency_code)),'0','L');
$y = $y + 20;

Эта строка выводит итоговую стомость в счет и делает отступ до подписей директора и бухгалтера. После отступа сделайте вывод изображений:

$pdf->MultiCell(180, 1 , $this->mb_ucfirst($this->SumProp($this->formatprice($order->order_total),$order->currency_code)),'0','L');
$y = $y + 20; 
$pdf->Image($jshopConfig->path.'images/header.jpg',120,$y-13,$jshopConfig->pdf_header_width,$jshopConfig->pdf_header_height);
$pdf->Image($jshopConfig->path.'images/footer.jpg',70,$y-17,$jshopConfig->pdf_footer_width,$jshopConfig->pdf_footer_height);

Где первое изображение - это верхний колонтитул (штамп), а второе - нижний колонтитул (подпись). Откалибруйте позицию для изображений по горизонтали (у меня это 120 и 70, для первого и второго изображений соответственно) и по вертикали (у меня это $y-13 и $y-17).

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

Как отправлять счет только при определенных способах оплаты?

Может получиться так, что Вы не намерены отправлять PDF счет по всем способам оплаты, тогда Вам достаточно отредактировать файл /components/com_jshopping/models/checkout.php

Найдите строки:

$pdfsend = 1;
if ($jshopConfig->send_invoice_manually && !$manuallysend) $pdfsend = 0;

И замените их наследующие:

$pdfsend = 1;
if (($jshopConfig->send_invoice_manually && !$manuallysend) || $order->payment_method_id != 8) $pdfsend = 0;

Где $order->payment_method_id != 8 означает в моём случае, что не нужно отсылать PDF счет, если выбран способ оплаты с ID 8. Узнать свои идентификаторы оплаты Вы можете в административной части сайта, перейдя в «Опции → Способы оплаты» магазина, и просмотрев поле «id» напротив интересующих Вас способов оплаты.

UPDATE:

Начиная с версии 4.11 в Joomshopping была переделана структура функций и моделей, поэтому описанный выше код для отправки счета при определенных методах оплаты отсутствует. Для того, чтобы решить этот вопрос, необходимо открыть файл ordermail.php, расположенный в каталоге /components/com_jshopping/models и найти в нем следующий код:

if ($pdfsendtype){
	$mailer->addAttachment($jshopConfig->pdf_orders_path."/".$this->order->pdf_file);
}

Здесь необходимо исправить условие отправки PDF-счета следующим образом:

if ($pdfsendtype && $this->order->payment_method_id != 8){
	$mailer->addAttachment($jshopConfig->pdf_orders_path."/".$this->order->pdf_file);
}

Как и выше, с помощью $this->order->payment_method_id != 8 мы указали ID метода оплаты, для которого не нужно отправлять PDF-счет.

 

В результате всех проделанных манипуляций получаем примерный результат, изображенный ниже

"Счет на оплату безналичным расчетом" для JoomShopping. PDF счет.

Как выводить правильные единицы измерения?

Те, кто решил воспользоваться дополнением Addon RUS Invoice, думаю обратили внимание, что независимо от настроек магазина в PDF-счете единица измерения остается неизменной, постоянно килограммы. Дело в том, что разработчики не позаботились о корректном отображении единиц измерения. Поэтому предлагаю решить данный вопрос.

Итак, у нас уже установлен интернет-магазин Joomshopping, дополнение Addon RUS Invoice для PDF-счета и всё настроено должным образом. В Joomshopping в настройках имеется возможность изменить единицы измерения, но они применяются ко всем товарам, хотя нам необходимо, чтобы у разного типа товаров были свои единицы измерения (килограммы, литры, метры и т.д.).

Для этого нам необходимо настроить функционал магазина. Переходим в «Joomshopping -> Настройки -> Функции магазина». Отмечаем галочки «Базовая цена» и «Единицы измерения». Также, в настройках необходимо перейти на вкладку «Заказ» и убедиться, что установлена галочка напротив поля «Базовая цена», иначе в таблицу заказов не будет заноситься информация о базовой цене и единицах измерения.

В «Joomshopping –> Опции» появится раздел «Единицы измерения», где мы можем добавить нужные для нас. Теперь переходим в карточку товара и на вкладке «Информация о товаре» в самом низу выбираем необходимую нам единицу измерения. Учитывая, что базовая цена рассчитывается как цена/базовая цена, то в поле «базовая цена» указываем единицу (1). Вам не обязательно работать с базовой ценой товара, этот функционал необходим нам исключительно для единиц измерения.

После того, как мы настроили все товары. Открываем файл /plugins/jshoppingorder/addon_rus_invoices_for_payment/ addon_rus_invoices_for_payment.php и находим следующую строчку:

$pdf->MultiCell(20, 1, _JSHOP_ADDON_RUS_INVOICES_PAYMENT_CHT, 0 , 'C');

Как видите, разработчики выводят единицу измерения обычной текстовой константой. Давайте исправим её на следующую:

$pdf->MultiCell(20, 1, $prod->basicpriceunit, 0 , 'C');

Совет: Для тех, кому интересно, последний символ в строке означает выравнивание и может принимать следующие значения: L – по левому краю; R – по правому краю; C – по центру.

Если Вы сейчас попробуете просмотреть PDF-счет из административной части («Joomshopping -> Настройки -> Информация о магазине»), то увидите, что поле «Единица» пустое. Это связано с тем, что в PDF-счет таким способом добавляются демо-данные. Поэтому, чтобы убедиться в правильности проделанных действий, необходимо с лицевой части сайта произвести покупку товара.

Важно: Помните, что сделанные заказы в Joomshopping заносятся в базу данных единожды. Если Вы произвели какие-либо изменения в товарах и хотите увидеть результат, Вам необходимо сделать новый заказ.

Ничего сложного!

На этом всё. Если у Вас имеются свои методы решения данного вопроса, предлагаю поделиться ими в комментариях.


Оставьте свой комментарий

Оставить комментарий от имени гостя

0 / 2500 Ограничение символов
Ваш текст должен быть в пределах 10-2500 символов
70 Комментарии | Добавить свои
  • Гость - Sticher78

    Да что вы?
    Не надо считать всех тупыми или недалёкими.
    Ничего что вы ошибку сами допустили, указав неверный код?
    Потому и не отправлялось
    <code>
    $pdfsend = 1;
    if (($jshopConfig->send_invoice_manually && !$manuallysend) || $order->payment_method_id != 8) $pdfsend = 0;
    </code>
    А надо:
    <code>
    $pdfsend = 1;
    if (($jshopConfig->send_invoice_manually && !$manuallysend) || $order->payment_method_id !== 8) $pdfsend = 0;
    </code>

    Нравится 0 Короткий URL:
  • Буквально только что оттестировал описанный в статье метод отправки счета для определенных способов оплаты на JS 4.15.1 и 4.16.0. Метод полностью рабочий без каких-либо изменений.
    Но... Лишь сейчас обратил внимание на то, что Вы говорите про JS 4.15.1, а код правок показываете для более старых версий.
    Код для версии JS выше 4.11 должен быть следующего вида:

    if ($pdfsendtype && $this->order->payment_method_id != 8){
    	$mailer->addAttachment($jshopConfig->pdf_orders_path."/".$this->order->pdf_file);
    }

    У вас точно JS 4.15.1? Потому что представленный Вами код просто некуда вставлять. Проверьте, на всякий случай, верный ли код Вы используете. И, если да, но метод не работает, то, просьба, вышлите на почтовый ящик info@blog-about.ru следующие два файла:
    /components/com_jshopping/models/ordermail.php
    /components/com_jshopping/models/checkout.php

    Нравится 0 Короткий URL:
  • Во-первых, никто никого не считает тупыми и недалекими. Если Вы дошли до момента редактирования кода, то уже предполагаются какие-то знания в этой области. Во-вторых, любую проблему принято решать с поиска наипростейшей ошибки. Отсюда, странно, что Вы приняли мой ответ как оскорбление. И в-третьих, в данном примере всё корректно, и тождественное неравенство здесь совершенно излишне, т.к. $order->payment_method_id итак возвращает числовое значение.
    На выходных обязательно постараюсь оттестировать метод на JS 4.15.1, возможно там действительно что-то изменилось.

    Комментарий последний раз редактировался в около 6 месяцев назад Администратор
    Нравится 0 Короткий URL:
  • Гость - Sticher78

    Приветствую.
    Вопрос по "Как отправлять счет только при определенных способах оплаты?"
    Используется JShopping 4.15.1.
    И способ, указанный в "Update" не работает - просто перестаёт прикрепляться к письму pdf-счёт вообще.
    Подскажите, пжлст, как решить этот вопрос.

    Нравится 0 Короткий URL:
  • Код файла ordermail.php в JS 4.11.6 и 4.15.1 практически идентичен. Убедитесь, что Вы указали верный ID способа оплаты, для которого нужно (или не нужно) отправлять PDF, а также убедитесь в корректности самого условия отправки. В примере я задаю условие не отправлять PDF для указанного способа оплаты.

    Нравится 0 Короткий URL:
  • Гость - Павел

    Спасибо за ответ - помогло. Еще необходимо вывести артикул товара - возможно ли? В базе в таблице #__jshopping_orders не нашел такого

    Нравится 0 Короткий URL:
  • Откройте файл для редактирование, и посмотрите на основные используемые переменные:
    $vendorinfo - хранит значения таблицы _jshopping_vendors
    $order - таблица _jshopping_orders
    $prod - таблица _jshopping_order_item

    Произведите поиск в этом файле по слову "product_ean", будет найдено одно значение в блоке кода:

    if ($jshopConfig->show_product_code_in_order && 0){
    	$pdf->SetXY(85, $y + 1);
    	$pdf->MultiCell(22, 4, $prod->product_ean, 0, 'L');
    	$y3 = $pdf->getY() + 1;
    }else{
    	$y3 = $pdf->getY();
    }


    Это значит, что артикул продукта уже выводится, но при условии, что настройка включена. Поэтому перейдите в административную часть сайта, "Компоненты -> JoomShopping -> Настройки -> Заказ", и установите галочку напротив параметра "Показать код товара". После сохранения настроек в счете должны появиться артикулы.

    Нравится 0 Короткий URL:
  • Гость - Павел

    Спасибо за решение, подскажите как на место плательщика вставить ФИО заказчика, вместо названия фирмы

    Нравится 0 Короткий URL:
  • Если Вы используете метод решения через Аддон RUS Invoices, то откройте файл /plugins/jshoppingorder/addon_rus_invoices_for_payment/ addon_rus_invoices_for_payment.php
    Найдите там строчку:

    if($order->firma_name)$adress[]=$order->firma_name;

    Замените $order->firma_name на $order->f_name, $order->l_name и $order->m_name, в результате у Вас получится что-то вроде:
    if($order->f_name)$adress[]=$order->f_name . ' ' . $order->l_name . ' ' . $order->m_name;

    Всё зависит от того, что именно Вы хотите вывести. Все доступные поля переменной $order Вы можете посмотреть в базе данных в таблице #__jshopping_orders

    Комментарий последний раз редактировался в около 8 месяцев назад Администратор
    Нравится 0 Короткий URL:
  • В файле addon_rus_invoices_for_payment.php заменил строку:

    $pdf->MultiCell(20, 1, _JSHOP_ADDON_RUS_INVOICES_PAYMENT_CHT, 0 , 'C');

    на строку:
    $pdf->MultiCell(20, 1, number_format($prod->product_item_price / $prod->basicprice, 0), 0 , 'C');

    Проверил карточку товара, в админке в Информации о товаре в поле Базовая цена, стоит цифра, указывающая кол-во штук.
    Сделал тестовую покупку. В ордере в нужном поле стоит значение 0.
    Зашел в базу данных, нашел таблицу _jshopping_order_item
    В данной таблице в поле basicprice стоит значение 0.
    В поле basicpriceunit нет ничего.

    Нравится 0 Короткий URL:
Загрузить еще