Использование шаблона печати и его настройка

Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.

Изменения (30)

просмотр истории страницы
h2. Шаблоны HTML
{toc:maxLevel=3}

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

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

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

!PDF.png|border=1!

h2. Переменные

Ниже приведен неполный список доступных к использованию переменных:
* *abonent* \- Информация по абоненту. У этой переменной есть поля, содержащие более детальную информацию. Список полей:
** *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* \- Маска подсети в десятичной форме.
* *abonent_status* \- статус подключения
* *abonent_substatus* \- подстатус подключения
* *account* \- лицевой счет
** *balance* \- текущий баланс
** *balance_buh* \- баланс бухгалтерский

h3. Переменные для шаблона заявки 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* \- флаг о прочтении комментария

Вывести на печать все атрибуты указанные в заявке можно так:
{code}{% for attribute in hdsk_attribute %}
pk {{ attribute.pk }}
code {{ attribute.code }}
name {{ attribute.name }}
item {{ attribute.item }}
{% endfor %}{code}

Вывести на печать все комментарии можно так:
{code}{% 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 %}{code}

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

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

!PDF.png|border=1!
При создании и редактировании шаблона возможно использование переменных печати в формате Django Template. Возможные тэги django template можно посмотреть в [данной статье на русском языке|https://djbook.ru/rel1.6/ref/templates/builtins.html] и [официальной документации Django на английском языке|https://docs.djangoproject.com/en/1.7/ref/templates/builtins/] (большая часть документации по версии 1.7 так же применима к используемой версии 1.6). Для вставки значения из переменной в шаблоне необходимо использовать две пары фигурных скобок с названием переменной внутри, т.е. вот так \-&nbsp; {{ название_переменной }} . Ниже приведен небольшой пример.

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

Чтобы получить эту сумму в документе, нужно обратитьсяк модели tarif, но через абонента. Проще, говоря, вот так:

{code}{{ abonent.tarif.get_abon_sum }}{code}

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

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

h2. Шаблоны Docx
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|addf:5 }} {# Сложение дробных чисел #}
{{ service.price|sub:5 }} {# Вычитание #}
{code}


h3. Циклы
{code}
{% with op_summa|div:1.2 as test %}
{{test}}
{% endwith %}
{code}

h3. Добавление QR code.

QR-коды формируются согласно [ГОСТ|http://roskazna.ru/dokumenty/dokumenty/vzaimodeystvie-s-bankovskoy-sistemoy/1157315/]


{code}
{% 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.1007 abonent_attrs.1006 abonent_attrs.1008 operator_attrs.12 %}?{% now 'U' %}" alt="QR-код"></div>
</div>
</body>
</html>
{code}
В шаблон передаются следующие параметры

h5. Оператора связи

operator_attrs.2 - Наименование
operator_attrs.6 - Счет
operator_attrs.7 - Банк
operator_attrs.8 - БИК
op_summa - сумма, по ГОСТ она должна быть в копейках, поэтому в документе подключен модуль mathfilters и сумма умножена на 100
Назначение платежа - указать текст без ковычек
operator_attrs.4 - ИНН
operator_attrs.12 - корреспондентский счет (в биллинге к/с)

h5. Абонента

abonent_attrs.3 - Адрес
abonent_attrs.1002 - Имя
abonent_attrs.1001 - Фамилия
abonent_attrs.1003 - Отчество

h3. Несколько учетных записей.

В случае если в одном счете указанно несколько абонентов есть возможность отобразить все данные из всех учетных записей этих абонентов.
Пример - отображение телефонных номеров

{code}
{% for user in users %} {{ user.phone.phone }} {% endfor %}
{code}

h3. Разные договора в агентских счетах

Если Вы предоставляете услуги телефонии по [агентской схеме|Взаиморасчеты между операторами, агентская схема телефонии и транзит] и абонент подписывает с каждым оператором отедьные договора с разными номерами, можно выводить соответствующий номер в финансовых документах.
Допустим, у Вас есть несколько партнёров: Вымпелком, ТТК, МТС.

# Заполните у операторов [реквизит|CarbonBilling:Реквизиты] "Наименование
# Создайте в справочники "Реквизиты" три реквизита с типом _текст_:
#* "Номер договора с оператором Вымпелком"
#* "Номер договора с оператором ТТК"
#* "Номер договора с оператором МТС"
# Предположим, что реквизиты получили ID (номера) 1001, 1002 и 1003 соответственно. Добавьте в шаблон следующую конструкцию:
{code}{% 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 %}{code}
{info}В условиях имена операторов долдны быть написаны так же как они указаны в их реквизитах{info}
# Добавьте абонентам соответствующие реквизиты.

h3. Вывод информации об оборудовании, установленное абоненту.

!equip.png|width=600px!

Использовать только в привязке _abonents_
{code}
{% for equip in abonent_id_equipment %}
id {{ equip.id }}
Описание {{ equip.name }}
Тип {{ equip.equipment_type }}
Серийный номер {{ equip.serial_no }}
{% endfor %}
{code}

h3. Вывод названия услуг в документах для печати

Получить название услуги в шаблоны печати можно следующим методом:
1. Используем привязку _FinanceOperations_ + доп.привязка _op_type_id=1_

{code}
{% for service in act_services %}
Абонентская плата за услугу: {{ service.name }}
{% endfor %}

****
{% for service in services %}
Название: {{ service.name }}
{{services.0.usluga.name}}
{% endfor %}
{code}

2. Если использовать привязку _FinanceOperations_ + доп.привязка _op_type_id=6_
{code}{{active_services.0}} {{active_services.1}} {{active_services.2}}{code}

h3. Вывод учетной записи определенного типа

Вывести учетную запись определенного типа(Internet, VOIP, IPTV, Sensor) можно с помощью конструкции:
{code}
{% for user in users %}
{% if user.service_type_id == 2 %}
{{ user.login }}
{% endif %}
{% endfor %}
{code}
Где 2 - id типа учетной записи

Соответствие типа учетной записи и id:
1 - Internet
2 - IPTV
3 - VOIP
4 - Sensor

h2. Шаблоны .docx

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

{% endfor %}
{code}
Реквизит ФИО состоит из трех частей (фамилия, имя, отчество), каждую из которых можно вывести по-отдельности:
{code}
{% if abonent_attrs %}
Фамилия: {{ abonent_attrs['24']['0'] }}
{% endif %}
{code}
Для корректного вывода данного реквизита полностью, необходимо использовать конструкцию:
{code}
{% if abonent_attrs %}
{{ abonent_attrs['24']['0'] }} {{ abonent_attrs['24']['1'] }} {{ abonent_attrs['24']['2'] }}
{% endif %}
{code}
Для вывода значения реквизита с отрицательным id(например, с id -219000), вместо минуса необходимо указывать "m":
{code}
{{ abonent_attrs['m219000'] }}
{code}
Вывод названия реквизита с отрицательным id:
{code}
{{ abonent_attrs_names["-219000"] }}
{code}
# При проверке шаблона с чем-то вроде {{users.0.something}} используется специальный абонент, у которого количество users равно нулю. Для того, чтобы шаблон проходил проверку, необходимо оборачивать элементы шаблона в if:
{code}
{% endif %}
{code}
Например, так можно вывести дату договора в формате "«05» ноября 2020г."
{code}
«{{ 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") }}г.
{code}
# Для применения математической операции необходимо предварительно перевести значение исходных данных в тип данных *int* (если число целое без дробной части) или *float* (если число с дробной частью)
Пример умножения цены step_price(которая равна 1.5) на 1.2. В выводе будет число 1.8
{code}
{{ voip_log. step_price*1.2 | float}}
{code}
# При необходимости печати разных документов для физических и юридических лиц шаблоны печати помещаются в один файл .docx следующим образом:
{code}
{% if abonent.company %}
<Вставляем шаблон печати договора юридического лица>
{% else %}
<Вставляем шаблон печати договора физического лица>
{% endif %}
{code}
# Для отображения суммы стоимости тарифа
{code}{{ abonent.tarif.get_abon_sum() }}{code}
# Требуется показать в шаблоне печати последние 3 символа логина
{code}{{ users.0.login|slice:"-3:" }}{code}

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

h3. Примеры шаблонов в формате *Docx*

* [Карточка абонента|^abonent_card3.docx]
* [Счет|^bill_guPQBlr.docx]
* [Договор|^contract_dogovor.docx]
* [Заявка HelpDesk/CRM|^helpdesk.docx]
* [Акт+распечатка звонков|^akt_and_voip.docx]

h2. Расположение файлов на сервере

Файлы шаблонов хранятся на сервере биллинга в каталоге:
{code}
/app/asr_billing/mnt/var/print_tmpl/
{code}