![](/s/1911/10/_/images/icons/emoticons/warning.gif)
- Описание системы шаблонов печати
- Переменные
- Шаблоны .html
- Сумма всех тарифных услуг
- Скрипт выводящий (Буквами), за какой месяц счет.
- Вывод списка услуг c их стоимостью вместо фактического потребления услуг
- Математические операции.
- Циклы
- Добавление QR code.
- Несколько учетных записей.
- Разные договора в агентских счетах
- Шаблоны .docx
- Расположение файлов на сервере
Описание системы шаблонов печати
Шаблон.png - Это один из шаблонов по умолчанию, карточка абонента. При печати карточки такого абонента - Абонент.png может быть создан следующий html-документ - Карточка.png. Обратите внимание что текст шаблона содержащий переменные был заменен на различный текст. Так например вместо {{ abonent.name }} было подставлено "ООО Лучший провайдер". Важно заметить и знать, что если при печати переменная не содержит значения, то будет вставлена пустая строка и никаких сообщений об ошибке не появится.
![]() | Для того, чтобы печатать финансовые документы, как PDF, необходимо перейти в настройки оператора связи - настройки биллинга и включить опцию "Печатать финансовые документы, как PDF" |
Переменные
Ниже приведен неполный список доступных к использованию переменных:
- abonent - Информация по абоненту. У этой переменной есть поля, содержащие более детальную информацию. Список полей:
- name - ФИО абонента
- contract_number - Номер договора абонента.
- email - Адрес электронной почты абонента.
- sms - Телефонный номер абонента.
- home - Адрес дома абонента.
- a_home_number - Номер квартиры абонента.
- create_date - Дата договора.
- nds - процент НДС
- tarif - Тариф абонента. У этой переменной есть поля, содержащие более детальную информацию. Список полей:
- name - Название тарифа.
- tarif_group - Текстовое имя группы тарифа.
- limit - Ограничение по данному тарифу.
- get_abon_sum - Абонентская плата тарифа.
- users - Содержит список учетных записей абонента. {{ users.0 }} - первая учетная запись абонента, {{ users.1 }} - вторая учетная запись абонента, {{ users.2 }} - третья учетная запись абонента и т.д.. У каждой учетной записи есть поля, содержащие более детальную информацию. Список полей:
- login - логин учетной записи.
- gen_pwd - пароль учетной записи.
- ip - IP адрес учетной записи.
- hw_serial - серийный номер оборудования.
- mask - Маска подсети учетной записи.
- mask_str - Маска подсети в десятичной форме.
- pull - IP пул абонента
- gateway - шлюз, указанный в пуле
- full_credit_summ - сумму текущего счёта + задолженность за предыдущий период.
- services - Содержит список активных услуг абонента. {{ services.0 }} - первая услуга абонента, {{ services.1 }} - вторая услуга абонента, {{ services.2 }} - третья услуга абонента и т.д.. У каждой услуги есть поля, содержащие более детальную информацию. Список полей:
- comment - Примечание.
- usluga - Услуга абонента. У этой переменной есть поля, содержащие более детальную информацию. Список полей:
- name - Название услуги.
- nds - процент НДС
- summa - цена услуги
- activate_pay - стоимость подключения услуги
- active_services - Содержит список включенных, но, не обязательно, активных услуг абонента. {{ active_services.0 }} - первая услуга абонента, {{ active_services.1 }} - вторая услуга абонента, {{ active_services.2 }} - третья услуга абонента и т.д.. У каждой услуги есть поля, содержащие более детальную информацию. Список полей аналогичен services
- operator - Оператор связи, обслуживающий абонента. У этой переменной есть поля, содержащие более детальную информацию.
- name - Название оператора связи.
- email - Адрес электронной почты оператора связи.
- sms - Телефон оператора связи.
- operator_attrs - Содержит список значений реквизитов оператора. Полный список доступных реквизитов можно посмотреть в разделе "Справочники" на вкладке "Реквизиты" - Реквизиты.png. Для указания реквизита через точку к названию переменной необходимо дописать его номер, т.е. например {{ operator_attrs.25 }} подставит значения реквизита "Юридический адрес".
- abonent_attrs - Содержит список значений реквизитов абонента. Полный список доступных реквизитов можно посмотреть в разделе "Справочники" на вкладке "Реквизиты" - Реквизиты.png. Для указания реквизита через точку к названию переменной необходимо дописать его номер, т.е. например {{ abonent_attrs.33 }} подставит значения реквизита "Комментарий".
- abonent_attrs_names - Содержит список названий реквизитов абонента. Например {{ abonent_attrs_names.33 }} подставит название реквизита, т.е. "Комментарий".
- voip_logs - Содержит список звонков у каждой учетной записи абонента.
- account_number - Номер абонента в учетной записи
- s_time - время начала звонка.
- mask - маска исходящего номера.
- direction_name - направление звонка
- v - время звонка в минутах
- bill_sum - стоимость звонка.
- account_number - Номер абонента в учетной записи
- descr - содержимое поля "Описание" при формировании документа.
- abonent_status - статус подключения
- abonent_substatus - подстатус подключения
- account - лицевой счет
- balance - текущий баланс
- balance_buh - баланс бухгалтерский
Переменные для шаблона заявки HelpDesk в DocX
- id - ID заявки
- *suid * -
- parent - информация о родительской (номер заявки, Название/ФИО)
- hdsk_datetime - дата создания заявки
- subj - Тема заявки
- text - Описание заявки
- status - Статус
- abonent - Название/ФИО абонента
- hdsk_type - Тип запроса
- performed_whom - Кому назначено
- performed_when - Когда назначено
- closed_when - Когда исполнено (установлен статус "Закрыто")
- creator -
- is_task - Заполняется если задача CRM (не HelpDesk)
- operator - Принадлежит оператору
Атрибуты заявки:
- attribute.pk - ID атрибута
- attribute.code - код атрибута в формате "attr_ID"
- attribute.name - Наименование атрибута
- attribute.item - Значение
Комментарии
- comment.id - ID комментария
- comment.text - Текст комментария
- comment.creator_abonent - Автор (Название/ФИО)
- comment.hdsk_parent - информация о родительской (номер заявки, Название/ФИО)
- comment.read_comment - флаг о прочтении комментария
Вывести на печать все атрибуты указанные в заявке можно так:
{% for attribute in hdsk_attribute %}
pk {{ attribute.pk }}
code {{ attribute.code }}
name {{ attribute.name }}
item {{ attribute.item }}
{% endfor %}
Вывести на печать все комментарии можно так:
{% for comment in hdsk_parent_id_comments %}
id {{ comment.id }}
text {{ comment.text }}
creator_abonent {{ comment.creator_abonent }}
hdsk_parent {{ comment.hdsk_parent }}
read_comment {{ comment.read_comment }}
{% endfor %}
Отладка
![]() | Вывод всех доступных в шаблоне переменных <pre>{% debug %}</pre> |
Шаблоны .html
При создании и редактировании шаблона возможно использование переменных печати в формате Django Template. Возможные тэги django template можно посмотреть в данной статье на русском языке и официальной документации Django на английском языке (большая часть документации по версии 1.7 так же применима к используемой версии 1.6). Для вставки значения из переменной в шаблоне необходимо использовать две пары фигурных скобок с названием переменной внутри, т.е. вот так - {{ название_переменной }} . Ниже приведен небольшой пример.
Сумма всех тарифных услуг
Чтобы получить эту сумму в документе, нужно обратитьсяк модели tarif, но через абонента. Проще, говоря, вот так:
{{ abonent.tarif.get_abon_sum }}
Скрипт выводящий (Буквами), за какой месяц счет.
Без склонения месяц выводится:
{{ op_date|date:"E" }}
Для вычисления предыдущего месяца нужно в начало шаблона добавить загрузку математических фильтров
{% load mathfilters %}
Далее редактировать строку с датой
{% with month=op_date.month|sub:1 %} Счет на оплату № {{ number }} от {{ op_date|date:"d.m.y" }} за {% if month == 1 %} январь {% elif month == 2 %} февраль {% elif month == 5 %} май {% endif %} {% endwith %}
Вывод списка услуг c их стоимостью вместо фактического потребления услуг
В случае, если Вам требуется вывести только набор услуг абонента попавший в счет и их стоимость по тарифу замените стандартную таблицу набора услуг, отражающую фактическое потребление за период счета согласно настройкам, приведённой ниже.
<table border="1" style="font-size: 8pt" cellpadding="2"> <tr style="text-align: center; font-weight: bold"> <td width="260">Товары (работы, услуги)</td> </tr> <table border="1" style="font-size: 8pt" cellpadding="2"> <tr style="text-align: center; font-weight: bold"> <td width="260">Товары (работы, услуги)</td> <td width="70">Стоимость</td> </tr> {% regroup services by name as uslugi_list %} {% for service in uslugi_list %} <tr> <td width="260">Абонентская плата за услугу: {{ service.grouper }}</td> {% regroup service.list by usluga as uslugas %} {% for grouper in uslugas %} <td width="260" align="right">{{ grouper.grouper.summa|floatformat:2 }}</td> {% endfor %} </tr> {% endfor %} </table> </table>
Математические операции.
{% load mathfilters %} {{ service.price|mul:0.8|floatformat:2 }} {# Умножение стоимости услуги на 0.8 с округлением до 2 знаков #} {{ service.price|div:5 }} {# Деление #} {{ service.price|add:5 }} {# Сложение #} {{ service.price|addf:5 }} {# Сложение дробных чисел #} {{ service.price|sub:5 }} {# Вычитание #}
Циклы
{% with op_summa|div:1.2 as test %} {{test}} {% endwith %}
Добавление QR code.
QR-коды формируются согласно ГОСТ
{% load pytils_numeral %} {% load mathfilters %} {% load qr_code %} <!DOCTYPE html> <html> <body> <div class="container"> <div><img width=200 height=200 src="{{MEDIA_URL}}{% generate_qrcode inst operator_attrs.2 operator_attrs.6 operator_attrs.7 operator_attrs.8 op_summa|mul:100 'Назначение платежа' operator_attrs.4 abonent_attrs.3 abonent_attrs.1002 abonent_attrs.1001 abonent_attrs.1003 operator_attrs.12 %}" alt="альтернативный текст"></div> </div> </body> </html>
В шаблон передаются следующие параметры
Оператора связи
operator_attrs.2 - Наименование
operator_attrs.6 - Счет
operator_attrs.7 - Банк
operator_attrs.8 - БИК
op_summa - сумма, по ГОСТ она должна быть в копейках, поэтому в документе подключен модуль mathfilters и сумма умножена на 100
Назначение платежа - указать текст без ковычек
operator_attrs.4 - ИНН
operator_attrs.12 - корреспондентский счет (в биллинге к/с)
Абонента
abonent_attrs.3 - Адрес
abonent_attrs.1002 - Имя
abonent_attrs.1001 - Фамилия
abonent_attrs.1003 - Отчество
Несколько учетных записей.
В случае если в одном счете указанно несколько абонентов есть возможность отобразить все данные из всех учетных записей этих абонентов.
Пример - отображение телефонных номеров
{% for user in users %} {{ user.phone.phone }} {% endfor %}
Разные договора в агентских счетах
Если Вы предоставляете услуги телефонии по [агентской схеме] и абонент подписывает с каждым оператором отедьные договора с разными номерами, можно выводить соответствующий номер в финансовых документах.
Допустим, у Вас есть несколько партнёров: Вымпелком, ТТК, МТС.
- Заполните у операторов реквизит "Наименование
- Создайте в справочники "Реквизиты" три реквизита с типом текст:
- "Номер договора с оператором Вымпелком"
- "Номер договора с оператором ТТК"
- "Номер договора с оператором МТС"
- Предположим, что реквизиты получили ID (номера) 1001, 1002 и 1003 соответственно. Добавьте в шаблон следующую конструкцию:
{% if agent_operator_attr.2 == "Вымпелком" %} {{ abonent_attrs.1001 }} {% elif agent_operator_attr.2 == "ТТК" %} {{ abonent_attrs.1002 }} {% elif agent_operator_attr.2 == "МТС" %} {{ abonent_attrs.1003 }} {% endif %}
В условиях имена операторов долдны быть написаны так же как они указаны в их реквизитах - Добавьте абонентам соответствующие реквизиты.
Шаблоны .docx
При создании и редактировании шаблона возможно использование переменных печати в формате Jinja2. В большинстве случаев всё аналогично шаблонам HTML.
Различия:
- Значение по умолчанию. Если в HTML шаблоне была конструкция вида
{{ sms|default_if_none:"---" }}
, то в DOCX следует использовать
{{ sms|default("---", true) }}
- Форматирование даты. Используется фильтр dateformat. Если в HTML шаблоне была конструкция вида
{{ create_date|date:"d.m.y" }}
, то в DOCX следует использовать
{{ create_date|dateformat("%Y.%m.%d") }}
- Вывод текущего времени. Используется метод now(), который выводит время в формате, для отображения в нужном формате можно использовать фильтр, например:
{{ now() | dateformat('%d.%m.%Y') }}
- Форматирование валюты. Используется фильтр rubles. Для принудительной печати копеек в целых суммах следует использовать
{{ account.balance|rubles(True) }}
- Реквизиты абонентов выводятся следующим образом. Вывести значение реквизита "Комментарий":
{{ abonent_attrs['33'] }}
Для того, что бы вывести список всех доступных реквизитов воспользуйтесь конструкцией:
{% for attr in abonent_attrs %} {{ abonent_attrs_names[attr] }}: {{ abonent_attrs[attr] }} {% endfor %}
Реквизит ФИО состоит из трех частей (фамилия, имя, отчество), каждую из которых можно вывести по-отдельности:
{% if abonent_attrs %} Фамилия: {{ abonent_attrs['24']['0'] }} {% endif %}
Для корректного вывода данного реквизита полностью, необходимо использовать конструкцию:
{% if abonent_attrs %} {{ abonent_attrs['24']['0'] }} {{ abonent_attrs['24']['1'] }} {{ abonent_attrs['24']['2'] }} {% endif %}
- При проверке шаблона с чем-то вроде users.0.something используется специальный абонент, у которого количество users равно нулю. Для того, чтобы шаблон проходил проверку, необходимо оборачивать элементы шаблона в if:
{% if users.0 %} {{users.0.something}} {% endif %}
- Для суммирования сумм всех услуг абонента используется данная конструкция:
{{ services | sum(attribute='summ')}}
- Для суммирования сумм всех услуг абонента с округлением до 2 знака после запятой используется следующая конструкция:
{{ "%.2f"|format(services | sum(attribute='summ'))}}
- Для вывода месяца, в который был выставлен счет используется следующий шаблон:
{% if op_date | dateformat('%-m') == '1' %}Январь{% elif op_date | dateformat('%-m') == '2' %}Февраль{% elif op_date | dateformat('%-m') == '3' %}Март{% elif op_date | dateformat('%-m') == '4' %}Апрель{% elif op_date | dateformat('%-m') == '5' %}Май{% elif op_date | dateformat('%-m') == '6' %}Июнь{% elif op_date | dateformat('%-m') == '7' %}Июль{% elif op_date | dateformat('%-m') == '8' %}Август{% elif op_date | dateformat('%-m') == '9' %}Сентябрь{% elif op_date | dateformat('%-m')== '10' %}Октябрь{% elif op_date | dateformat('%-m') == '11' %}Ноябрь{% elif op_date | dateformat('%-m') == '12' %}Декабрь{% else %}--- {% endif %}
Например, так можно вывести дату договора в формате "«05» ноября 2020г."
«{{ abonent.create_date|dateformat("%d") }}» {% if abonent.create_date | dateformat('%-m') == '1' %}января{% elif abonent.create_date | dateformat('%-m') == '2' %}февраля{% elif abonent.create_date | dateformat('%-m') == '3' %}марта{% elif abonent.create_date | dateformat('%-m') == '4' %}апреля{% elif abonent.create_date | dateformat('%-m') == '5' %}мая{% elif abonent.create_date | dateformat('%-m') == '6' %}июня{% elif abonent.create_date | dateformat('%-m') == '7' %}июля{% elif abonent.create_date | dateformat('%-m') == '8' %}августа{% elif abonent.create_date | dateformat('%-m') == '9' %}сентября{% elif abonent.create_date | dateformat('%-m')== '10' %}октября{% elif abonent.create_date | dateformat('%-m') == '11' %}ноября{% elif abonent.create_date | dateformat('%-m') == '12' %}декабря{% else %}--- {% endif %} {{ abonent.create_date|dateformat("%Y") }}г.
- Для применения математической операции необходимо предварительно перевести значение исходных данных в тип данных int (если число целое без дробной части) или float (если число с дробной частью)
Пример умножения цены step_price(которая равна 1.5) на 1.2. В выводе будет число 1.8{{ voip_log. step_price*1.2 | float}}
- При необходимости печати разных документов для физических и юридических лиц шаблоны печати помещаются в один файл .docx следующим образом:
{% if abonent.company %} <Вставляем шаблон печати договора юридического лица> {% else %} <Вставляем шаблон печати договора физического лица> {% endif %}
- Для отображения суммы стоимости тарифа
{{ abonent.tarif.get_abon_sum() }}
Примеры шаблонов
Расположение файлов на сервере
Файлы шаблонов хранятся на сервере биллинга в каталоге:
/app/asr_billing/mnt/var/print_tmpl/