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

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

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

просмотр истории страницы
{toc:maxLevel=3}

h2. Шаблоны HTML
h2. Описание системы шаблонов печати

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

[Использование шаблона печати и его настройка^Шаблон.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}
Вывод всех доступных в шаблоне переменных
{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). Для вставки значения из переменной в шаблоне необходимо использовать две пары фигурных скобок с названием переменной внутри, т.е. вот так \-  {{ название_переменной }} . Ниже приведен небольшой пример.

h2. Шаблоны .html
h3. Сумма всех тарифных услуг

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

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

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


h3. Вывод списка услуг c их стоимостью вместо фактического потребления услуг

В случае, если Вам требуется вывести только набор услуг абонента попавший в счет и их стоимость по тарифу замените стандартную таблицу набора услуг, отражающую фактическое потребление за период счета согласно [настройкам|CarbonBilling:Счет на предоплату], приведённой ниже.
{code}<table border="1" style="font-size: 8pt" cellpadding="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

{% 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}
# Для применение финансовой операции необходимо предварительно перевести значение, над которым необходимо провести финансовую операцию в тип данных *int*(если число целое без дробной части) или в тип данных *float*(если число с дробной частью)
Например, так можно вывести дату договора в формате "«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. Примеры шаблонов
* [Счет|^bill_guPQBlr.docx]
* [Договор|^contract_dogovor.docx]
* [Заявка HelpDesk/CRM|^helpdesk.docx]
* [Акт+распечатка звонков|^akt_and_voip.docx]

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

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