Настройка позиций
Позиция - это составная часть документа, обладающая суммой, количеством и единицей измерения, которую биллинг вычисляет для конкретного договора и месяца и подставляет в документ. Позиции счетов и счет-фактур задаются в конфигурации модуля, каждая позиция идентифицируются числовым кодом, коды позиций счетов и счет-фактур могут пересекаться.
Позиции счетов/счетов-фактур задаются аналогично, с той лишь разницей, что префикс bill.pos заменяется на invoice.pos. Разберём более подробно различные параметры позиции.
В name может быть указана произвольная строка с подстановками $month, $nextmonth, $next2month, $prevmonth, $prev2month, $prev3month. Подстановка означает строковое название месяца за который выставляется счёт, следующего месяца, двух следующих, предыдущего месяца, и ещё двух предыдующих месяцев. Также возможно вывести значение месяца в произвольном формате, вместо $month ($nextmonth и т.п.) указать в виде {$month,date,фомат}, например {$month,date,MMMM yyyy г.} - результатом будет апрель 2009 г.
В summ могут быть указаны следующие макросы, связанные знаками "+" и "-". Вместо <month> могут быть подставлены значения $month, $nextmonth, $next2month, $prevmonth, $prev2month, $prev3month, означающие в данном контексте месяц, за который производится выборка.
-
DEBT(<month>) - долг на конец месяца, равен минус исходящему остатку;
-
IN_REST(<month>) - входящий остаток на месяц;
-
SERVICE_ACCOUNT(<month>, <коды услуг через запятую>) - наработка по определённым услугам;
-
FULL_ACCOUNT(<month>) - суммарная наработка по всем услугам;
-
CHARGE(<month>, <коды расходов через запятую, не обязательный параметр>) - сумма расходов за месяц;
-
PAYMENT(<month>, <коды типов платежей, не обязательный параметр>) - сумма платежей за месяц;
-
NPAY_MIN_ACCOUNT(<код экземпляра модуля абонплат>,<month>,<код услуги модуля абонплат>) - для "доводящей абонплаты" сумма, до которой она доводится;
-
BILL_BILL_SUM(<код экземпляра модуля бухгалтерия>,<month>,<коды типов документов>) - сумма выставленных счетов за определённый месяц для данного договора, перечень кодов типов документов через запятую - необязательный параметр;
-
BILL_INVOICE_SUM(<код экземпляра модуля бухгалтерия>,<month>,<коды типов документов>) - сумма выставленных счетов-фактур за определённый месяц для данного договора, перечень кодов типов документов через запятую - необязательный параметр;
-
CONST(<число>) - числовая константа.
-
SERVICE_CALC(<month>, <mid>, <код набора услуг>) - наработка по определённым услугам, вычисляемая через калькулятор модуля Абонплаты. Используется код набора услуг, заданного в конфигурации модуля абонплат.
-
TV_SERVICE_CALC(<month>, <mid>, <коды услуг>) - наработка по определённым услугам, вычисляемая через калькулятор модуля ТВ.
В quantity могут быть указаны следующие макросы, связанные знаками "+" и "-". Вместо <month> могут быть подставлены значения $month, $nextmonth, $next2month, $prevmonth, $prev2month, $prev3month, означающие в данном контексте месяц, за который производится выборка. Вместо <mid> подставляется код экземпляра соответствующего модуля. Вместо <sids> подставляются коды услуг через запятую, это уточняющий и не обязательный параметр, если он не указан, будут взяты все услуги.
-
KERNEL_SERVICE_COUNT(<month>, <коды услуг через запятую>) - количество разрешенных услуг, определённых перечнем, заведённых в договоре на начало указанного месяца;
-
KERNEL_OBJECT_COUNT(<month>, <коды типов объектов через запятую>) - количество типов объектов, определённых перечнем, заведённых в договоре на начало указанного месяца;
-
NPAY_SERVICE_COUNT(<mid>, <month>, <sids>) - количество услуг абонплаты, определённых перечнем, заведённых в договоре на начало указанного месяца, учитывая параметр кол-во в свойствах услуги абонплат;
-
NPAY_SERVICE_COUNT_MONTH(<mid>, <month>, <sids>) - аналогично предыдущему, но считается количество услуг абонплат не на первое число месяца, а всего попавших в данный месяц отрезков данных услуг;
-
DIALUP_SERVICE_AMOUNT(<mid>, <month>, <делитель>, <sids>) - объем услуг DialUP модуля, делитель определяет число, на которое будет разделен объем услуги (байты для трафика, секунды для времени); Например, делитель 1048576 даст объем в МБ для услуг типа трафик;
-
DIALUP_MAX_SERVICE_AMOUNT(<mid>, <month>, <делитель>, <sids>) - объем услуг DialUP модуля типа "максимальный трафик", делитель определяет число, на которое будет разделен объем услуги (байты для трафика). Например, делитель 1048576 даст объем в МБ для услуг типа трафик;
-
DIALUP_LOGIN_COUNT(<mid>, <month>) - количество DialUP логинов на начало месяца;
-
VOICEIP_SERVICE_AMOUNT(<mid>, <month>, <делитель>, <sids>) - объем услуг VoiceIP модуля в секундах округлённого времени, делитель определяет число, на которое будет разделен объем услуги. Например, делитель 60 даст объем в минутах;
-
VOICEIP_LOGIN_COUNT(<mid>, <month>) - количество VoiceIP-логинов на начало месяца;
-
IPN_SERVICE_AMOUNT(<mid>, <month>, <делитель>, <sids>) - объем услуг IPN модуля в байтах, делитель определяет число, на которое будет разделен объем услуги. Например, делитель 1048576 даст объем в МБ;
-
IPN_MAX_SERVICE_AMOUNT(<mid>, <month>, <делитель>, <sids>) - объем услуг IPN модуля типа "максимальный трафик" в байтах, делитель определяет число, на которое будет разделен объем услуги. Например, делитель 1048576 даст объем в МБ;
-
PHONE_SERVICE_AMOUNT(<mid>, <month>, <делитель>, <sids>) - объем услуг Phone модуля в секундах округлённого времени, делитель определяет число, на которое будет разделен объем услуги. Например, делитель 60 даст объем в минутах;
-
PHONE_ZERO_SERVICE_AMOUNT(<mid>, <month>, <делитель>, <sids>) - то же, что предыдущее, но считаются только сессии с нулевой стоимостью;
-
PHONE_NOZERO_SERVICE_AMOUNT(<mid>, <month>, <делитель>, <sids>) - то же, но считаются только сессии с ненулевой стоимостью;
-
PHONE_NOZERO_SERVICE_COUNT(<mid>, <month>, <sids>) - считается кол-во сессий с ненулевой стоимостью;
-
PHONE_SERVICE_COUNT(<mid>, <month>, <sids>) - общее количество сессий;
-
PHONE_POINT_COUNT(<mid>, <month>) - количество Phone-поинтов на начало месяца;
-
RSCM_SERVICE_AMOUNT(<mid>, <month>, <делитель>, <sids>) - объем услуг RSCM-модуля в единицах, делитель определяет число, на которое будет разделен объем услуги;
-
INET_SERVICE_AMOUNT(<mid>, <month>, <делитель>, <sids>) - объем услуг Inet-модуля, делитель определяет число, на которое будет разделен объем услуги (байты для трафика, секунды для времени). Например, делитель 1048576 даст объем в МБ для услуг типа трафик;
-
INET_SERV_COUNT(<mid>, <month>) - количество Inet-сервисов на начало месяца.
Если quantity не указано, то позиция принимается за единицу.
Начиная с версии 4.6, добавлен необязательный параметр позиции - число знаков после запятой для количества (qtynums). По умолчанию он принимается за 0 (т.е. количество округляется соответствуя логике предыдущих версий).
В unit указывается просто строка вида "Мб", "Кб", "мин.". Если параметр не указан, то единицы принимаются за "шт.". Параметр unitCode определяет цифровой код единицы измерения. Если параметр не указан, то подставляется код 796, который, согласно Общероссийскому классификатору единиц измерений, соответствует единице измерения "шт.".
Если параметр insum не указан, позиция включается в сумму документа, для исключения необходимо установить его в 0. Данный режим может быть полезен для позиций, несущих вспомогательную информацию.
Если параметр awlz указан, позиция включается в сумму документа, даже если сумма по позиции 0. Данный режим может быть полезен в случаях, когда нужно показать отсутствие расходов по позициям.
Рассмотрим несколько примеров построения позиций.
Пример 1
Клиенту необходимо выставлять суммарный долг за услуги интернета.
bill.pos.1.title=Долг за услуги Интернет
bill.pos.1.name=Долг за услуги Интернет за $month
bill.pos.1.summ=DEBT($month)
Пример 2
А корпоративным клиентам необходимо выставлять отдельными строчками абонплату, наработку по интернет и телефонии. За каждый месяц необходимо выставлять счета с наработкой за данный месяц и предоплатой абонплаты за следующий. Предположим, что у нас в системе установлен модуль абонплат, IPN и VoiceIP. Предположим также, что существуют следующие коды услуг:
-
Абонплата - 1;
-
Трафик -2;
-
Телефония - 3.
Так будет выглядеть настройка позиций счетов и счетов-фактур:
bill.pos.1.title=Долг за услуги Интернет и Телефонию
bill.pos.1.name=Долг за услуги Интернет и Телефонию за $month
bill.pos.1.summ=SERVICE_ACCOUNT($month, 2, 3 )
bill.pos.2.title=Абонплата за Интернет и Телефонию
bill.pos.2.name=Абонплата за Интернет и Телефонию за $nextmonth
bill.pos.2.summ=SERVICE_ACCOUNT($nextmonth,1 )
#
invoice.pos.1.title=Услуги Интернет и Телефонии
invoice.pos.1.name=Услуги Интернет и Телефонии за $month
invoice.pos.1.summ=SERVICE_ACCOUNT($month, 2, 3)
invoice.pos.2.title=Абонплата за Интернет и Телефонию
invoice.pos.2.name=Абонплата за Интернет и Телефонию за $month
invoice.pos.2.summ=SERVICE_ACCOUNT($month, 1)
Возможно суммирование и вычитание макросов суммы и количества. Например, следующим образом можно добавить в наработку определённые виды расходов:
invoice.pos.3.summ=SERVICE_AMOUNT($month,101,102)+CHARGE($month,14,8,1,54,32)
Экстакторы
Зачастую в системе присутствуют большое количество однотипных списаний и абонентских плат. В этом случае конфигурирование под каждую отдельной позиции достаточно обременительно и могут использоваться экстракторы. Позиция с экстрактором заводится в конфигурации модуля.
Параметры title и unit имеют значение, аналогичные обычным позициям. В параметр extractor может быть подставлен один из перечисленных ниже макросов. Вместо <month> могут быть подставлены значения $month, $nextmonth, $next2month, $prevmonth, $prev2month, $prev3month, означающие в данном контексте месяц, за который производится выборка. Вместо <mid> подставляется код экземпляра соответствующего модуля.
-
KERNEL_CHARGES(<month>, <коды типов расх>) - расходы договора в каком-то месяце. Тип расхода становится названием позиции, количество расходов данного типа - количеством. При не указании кодов типов расходов выбираются все типы расходов;
-
KERNEL_CHARGES_EXCEPT(<month>, <коды типов расходов, которые исключаются>) - аналогичен предыдущему, но указываются коды типов расходов, которые не выбираются;
-
NPAY_SERVICES(<mid>, <month>, <коды услуг>) - начисления абонплат в каком-то месяце. Название услуги абонплаты становится названием позиции, количество абонплат данного типа, установленных в договоре на данный месяц - количеством. При не указании кодов услуг выбираются все начисленные на договор абонплаты;
-
NPAY_SERVICES_EXCEPT(<mid>, <month>, <коды услуг, которые исключаются>) - аналогичен предыдущему, но указываются коды услуг, которые не выбираются;
-
NPAY_SERVICES_DETAIL(<mid>, <month>, <коды услуг>) - детализация начислений абонплат в каком-то месяце. Аналогичен NPAY_SERVICES, но данные берутся из таблицы npay_detail_<mid>_yyyymm, то есть данные будут разнесены по кодам сущностей других модулей( например поинты модуля телефонии );
-
RSCM_SERVICES(<mid>, <month>, <коды услуг>) - начисления по услугам RSCM в каком-то месяце. Название услуги RSCM становится названием позиции, количество услуги - количеством оказанной услуги . Единица измерения услуги - единица измерения счета При не указании кодов услуг выбираются все услуги RSCM оказанные для данного договора;
-
RSCM_SERVICES_EXCEPT(<mid>, <month>, <коды услуг, которые исключаются>) - аналогичен предыдущему, но указываются коды услуг, которые не выбираются;
-
EXT-экстракторы (KERNEL_CHARGES_EXT, KERNEL_CHARGES_EXT_EXCEPT, NPAY_SERVICES_EXT, NPAY_SERVICES_EXT_EXCEPT и т.д.) - расширенные (EXTended) экстракторы, которые в отдельную позицию выделяют каждый расход (для ядра) и каждую услугу (для модулей), даже если они имею одинаковый тип (код). Аргументы для экстрактора те же, что и для аналогичных нерасширенных.
Позиция экстрактора "распадается" в момент генерации документа на множество позиций в зависимости от реального количества начислений на договоре.
В unit указывается единица измерения - простая строка.
Пример экстрактора
Получение всех расходов за месяц:
bill.pos.3.title=Расходы
bill.pos.3.name=Расход
bill.pos.3.extractor=KERNEL_CHARGES($month)
Детализация по тарифу
C версии 4.5 возможна детализация по тарифу, т.е. получение и вывод информации, например, по количеству и наработке по предоплаченному трафику и превышению трафика.
Для этого сначала в тарифицируемом модуле (dialup или ipn) необходимо указать коды начислений:
# Код начисления
tariff_detail.cost_type.1=Включённый трафик
# Дополнительные параметры, range_take_all=1 предназначен для ветки диапазон,
# если установлен, то независимо от того, сколько наработал в этом диапазоне договор,
# количество наработки будет равняться кол-ву в диапазоне
tariff_detail.cost_type.1.range_take_all=1
# Код услуги, по которому отбираются договоры для обсчёта range_take_all
# (т.к. договор может не иметь наработки совсем)
tariff_detail.cost_type.1.range_take_all.sid=
tariff_detail.cost_type.2=Превышение трафика
В приведённом выше примере два кода начисления, Включённый трафик (60000 байт) и Превышение трафика. Т.к. опция range_take_all=1 включена, то кол-во по Включённому трафику будет всегда 60000 байт, даже если договор наработал меньше.
Для детализации максимальных трафиков необходимо для кода начисления указать calc_type=2:
#код начисления
tariff_detail.cost_type.1=Включённый трафик (макс)
tariff_detail.cost_type.1.calc_type=2
Для вычисления детализации по тарифу необходимо запускать переобсчет за весь месяц в тарифицируемом модуле. При этом можно переобсчитывать как группу договоров, так и отдельный договор. Иначе в выставленных после этого счетах/счетах-фактурах вы можете получить неполные данные. |
Рекомендуемая процедура следуюущая: по окончании расчитываемого месяца (в начальных числах следующего) запускаете вручную переобсчет, а после него формируете счета, счета-фактуры. Для модуля IPN существует еще одно решение.
Теперь для поля summ в конфигурации модуля бухгалтерии доступен следующий параметр:
-
TARIFF_DETAIL_COST(<mid>, <month>, коды начисления) - сумма начисления в детализации по тарифу для модуля.
А для поля quantity:
-
DIALUP_TARIFF_DETAIL_AMOUNT(<mid>, <month>, <делитель>, коды начисления) - объем начисления в детализации по тарифу для модуля dialup;
-
IPN_TARIFF_DETAIL_AMOUNT(<mid>, <month>, <делитель>, коды начисления) - объем начисления в детализации по тарифу для модуля ipn.