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

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

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

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

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

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

h3. Сумма всех тарифных услуг

Чтобы получить эту сумму в документе, нужно обратитьсяк модели 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 %}
{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>
<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 'Назначение платежа' operator_attrs.4 abonent_attrs.3 abonent_attrs.1002 abonent_attrs.1001 abonent_attrs.1003 operator_attrs.12 %}" alt="альтернативный текст"></div>
<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 - сумма
op_summa - сумма, по ГОСТ она должна быть в копейках, поэтому в документе подключен модуль mathfilters и сумма умножена на 100
Назначение платежа - указать текст без ковычек
operator_attrs.4 - ИНН
operator_attrs.12 - корреспондентский счет (в биллинге к/с)
h5.Абонента
h5. Абонента

abonent_attrs.3 - Адрес
abonent_attrs.1002 - Имя

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

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

#* "Номер договора с оператором МТС"
# Предположим, что реквизиты получили ID (номера) 1001, 1002 и 1003 соответственно. Добавьте в шаблон следующую конструкцию:
{code}{% if agent_operator_attr.2 == "Вымпелком" %}
{{ abonent_attrs.1001 }}
{% elif agent_operator_attr.2 == "ТТК" %}
{{ abonent_attrs.10012 }}
{% elif agent_operator_attr.2 == "ТТК" "МТС" %}
{{ abonent_attrs.10023 }}
{% 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

Реквизит ФИО состоит из трех частей (фамилия, имя, отчество), каждую из которых можно вывести по-отдельности:
{code}
{% if abonent_attrs %}
Фамилия: {{ abonent_attrs['24']['0'] }} - фамилия
{{ abonent_attrs['24']['1'] }} - имя
{{ abonent_attrs['24']['2'] }} - отчество
{% endif %}
{code}
Для корректного вывода данного реквизита полностью, необходимо использовать конструкцию:
{code}
{% if abonent_attrs %}
{% 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}
{% endif %}
{code}
# Для отображения суммы стоимости тарифа
{code}{{ abonent.tarif.get_abon_sum() }}{code}
# Требуется показать в шаблоне печати последние 3 символа логина
{code}{{ users.0.login|slice:"-3:" }}{code}

h3. Примеры шаблонов
* [Договор|^contract_dogovor.docx]
* [Заявка HelpDesk/CRM|^helpdesk.docx]
* [Акт+распечатка звонков|^akt_and_voip.docx]

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

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