|
Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.
|
Изменения (4)
просмотр истории страницыПри создании и редактировании шаблона возможно использование переменных печати. Для вставки значения из переменной в шаблоне необходимо использовать две пары фигурных скобок с названием переменной внутри, т.е. вот так \- {{ \*название_переменной\* }}. Ниже приведен небольшой пример. |
{toc:maxLevel=3} |
|
Это один из шаблонов по умолчанию, карточка абонента \- [^Шаблон.png] |
h2. Описание системы шаблонов печати [Использование шаблона печати и его настройка^Шаблон.png] - Это один из шаблонов по умолчанию, карточка абонента. При печати карточки такого абонента - [Использование шаблона печати и его настройка^Абонент.png] может быть создан следующий html-документ \- [Использование шаблона печати и его настройка^Карточка.png]. Обратите внимание что текст шаблона содержащий переменные был заменен на различный текст. Так например вместо *{{ abonent.name }}* было подставлено _"ООО Лучший провайдер"_. Важно заметить и знать, что если при печати переменная не содержит значения, то будет вставлена пустая строка и никаких сообщений об ошибке не появится. {info}Для того, чтобы печатать финансовые документы, как PDF, необходимо перейти в настройки оператора связи - настройки биллинга и включить опцию "Печатать финансовые документы, как PDF"{info} !PDF.png|border=1! h2. Переменные Ниже приведен неполный список доступных к использованию переменных: * *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* \- стоимость звонка. * *descr* \- содержимое поля "Описание" при формировании документа. * *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} <pre>{% debug %}</pre> {code} {tip} h2. Шаблоны .html При создании и редактировании шаблона возможно использование переменных печати в формате 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. Скрипт выводящий (Буквами), за какой месяц счет. Без склонения месяц выводится: {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|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. Различия: # Значение по умолчанию. Если в 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} Реквизит ФИО состоит из трех частей (фамилия, имя, отчество), каждую из которых можно вывести по-отдельности: {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} {% 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} Например, так можно вывести дату договора в формате "«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. Примеры шаблонов * [Карточка абонента|^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} |