Просмотр Исходного

{toc}

h2. Шаблоны HTML

При создании и редактировании шаблона возможно использование переменных печати в формате Django Template. Возможные тэги django template можно посмотреть в данной статье [https://djbook.ru/rel1.6/ref/templates/builtins.html] Для вставки значения из переменной в шаблоне необходимо использовать две пары фигурных скобок с названием переменной внутри, т.е. вот так \-  {{ название_переменной }} . Ниже приведен небольшой пример.

[Использование шаблона печати и его настройка^Шаблон.png] - Это один из шаблонов по умолчанию, карточка абонента. При печати карточки такого абонента - [Использование шаблона печати и его настройка^Абонент.png] может быть создан следующий html-документ \- [Использование шаблона печати и его настройка^Карточка.png]. Обратите внимание что текст шаблона содержащий переменные был заменен на различный текст. Так например вместо *{{ abonent.name }}* было подставлено _"ООО Лучший провайдер"_. Важно заметить и знать, что если при печати переменная не содержит значения, то будет вставлена пустая строка и никаких сообщений об ошибке не появится.

Ниже приведен неполный список доступных к использованию переменных:
* *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 адрес учетной записи.
** *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* \- стоимость звонка.
* *descr* \- содержимое поля "Описание" при формировании документа.
* *abonent_status* \- статус подключения
* *abonent_substatus* \- подстатус подключения
* *account* - лицевой счет
** *balance* - текущий баланс

{tip}
Вывод всех доступных в шаблоне переменных
{code}
<pre>{% debug %}</pre>
{code}
{tip}

{info}Для того, чтобы печатать финансовые документы, как PDF, необходимо перейти в настройки оператора связи - настройки биллинга и включить опцию "Печатать финансовые документы, как PDF"{info}

!PDF.png|border=1!

h2. Шаблоны .html

Для шаблонов печати используется шаблонизатор Django версии 1.6, тем не менее большая часть документации по версии 1.7 так же применима к шаблонам используемой версии: https://docs.djangoproject.com/en/1.7/ref/templates/builtins/

h3. Скрипт выводящий (Буквами), за какой месяц счет.

Без склонения месяц выводится:
{code}
{{ op_date|date:"E" }}
{code}

Для вычисления предыдущего месяца нужно в начало шаблона добавить загрузку математических фильтров
{code}
{% load mathfilters %}
{code}

Далее редактировать строку с датой
{code}
{% 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 %}
{code}

h3. Вывод списка услуг c их стоимостью вместо фактического потребления услуг
В случае, если Вам требуется вывести только набор услуг абонента попавший в счет и их стоимость по тарифу замените стандартную таблицу набора услуг, отражающую фактическое потребление за период счета согласно [настройкам|CarbonBilling:Счет на предоплату], приведённой ниже.
{code}<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>{code}

h3. Математические операции.
{code}
{% load mathfilters %}
{{ service.price|mul:0.8|floatformat:2 }} {# Умножение стоимости услуги на 0.8 с округлением до 2 знаков #}
{{ service.price|div:5 }} {# Деление #}
{{ service.price|add:5 }} {# Сложение #}
{{ service.price|sub:5 }} {# Вычитание #}
{code}

h2. Шаблоны .docx

При создании и редактировании шаблона возможно использование переменных печати в формате *Jinja2*. В большинстве случаев всё аналогично шаблонам HTML.

Различия:

# Значение по умолчанию. Если в HTML шаблоне была конструкция вида {code}{{ sms|default_if_none:"---" }}{code}, то в DOCX следует использовать {code}{{ sms|default("---", true) }}{code}
# Форматирование даты. Используется фильтр *dateformat*. Если в HTML шаблоне была конструкция вида {code}{{ create_date|date:"d.m.y" }}{code}, то в DOCX следует использовать {code}{{ create_date|dateformat("%Y.%m.%d") }}{code}
# Вывод текущего времени. Используется метод *now()*, который выводит время в формате, для отображения в нужном формате можно использовать фильтр, например: {code}{{ now() | dateformat('%d.%m.%Y') }}{code}
# Форматирование валюты. Используется фильтр *rubles*. Для принудительной печати копеек в целых суммах следует использовать {code}{{ account.balance|rubles(True) }}{code}
# Реквизиты абонентов выводятся следующим образом. Вывести значение реквизита "Комментарий":
{code} {{ abonent_attrs['33'] }} {code}
Для того, что бы вывести список всех доступных реквизитов воспользуйтесь конструкцией:
{code}
{% for attr in abonent_attrs %}
{{ abonent_attrs_names[attr] }}: {{ abonent_attrs[attr] }}
{% endfor %}
{code}
# При проверке шаблона с чем-то вроде {{users.0.something}} используется специальный абонент, у которого количество users равно нулю. Для того, чтобы шаблон проходил проверку, необходимо оборачивать элементы шаблона в if:
{code}
{% if users.0 %} {{users.0.something}} {% endif %}
{code}
# Для суммирования сумм всех услуг абонента используется данная конструкция:
{code}
{{ services | sum(attribute='summ')}}
{code}
# Для суммирования сумм всех услуг абонента с округлением до 2 знака после запятой используется следующая конструкция:
{code}
{{ "%.2f"|format(services | sum(attribute='summ'))}}
{code}
# Для вывода месяца, в который был выставлен счет используется следующий шаблон:
{code}
{% 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 %}
{code}
# Для применение финансовой операции необходимо предварительно перевести значение, над которым необходимо провести финансовую операцию в тип данных *int*(если число целое без дробной части) или в тип данных *float*(если число с дробной частью)
Пример умножения цены step_price(которая равна 1.5) на 1.2. В выводе будет число 1.8
{code}
{{ voip_log. step_price*1.2 | float}}
{code}

h3. Примеры шаблонов

* [Карточка абонента|^abonent_card3.docx]
* [Счет|^bill_guPQBlr.docx]
* [Договор|^contract_dogovor.docx]