|
Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.
|
Изменения (413)
просмотр истории страницы{toc:maxLevel=3} |
|
h2. Описание конструктора отчетов |
|
*Конструктор отчетов* позволяет делать запросы напрямую к БД. Описание ограничений, возможностей и синтаксиса используемого диалекта SQL Вы можете найти в документации Firebird 2.1. |
Конструктор отчетов находится на вкладке "Отчеты" в основном меню биллинга \\ \\ |
!report_builder_1.png|border=1,width=1000! \\ \\ |
\\ \\ !report_builder_1.png|border=1,width=1000! \\ \\ |
Отчеты разбиваются на группы. Не относящиеся ни к одной попадают в группу "Не определено". Группы настраиваются в справочниках: \\ \\ |
!report_builder_1_types.png|border=1,width=1000! \\ \\ |
\\ \\ !report_builder_1_types.png|border=1,width=1000! \\ \\ |
По-умолчанию в биллинге идет более 60 отчетов. Вы так же можете создать свои или воспользоваться одним из примеров из данной статьи. Для добавления отчета нажмите кнопку "Добавить" в конструкторе. Ксли требуется выберите категорию, В поле "SQL запрос" вставьте текст отчета и сохраните. \\ \\ |
\\ |
\\ !report_builder_2.png|border=1! |
Результат выполнения отчета можно отобразить браузере или выгрузить: * В формате DBF * В CSV с разделением "," (запятая) |
* В Excel (xlsx) |
|
Для выполнения отчета выберите формат отображения и нажмите кнопку "Выполнить запрос"\\ \\ |
\\ |
\\ !report_builder_3.png|border=1! |
h3. Параметры полей формы |
... |
chroot /app/asr_billing/ {code} |
2) Запустить скрипт |
{code} python /usr/lib/python2.7/site-packages/jobs_worker/jobs_scripts/make_reports.pyc -r 105 {code} |
Где 105 - id отчёта. |
Информация, выведенная на экран, будет иметь кодировку cp1251 |
... |
h3. Особенности SQL в Firebird |
|
h4. UNION (UNION ALL) и ORDER BY |
|
В Firebird Order By должен быть последним оператором, сортируя всю выборку, например: |
{code} select |
col1, col2, col3 |
from |
table1 union all |
select |
'', 'Итого', sum(col3) |
from |
table1 order by |
... |
Чтобы "Итого" переместить в конец списка, можно использовать "невидимый" символ Юникода подобный пробелу, но стоящий в Юникоде ниже всех Кириллицы: {code}union all |
select |
' '{code} Список символов можно посмотреть в [Википедии|https://en.wikipedia.org/wiki/Whitespace_character], в примере использован символ U+2003 "em space" h3. Получение списка вложенных групп и абонентов в дереве групп |
|
h4. GLN_RECURSIVE_GROUP_WALK |
|
Принимает: GR_ID - ID группы Возвращает: GROUP_ID - ID запрошенной группы и всех её подгрупп |
|
h4. GLN_RECURSIVE_ABONENTS_GET |
|
Принимает: GROUP_ID - ID группы Возвращает: ABONENT_ID - ID абонентов в указанной группе и всех её подгруппах |
|
h4. Примеры запросов |
|
{code}SELECT group_id FROM GLN_RECURSIVE_GROUP_WALK(1) SELECT abonent_id FROM GLN_RECURSIVE_ABONENTS_GET(1){code} h2. Примеры |
|
# h5. Список абонентов, подключенных к NAS с ip 172.16.0.6 в формате id, фио, номер телефона {code} |
... |
or AB.B_OWN != 1 or AB.B_ADMIN != 1 |
or AB.B_SYS != 1)) = 0 |
{code} # h5. Список IP адрес и номер договора всех абонентов. у которых в качестве nas_ip указан адрес 192.168.1.2: {code} |
select |
uf_ip2string(u.ip) as "IP", a.CONTRACT_NUMBER as "Номер договора" |
from users u |
left join abonents a on u.abonent_id=a.id left join nas n on u.nas_id=n.id |
... |
and TP.ID=':Тариф|select[Tarif]$' order by U.CONTRACT_NUMBER{code} |
# h5. Отчет должники по постоплате с разделением по физическим и юридическим лицам. Отчет содержит: номер договора, ФИО, адрес, дата последнего платежа, сумма долга (рекоммендованный платеж по постоплате) |
{code:lang=sql}select first 1 cast('******************************************' as varchar(100) ) as "№ договора", |
... |
and fo.op_date between cast(':Начало|date$' as date) and cast(':Конец|date$' as date){code} # h5. Отчёт о превышении лимита предоплаченного трафика по юридическим лицам с возможностью выбора месяца - года |
|
h6. SQL запрос {code:lang=sql}select distinct |
... |
join traf_counters on ab.id=traf_counters.abonent_id where traf_counters.MONTH_NUMBER = (':Месяц|choices[1^]Январь^[2^]Февраль^[3^]Март^[4^]Апрель^[5^]Май^[6^]Июнь^[7^]Июль^[8^]Август^[9^]Сентябрь^[10^]Октябрь^[11^]Ноябрь^[12^]Декабрь]$') and traf_counters.year_number LIKE upper(':Год$') and ab.company = 1{code} |
|
h6. Шаблон отчёта {code:lang=sql}{% extends "form_list.html" %} |
... |
{% endblock %}{code} # h5. Отчёт о динамике приходов и актов за заданный период времени |
|
h6. SQL запрос {code:lang=sql}select |
... |
and fo.op_type in (1,2){code} |
|
h6. Шаблон отчёта {code:lang=sql}{% extends "form_list.html" %} |
... |
{% endblock %}{code} # h5. Отчёт по пользователям с добровольной блокировкой |
|
h6. SQL запрос {code:lang=sql}select a.name as "ФИО", |
... |
and a.parent_id=(':ID папки$') {code} |
# h5. Отчёт для платежной системы "Город", выводящий в строку "ФИО;Адрес;Лицевой счет;Текущий остаток;';;;;'" и выводящий в Шапке отчёта |
#* FILESUM - Сумму всех остатков в данном отчёте #* TYPE 7 |
... |
from USERS where ((IP >= START_IP and IP <= END_IP) |
or (IP <= START_IP and IP >= END_IP)) |
or ((HOST_IP >= START_IP and HOST_IP <= END_IP) |
or (HOST_IP <= START_IP and HOST_IP >= END_IP)) |
and (select first 1 DELETED from ABONENTS |
... |
# h5. Отчёт по приходам за заданный период времени {code} |
select a.name as "ФИО", |
a.contract_number as "Договор", |
round(fo.op_summa / cast((select CONST_VALUE from VPN_CONST where CONST_ID = 1) as numeric(18,5)), 2) as "Сумма прихода", |
AU.USERNAME as "Ответственный", |
fo.OP_DATE as "Дата прихода" |
from abonents as a |
left join finance_operations as fo |
on a.id=fo.abonent_id left join AUTH_USER as AU on AU.id=fo.owner_id |
where OP_TYPE=2 and |
fo.OP_DATE between (':1 Дата|date$') and (':2 Дата|date$') {code} |
... |
# h5. Отчёт по услугам, выводящий название услуги, стоимость, и количество списанных средств по этой услуге за период. {code} |
select distinct u.name as "Услуга", |
round(u.summa / cast((select CONST_VALUE from VPN_CONST where CONST_ID = 1) as numeric(18,5)), 2) as "Цена", round(sum(counters.SUMM), 2) as "Сумма" |
from counters |
left join usluga u on u.id=counters.usluga_id where S_DATE between (':1 Дата|date$') and (':2 Дата|date$') |
... |
{code} select AB.NAME as "ФИО", |
CONTRACT_NUMBER as "Договор", |
FO.NUMBER as "Номер акта", |
round(FO.OP_SUMMA / cast((select CONST_VALUE from VPN_CONST where CONST_ID = 1) as numeric(18,5)), 2) as "СУММА", FT.OP_NAME || ', ' || FT.OP_DESCR as "ТИП ДОКУМЕНТА" |
... |
and FO.ABONENT_ID = AB.ID and AB.COMPANY = 1 |
and FO.OP_DATE between cast(':1. Начало|date$' as date) and cast(':2. Конец|date$' as date) |
order by 1 {code} |
... |
A.SMS as "Телефон", h.STREET || ', д. ' || h.S_NUMBER || ', кв.' || a.A_HOME_NUMBER as "Адрес", |
av1.attribute_value as "Р/С", |
av2.attribute_value as "ИНН", |
av3.attribute_value as "КПП" from abonents as a left join HOMES as H on H.ID=A.HOME_ID |
left join ATTRIBUTE_VALUES as av1 on a.id=av1.ABONENT_ID and av1.ATTRIBUTE_ID=6 |
left join ATTRIBUTE_VALUES AV2 on a.id=av2.ABONENT_ID and av2.ATTRIBUTE_ID=4 left join ATTRIBUTE_VALUES AV3 on a.id=av3.ABONENT_ID and av3.ATTRIBUTE_ID=5 |
... |
# h5. Отчёт прибыль по плате за подключение нескольких услуг. {code} |
select |
a.NAME as "ФИО", uu.ABONENT_ID as "ID АБОНЕНТА", |
... |
{code} select distinct a.name as "ФИО", |
b.max_time as "Последнее подключ." from abonents as a |
inner join (select rs.abonent_id, max(rs.start_time) as max_time from radius_sessions rs group by abonent_id) as b on a.id=b.abonent_id where max_time<(':1 Дата|date$') {code} |
... |
abs.CEIL_OUT, uf_ip2string(u.ip) as "user_ip", |
u.ROUTER_VLAN, |
u.GPON_MODEM_PORT, |
u.ROUTER_PORT |
from users as u left join abonents as a on a.id=u.abonent_id |
... |
# h5. Отчёт, выводящий Лицевой счет, ФИО, Адрес (из справочника "Дома"), Телефон, Баланс, Статус. {code} |
select |
a.contract_number as "Договор", a.name as "Имя", |
... |
cast(round((cast(aa.ostatok as float)+cast(aa.debit as float)-cast(aa.credit as float))/10000000000,2) as numeric(18,2)) as "Баланс", (select st.name from status st where st.id = os.status) as "Статус" |
from |
abonents a |
left join homes h on h.id = a.home_id join admin_accounts aa on aa.id = a.account_id |
join |
objects_status os on a.id = os.object_id |
where |
a.is_folder = 0 {code} |
... |
select uf_ip2string(ip) as IP,abonent_id,time_changed,a.name |
from |
users_history uh |
join |
abonents a |
on uh.abonent_id = a.id |
where |
uf_ip2string(ip) = ':Введите ip-адрес$' {code} |
... |
left join STATUS S on S.ID = OS.STATUS where (AB.IS_FOLDER = 0 |
or AB.IS_FOLDER is null) and AB.DELETED = 0 |
{code} # h5. Отчет выводит данные по операциям по всем абонентам за выбранный период {code} |
select |
a.contract_number "Договор", a.name "ФИО", |
... |
join fin_types ft on fo.op_type = ft.type_id join auth_user au on fo.owner_id = au.id |
where |
fo.op_date between ':C_даты|date$' and ':По_дату|date$' order by op_date |
... |
# h5. Отчёт, выводящий список незаблокированных абонентов. {code} |
select |
a.name as "ФИО", a.contract_number as "Договор" |
from abonents a |
left join abonents_block ab on ab.abonent_id=a.id where ab.id is null |
... |
and a.is_folder=0 {code} |
# h5. Отчёт по абонентам с блокировкой по отрицательному балансу. |
{code} select |
... |
{code} # h5. Абоненты с учетными записями без mac-адреса. Формат: номер договора, ip учетной записи (если есть) |
{code}select |
a.contract_number as "Номер договора", |
coalesce(uf_ip2string(u.ip), '') as "IP" |
from |
users u |
join |
abonents a |
on u.abonent_id = a.id |
where |
u.phone is null and |
u.deleted = 0 and |
ua.deleted = 0 and |
a.deleted a.is_folder = 0 and |
a.is_folder u.is_template = 0 and |
u.is_template = 0 and |
(u.mac is null or u.mac = ''){code} # h5. Отчёт о списаниях абонентской платы по папкам за определенный период. |
... |
{code} # h5. Отчёт по телефонии. Структура данных информации об Абонентах по маске 7496 |
|
h6. sql запрос |
{code} |
select distinct |
'K6#' || A.CONTRACT_NUMBER as "Договор", |
A.NAME, |
AV_UR_ADDR.ATTRIBUTE_VALUE as URR_ADDR, |
AV_UR_INN.ATTRIBUTE_VALUE as INN, |
AV_UR_KPP.ATTRIBUTE_VALUE as KPP, |
'2' as c4, |
'2' as c4, c5, |
'2' as c5, |
'1' as c6, |
'643' as c7, |
CAST(lpad(EXTRACT(DAY FROM A.CREATE_DATE),2,'0') AS varchar(2))||'.'|| CAST(lpad(EXTRACT(MONTH FROM A.CREATE_DATE),2,'0') AS varchar(2))||'.'|| EXTRACT(YEAR FROM A.CREATE_DATE) || ' 00:00:00' as CREATE_DATE, |
IIF(ah.time_del is not null , CAST(lpad(EXTRACT(DAY FROM AH.TIME_DEL),2,'0') AS varchar(2))||'.'|| CAST(lpad(EXTRACT(MONTH FROM AH.TIME_DEL),2,'0') AS varchar(2))||'.'|| EXTRACT(YEAR FROM AH.TIME_DEL) || ' 00:00:00' ,'') end_date, |
'1' as c1, |
'46' as c2, |
'0' as c3 |
from abonents A |
left join ATTRIBUTE_VALUES AV_UR_ADDR on AV_UR_ADDR.ABONENT_ID=A.ID and AV_UR_ADDR.ATTRIBUTE_ID=25 |
left join ATTRIBUTE_VALUES AV_UR_INN on AV_UR_INN.ABONENT_ID=A.ID and AV_UR_INN.ATTRIBUTE_ID=4 |
left join ATTRIBUTE_VALUES AV_UR_KPP on AV_UR_KPP.ABONENT_ID=A.ID and AV_UR_KPP.ATTRIBUTE_ID=5 |
left join users on users.abonent_id=A.id left join PHONE_PULL_CHACHE PPC on PPC.id=users.phone |
... |
and a.company<>':Абонент|choices[0^]Юр.Лица^[1^]Физ.лица^[2^]Все]$' and (select count(*) from abonents ab where ab.account_id=a.account_id group by ab.account_id)=1 |
UNION ALL |
select distinct |
'K6#' || A.CONTRACT_NUMBER as "Договор", |
A.NAME, |
AV_UR_ADDR.ATTRIBUTE_VALUE as URR_ADDR, |
AV_UR_INN.ATTRIBUTE_VALUE as INN, |
AV_UR_KPP.ATTRIBUTE_VALUE as KPP, |
'2' as c4, |
'2' as c4, c5, |
'2' as c5, |
'1' as c6, |
'643' as c7, |
CAST(lpad(EXTRACT(DAY FROM A.CREATE_DATE),2,'0') AS varchar(2))||'.'|| CAST(lpad(EXTRACT(MONTH FROM A.CREATE_DATE),2,'0') AS varchar(2))||'.'|| EXTRACT(YEAR FROM A.CREATE_DATE) || ' 00:00:00' as CREATE_DATE, |
IIF(ah.time_del is not null , CAST(lpad(EXTRACT(DAY FROM AH.TIME_DEL),2,'0') AS varchar(2))||'.'|| CAST(lpad(EXTRACT(MONTH FROM AH.TIME_DEL),2,'0') AS varchar(2))||'.'|| EXTRACT(YEAR FROM AH.TIME_DEL) || ' 00:00:00' ,'') end_date, |
'1' as c1, |
'46' as c2, |
'0' as c3 |
from abonents A |
left join ATTRIBUTE_VALUES AV_UR_ADDR on AV_UR_ADDR.ABONENT_ID=A.ID and AV_UR_ADDR.ATTRIBUTE_ID=25 |
left join ATTRIBUTE_VALUES AV_UR_INN on AV_UR_INN.ABONENT_ID=A.ID and AV_UR_INN.ATTRIBUTE_ID=4 |
left join ATTRIBUTE_VALUES AV_UR_KPP on AV_UR_KPP.ABONENT_ID=A.ID and AV_UR_KPP.ATTRIBUTE_ID=5 |
left join users on users.abonent_id=A.id left join PHONE_PULL_CHACHE PPC on PPC.id=users.phone |
... |
and a.main=1 {code} |
|
h6. Шаблон отчёта |
{code} {% extends "form_list.html" %} |
... |
FROM counters{code} # h5. Поиск абонентов со скидкой, с выводом самой скидки, id абонента, id услуги и фио абонента. |
{code}select |
u.discount, |
u.abonent_id, |
u.abonent_id, u.usluga_id, |
u.usluga_id, a.name |
from USERS_USLUGA u join abonents a on a.id=u.abonent_id where |
a.name u.ACTIVATED=1 |
from USERS_USLUGA u join abonents a on a.id=u.abonent_id where u.ACTIVATED=1 |
and u.DELETED=0 |
and u.discount>0 {code} # h5. Отчёт, который выводит списания абонентов с учетом и без учета НДС за выбранный период по каждому абоненту. {code} |
select a.name as "ФИО", |
a.contract_number as "Договор", |
h.CITY as "Город", sum(round(op_summa / cast((select CONST_VALUE from VPN_CONST where CONST_ID = 1) as numeric(18,5)), 2)) as "Сумма с ндс ", |
round((sum(round(op_summa / cast((select CONST_VALUE from VPN_CONST where CONST_ID = 1) as numeric(18,5)), 2)))/1.18) as "Сумма без ндс" |
from finance_operations fo left join abonents a on a.id=fo.abonent_id |
... |
Отчёт выводит сверку по потреблению услуги телефонного трафика с разделением по категориям и абонентам. {code} |
select |
vc.name || ' (' || vc.id || ')' as "Категория", |
a.contract_number as "№ Договора абонента", sum(vl.bill_sum)/10000000000.00 as "Сумма", |
... |
join voip_direction vd on vd.id=cd.direction_id and vd.id=vl.direction_id join voip_category vc on cd.category_id=vc.id |
join abonents a on vl.abonent_id=a.id |
where vl.bill_sum>0 and |
... |
# h5. Отчёт по абонентам со статусом, балансом, датой последнего платежа и суммой последнего платежа. {code} |
select |
ab.name as "ФИО", |
ab.contract_number as "Договор", |
s.name as "Статус", |
(select max(FO.OP_DATE) from FINANCE_OPERATIONS FO where FO.ABONENT_ID = AB.ID and FO.OP_TYPE=2) as "Дата посл.", (select first 1 round(fo1.op_summa / cast((select CONST_VALUE from VPN_CONST where CONST_ID = 1) as numeric(18,5)), 2) from finance_operations FO1 where FO1.ABONENT_ID = AB.ID and FO1.OP_TYPE=2 order by fo1.op_date desc) as "Платеж", (aa.debit+aa.Ostatok-aa.credit)/10000000000.00 as "Баланс" from abonents ab |
left join objects_status os on |
os.object_id=ab.id |
left join status s on |
s.id = os.status |
left join admin_accounts aa on |
aa.id = ab.account_id where extract (DAY from ab.activate_date) >0 {code} |
# h5. Отчёт по телефонии по звонкам, которые были выполнены на конкретный пул телефонных номеров за указанную дату по конкретному абоненту. |
{code} |
select |
vl.id as "ID звонка", s_time as "Начало звонка", |
... |
where CONST_ID = 1) as numeric(18,2)), 2) as "Сумма", chan as "Канал" |
from voip_log VL |
where billed=1 and |
... |
and vl.abonent_id=:1Абонент|select[Abonents,is_folder=0]$ AND (vl.DST between (':4 Начало пула$') and (':5 Конец пула$')) |
{code} |
# h5. Отчёт по RADIUS-сессиям выбранного абонента: начало, конец, длительность, причина завершения (если завершена), IP. |
{code}select START_TIME "Начало", |
END_TIME "Конец", |
case |
when coalesce(end_reason,'')='' then 'Не было Act-Session-Stop' when datediff(hour from start_time to end_TIME)>=1 then datediff(hour from start_time to end_TIME) || ' часов' |
... |
where abonent_id=':Абонент|select[Abonents]$' |
order by |
start_time desc{code} # h5. Отчёт для ФСБ в формате Оператор связи IP-адрес Логин Дата подключения Дата отключения Адрес подключения Абонент Дата рождения Документ (ИНН) Адрес регистрации (юридический) Контактное лицо Контактный номер Дополительня информаци {code} |
select '' from abonents |
UNION |
select distinct '"' || (select name from abonents where abonents.id=a.operator_id) || '";"' || |
... |
left join USERS U on A.ID = U.ABONENT_ID left join HOMES H on A.HOME_ID = H.ID |
left join ATTRIBUTE_VALUES DR on DR.ABONENT_ID=A.ID and DR.ATTRIBUTE_ID=22 |
left join ATTRIBUTE_VALUES UADR on UADR.ABONENT_ID=A.ID and UADR.ATTRIBUTE_ID=25 |
left join ATTRIBUTE_VALUES KLICO on KLICO.ABONENT_ID=A.ID and KLICO.ATTRIBUTE_ID=32 left join ATTRIBUTE_VALUES INN on INN.ABONENT_ID=A.ID and INN.ATTRIBUTE_ID=4 |
... |
{code} select abonent_id, |
count(*) as "Кол-во услуг", |
(select count(*) from users_usluga uu1 where uu1.deleted=0 and uu1.enabled=1 and uu1.abonent_id=users_usluga.abonent_id having count(*)>1) as "Кол-во акт. услуг" from users_usluga where deleted=0 group by abonent_id having count(*)>1 |
... |
select abonent_id,time_changed,a.name |
from |
users_history uh |
join |
abonents a |
on uh.abonent_id = a.id |
where |
phone = (select id from PHONE_PULL_CHACHE where PHONE=':Введите номер$') {code} |
... |
select uf_ip2string(ip) as IP,abonent_id,time_changed,a.name |
from |
users_history uh |
join |
abonents a |
on uh.abonent_id = a.id |
where |
LOGIN_UPPER like upper(':Логин$') {code} |
# h5. Отчёт по услугам IP телевидения с возможностью выбора периода. |
Выводит следующие поля: 1) Имя услуги |
... |
{color:#ff0000}{*}Примечание{*}{color}{color:#000000}*: В отчёт попадут только те услуги, у которых выбран тип: "IP телевидение".*{color} {code} |
select distinct |
u.name as "Услуга", |
round(u.summa / cast((select CONST_VALUE from VPN_CONST where CONST_ID = 1) as numeric(18,5)), 2) as "Цена услуги", coalesce((select count(distinct abonent_id) from arch_account_stack where BILL_DATE between (':1 Дата|date$') and (':2 Дата|date$') and arch_account_stack.usluga_id=u.id),0) as "Кол-во абонентов", coalesce((select count(*) from arch_account_stack where arch_account_stack.usluga_id=u.id and BILL_DATE between (':1 Дата|date$') and (':2 Дата|date$') group by usluga_id),0) as "Дни", (select coalesce((round(sum(counters1.SUMM), 2)),0) from counters counters1 where S_DATE between (':1 Дата|date$') and (':2 Дата|date$') and counters1.usluga_id=u.id)as "Сумма" |
from usluga u |
join counters on counters.usluga_id=u.id where U.SYSTEM_TYPE=7 |
... |
sum(SUMOP) from (select round(sum(counters.SUMM), 2) as SUMOP |
from usluga u |
join counters on counters.usluga_id=u.id where U.SYSTEM_TYPE=7 |
... |
and S_DATE between (':1 Дата|date$') and (':2 Дата|date$')) {code} |
# h5. Отчёт по абонентам, у которых подключены услуги IP телевидения. |
Выводит следующие поля: 1) Имя абонента |
... |
u.name as "Услуга", round(sum(counters.SUMM), 2) as "Сумма" |
from counters |
join usluga u on u.id=counters.usluga_id where U.SYSTEM_TYPE=7 |
... |
sum(SUMOP) from (select round(sum(counters.SUMM), 2) as SUMOP |
from counters |
join usluga u on u.id=counters.usluga_id where U.SYSTEM_TYPE=7 |
... |
#* 92 - Id услуги "Междугородная связь" #* 91 - Id услуги "Внутризоновая связь" |
h6. SQL запрос: |
{code} select |
'Cnst1' as "Аг. договор", |
A.CONTRACT_NUMBER as "Аб. договор", |
... |
c.summ<>0 {code} |
|
h6. Шаблон отчёта: |
{code} {% extends "form_list.html" %} |
... |
{% endblock %} {code} |
# h5. Отчёт, который выводит всех абонентов с активными подстатусами типов подключения. |
{code} select distinct a.name as "ФИО", (select name from status where id = OBJECTS_SUBSTATUS.STATUS_ID) as "Тип подключения" |
from abonents a |
left join OBJECTS_STATUS os on os.OBJECT_ID=a.id left join OBJECTS_SUBSTATUS on OBJECTS_SUBSTATUS.OBJECT_ID=os.id {code} # h5. Отчёт, который выводит все активные RADIUS-сессии. |
{code}select |
a.contract_number as "Номер договора", u.login as "Учетная запись", uf_ip2string(r.ip_address) as "IP", RADIUS_UPDATE as "Последний ACC_UPDATE" |
from |
users_radiusauth r |
join users u on r.user_id=u.id join abonents a on u.abonent_id=a.id where |
join r.logged=1 |
users u on r.user_id=u.id join abonents a on u.abonent_id=a.id where r.logged=1 |
order by |
:1. Группировать по столбцу|choices[1^]Номер договора^[2^]Учетная запись^[3^]IP^[4^]ACC_UPDATE]$ :2. Группировать в порядке|choices[asc^]Возрастания^[desc^]Убывания]${code} # h5. Отчёт по распределению абонентов из определенной группы по тарифам, так же выводится количество в настоящий момент заблокированных и не заблокированных абонентов. |
{code}select |
|
count(*) as "Количество", |
t.name as "Тариф", |
... |
count(*)-(select count(distinct atr.id) from (with recursive tree (id,tarif_id,is_folder) as (select id,tarif_id,is_folder from abonents where id in (':Группа|choices[1^]Все^[244^]Служебная группа^[4^]Корзина]$') union all select a.id,a.tarif_id,is_folder from abonents a join tree on a.parent_id=tree.id where a.deleted=0) select id,tarif_id from tree where is_folder=0) atr join abonents_block ab on atr.id=ab.abonent_id join tarif tt on atr.tarif_id=tt.id where tt.name=t.name) "Работающие" |
from |
(with recursive tree (id,tarif_id,is_folder) as ( |
select id,tarif_id,is_folder from abonents where id in (':Группа|choices[1^]Все^[244^]Служебная группа^[4^]Корзина]$') |
union all |
select a.id,a.tarif_id,is_folder from abonents a join tree on a.parent_id=tree.id where a.deleted=0) |
select id,tarif_id from tree where is_folder=0) ab join tarif t on ab.tarif_id=t.id |
group by 2 |
group order by |
2 order by |
1 desc{code} |
# h5. Отчёт по поступившим платежам за выбранный период, с возможностью выбора папки для поиска и пользователя,который добавил платеж. |
{code} select AB.CONTRACT_NUMBER as "Номер договора", |
... |
and (AB.DELETED = 0 or AB.DELETED is null) |
|
group by AB.CONTRACT_NUMBER, AB.NAME, FO.DESCR, AU.USERNAME, FO.SYSTEM_DATE union |
... |
# h5. Отчёт по абонентам, выводящий следующий данные:"ФИО, договор, текущий баланс,сумму списаний по разовым услугам за период, сумму абон.платы, сумму приходов за период". {code} |
select a.name as "ФИО", |
a.contract_number as "Договор", round((aa.ostatok+aa.debit-aa.credit) / cast((10000000000) as numeric(18,5)), 2) as "Текущий баланс", ( |
select |
sum(round(users_usluga.SUMM / cast((select CONST_VALUE from VPN_CONST where CONST_ID = 1) as numeric(18,5)), 2)) |
from users_usluga |
left join usluga on usluga.id=users_usluga.usluga_id where users_usluga.ABONENT_ID=a.id |
... |
) as "Абон. плата", ( |
select sum(round(fo1.op_summa / cast((select CONST_VALUE from VPN_CONST where CONST_ID = 1) as numeric(18,5)), 2)) |
from finance_operations fo1 |
where fo1.abonent_id=a.id |
and fo1.op_type=2 and fo1.op_date between (':1 Дата|date$') and (':2 Дата|date$') ) as "Приходы" |
from abonents a |
left join finance_operations fo on fo.abonent_id=a.id left join ADMIN_ACCOUNTS AA on AA.ID=A.ACCOUNT_ID where is_folder=0 group by a.name, a.TARIF_ID, (aa.ostatok+aa.debit-aa.credit) ,a.id,a.contract_number |
{code} |
# h5. Отчёт по абонентам с блокировкой по отрицательному балансу с балансом больше 2. {code} |
... |
left join usluga usl on usl.id=uu.USLUGA_ID left join abonents_block ab on ab.abonent_id=a.id |
where A.IS_FOLDER=0 |
and a.deleted=0 |
and a.deleted=0 ab.B_NEGBAL=1 |
and ab.B_NEGBAL=1 |
and round((aa.ostatok+aa.debit-aa.credit) / cast((10000000000) as numeric(18,5)), 2)>2 {code} |
# h5. Отчёт по абонентам, у которых дата следующего списания больше, чем указанная. |
{code} |
select |
distinct a.id as id, a.name as "ФИО", uu.next_date as "След. списание", |
a.contract_number as "Договор" |
from abonents a |
left join users_usluga uu on uu.abonent_id=a.id |
where uu.next_date>(':1 Дата|date$') and a.deleted=0 {code} |
... |
ua.name, av.attribute_value |
from |
abonents a |
join |
attribute_values av on a.id=av.abonent_id and av.attribute_value like '%:Значение неквизита$%' |
join |
user_attributes ua on av.attribute_id=ua.attribute_id {code} |
|
h6. Шаблон отчета {code}{% extends "form_list.html" %} |
... |
{info}Время в фильтре проверят дату *создания* а не дату *закрытия* заявки {info} {code} |
select |
HDSK.id, |
HDSK.SUBJ as "Тема", |
hs.NAME as "Статус", a.name as "Назначено", ht.NAME as "Тип" |
from HDSK |
left join HDSK_STATUS hs on hdsk.STATUS=hs.id left join HDSK_TYPE HT on HT.id=HDSK.HDSK_TYPE_ID left join abonents a on a.id=hdsk.PERFORMED_WHOM left join auth_user au on au.USERNAME=a.name |
where hdsk.IS_TASK=1 |
and hdsk.STATUS=':Статус|select[HdskStatus]$' and hdsk.HDSK_TYPE_ID=':Тип|select[HdskType]$' |
... |
and HDSK.HDSK_DATETIME between (':1 Дата|date$') and (':2 Дата|date$') union all |
select |
'"Количество"', '', '', '', |
count(*) |
from HDSK |
left join HDSK_STATUS hs on hdsk.STATUS=hs.id left join HDSK_TYPE HT on HT.id=HDSK.HDSK_TYPE_ID left join abonents a on a.id=hdsk.PERFORMED_WHOM left join auth_user au on au.USERNAME=a.name |
where hdsk.IS_TASK=1 |
and hdsk.STATUS=':Статус|select[HdskStatus]$' and hdsk.HDSK_TYPE_ID=':Тип|select[HdskType]$' |
... |
and HDSK.HDSK_DATETIME between (':1 Дата|date$') and (':2 Дата|date$') {code} |
# h5. Отчёт по абонентам с балансом между минимальным и максимальным указанным. |
{code} select distinct |
... |
{code} # h5. Отчет выводящий объёмы трафика за вбыранный период (месяца целиком) по абоненту |
{code}select |
year_number ||'-'|| month_number as "Период", (SUM_BYTE_IN_M/1000000000.00) as "Входящий/гиг", (SUM_BYTE_OUT_M /1000000000.00) as "Исходящий/гиг" |
from |
traf_counters |
where |
Abonent_ID = ':3-Абонент|select[Abonents,is_folder=0]$' and MONTH_NUMBER between extract(month from cast(':1-date_start|date$' as date)) and extract(month from cast(':2-date_end|date$' as date)) and YEAR_NUMBER between extract(year from cast(':1-date_start|date$' as date)) and extract(year from cast(':2-date_end|date$' as date)) |
order by |
YEAR_NUMBER, MONTH_NUMBER{code} {info}При настройке отчета [для использования в личном кабинете|CarbonBilling:Отчёты в личном кабинете], условие с ID абонента должно быть таким: |
... |
select distinct usl.name as "Услуга", |
(case |
when a.A_HOME_NUMBER='' then cast('0' as NUMERIC) |
else cast((a.A_HOME_NUMBER) as NUMERIC) end) as "Квартира", ( |
... |
) then 'Должник' else '' end) as "Должник", h.city || ', ' || h.STREET || ', д. ' || h.S_NUMBER as "Адрес", |
round(aa.ostatok / cast((select CONST_VALUE from VPN_CONST where CONST_ID = 1) as numeric(18,5)), 2) as "Баланс" |
from ABONENTS A left join USERS U on A.ID = U.ABONENT_ID |
... |
# h5. Отчёт по сумме приходов абонентов, подключенных к оператору связи за период. Вторым столбцом выводится 10% от суммы приходов {code} |
select |
cast(sum(FO.OP_SUMMA) as double precision) / (select CONST_VALUE from VPN_CONST |
... |
vl.abonent_id = ':Абонент|select[Abonents,is_folder=0]$' union all |
select |
' ', ' ', |
... |
# Получаем звонки из архивных баз |
find /var/db/billing/ -iname voip_log.fdb | sort | while read file; do |
#echo $file >> export_raw.csv # DEBUG sqlexec $file "set heading off; select distinct |
vl.src || ';' || |
vl.src vl.dst || ';' || |
vl.dst 'direction:' || vl.direction_id || ';' || |
'direction:' || vl.direction_id || ';' || |
substring(cast(vl.s_time as varchar(32)) from 1 for 19) || ';' || substring(cast(vl.e_time as varchar(32)) from 1 for 19) || ';' || cast(iif(vl.step is not null and vl.step>0, coalesce(vl.bill_sec_round/vl.step,'0'), coalesce(vl.bill_sec_round/60,'0')) as float) || ';' || coalesce(vl.step_price/10000000000.00,0) || ';' || |
cast(coalesce(vl.bill_sum/10000000000.00,'') as float) |
from voip_log vl |
... |
#echo '/var/db/billing.gdb' >> export_raw.csv # DEBUG sqlexec /var/db/billing.gdb "set heading off; select distinct |
vl.src || ';' || |
vl.src vl.dst || ';' || |
vl.dst 'direction:' || vl.direction_id || ';' || |
'direction:' || vl.direction_id || ';' || |
substring(cast(vl.s_time as varchar(32)) from 1 for 19) || ';' || cast(iif(vl.step is not null and vl.step>0, coalesce(vl.bill_sec_round/vl.step,'0'), coalesce(vl.bill_sec_round/60,'0')) as float) || ';' || coalesce(vl.step_price/10000000000.00,0) || ';' || |
cast(coalesce(vl.bill_sum/10000000000.00,'') as float) |
from voip_log vl |
... |
# Сортируем на случаей если звонок попал в несколько архивных баз и пишем в выгрузку cat export_raw.csv | grep -v '^<null>' | sort | uniq >> export.csv{code} |
# h5. Отчёт по абонентам, у которых услуги подключены не 5 числа. Данный отчёт подойдет для отслеживания абонентов со сдвигом даты списания услуг. |
{code} |
select |
a.contract_number as "Договор", |
a.name as "ФИО", |
uu.usluga_id as "ID услуги", |
u.name as "Имя услуги" |
from users_usluga uu |
left join usluga u on u.id=uu.usluga_id |
left join abonents a on a.id=uu.abonent_id |
where extract(day from cast(uu.create_date as date))!=5 |
and u.USLUGA_ABON_TYPE_ID=4 |
and uu.deleted=0 and uu.usluga_id!=-170000 |
... |
# h5. Отчёт по наличным/безналичным приходам с группировкой по тарифам абонентов за указанный период. {code} |
select |
t.name as "Тариф", ( |
... |
( select distinct |
count(*) |
from abonents a1 left join tarif t2 on t2.id=a1.tarif_id |
... |
{code} # h5. Отчёт для анализа настройки агентской схемы VoIP, отражает текущую настройку транков в операторских услугах телефонии |
{code}select |
a.name FIO, coalesce(vt.name,'---') DIRECTION, |
u.name USLUGA, |
uu.voip_operator_match_format TRUNK |
from |
users_usluga uu |
join |
usluga u on uu.usluga_id=u.id |
join |
abonents a on uu.abonent_id=a.id |
left join |
V_TYPE vt on u.voip_v_type_id=vt.id |
where |
uu.deleted=0 |
and a.deleted=0 |
and a.deleted=0 u.system_type=5 |
and u.system_type=5 |
order by |
a.id,vt.name{code} # h5. Отчёт по неплательщикам за месяц |
{code} |
select distinct a.id, |
... |
a.sms, a.contract_number |
from abonents a |
left join finance_operations fo on fo.abonent_id=a.id where fo.op_type=2 and not exists(select 1 from finance_operations where OP_DATE between (dateadd (-1 month to date ':Начало|date$')) and current_date and op_type=2 and abonent_id=a.id) |
and a.deleted=0 |
and a.is_folder=0 and a.parent_id not in (244,4,2) |
... |
3.1) в присоединенных данных по трафику добавляем колонку с месячным лимитом, с помощью этого вычисляем остаток/превышение за месяц */ |
select |
dates.aasdate "Период", dates.aasusluga "Услуга", |
... |
arch_account_stack aaasss join usluga aasu on aaasss.usluga_id=aasu.id |
where |
aaasss.abonent_id= ':Abonent_ID$' and aaasss.CHANGE_BALANCE_TIME between ':1-date_start|date$' and ':2-date_end|date$ 23:59:59') dates on dates.abon=a.id |
left join |
(select aas.abonent_id as abon, |
... |
coalesce( iif( |
sum(aas.v)<=u.max_mb_in_d and u.max_mb_in_d is not null, |
'Остаток ' || cast(round(u.max_mb_in_d-sum(aas.v)) as varchar(32)) || 'МБ', |
'Превышение ' || cast(round(sum(aas.v)-u.max_mb_in_d) as varchar(32)) || 'МБ' ), '' ) as limitleft |
from arch_account_stack aas join usluga u on aas.usluga_id=u.id |
from where |
arch_account_stack aas join usluga u on aas.usluga_id=u.id where |
aas.Abonent_ID = ':Abonent_ID$' |
and aas.ttype=2 |
and aas.ttype=2 aas.credit=0 |
and aas.credit=0 |
and v_type_id=1 and aas.CHANGE_BALANCE_TIME between ':1-date_start|date$' and ':2-date_end|date$ 23:59:59' |
group by |
aas.abonent_id,u.name,cast(aas.CHANGE_BALANCE_TIME as date),max_mb_in_d) down on dates.aasdate=down.den and dates.aasusluga=down.usl left join |
... |
coalesce( iif( |
sum(aas.v)<=u.max_mb_out_d and u.max_mb_out_d is not null, |
'Остаток ' || cast(round(u.max_mb_out_d-sum(aas.v)) as varchar(32)) || 'МБ', |
'Превышение ' || cast(round(sum(aas.v)-u.max_mb_out_d) as varchar(32)) || 'МБ' ), '' ) as limitleft |
from arch_account_stack aas join usluga u on aas.usluga_id=u.id |
from where |
arch_account_stack aas join usluga u on aas.usluga_id=u.id where |
aas.Abonent_ID = ':Abonent_ID$' |
and aas.ttype=2 |
and aas.ttype=2 aas.credit=0 |
and aas.credit=0 |
and v_type_id=2 and aas.CHANGE_BALANCE_TIME between ':1-date_start|date$' and ':2-date_end|date$ 23:59:59' |
group by |
aas.abonent_id,u.name,cast(aas.CHANGE_BALANCE_TIME as date),max_mb_out_d) upl on dates.aasdate=upl.den and dates.aasusluga=upl.usl |
where |
a.id= ':Abonent_ID$' and (upl.mbsum is not null or down.mbsum is not null) union all |
select |
extract(year from cast(dates.aasdate as timestamp)) ||'-'|| extract(month from cast(dates.aasdate as timestamp)), dates.aasusluga, |
... |
coalesce( iif( |
sum(down.mbsum)<=down.limm and down.limm is not null, |
'Остаток ' || cast(round(down.limm-sum(down.mbsum)) as varchar(32)) || 'МБ', |
'Превышение ' || cast(round(sum(down.mbsum)-down.limm) as varchar(32)) || 'МБ' ), |
... |
coalesce( iif( |
sum(upl.mbsum)<=upl.limm and upl.limm is not null, |
'Остаток ' || cast(round(upl.limm-sum(upl.mbsum)) as varchar(32)) || 'МБ', |
'Превышение ' || cast(round(sum(upl.mbsum)-upl.limm) as varchar(32)) || 'МБ' ), |
... |
arch_account_stack aaasss join usluga aasu on aaasss.usluga_id=aasu.id |
where |
aaasss.abonent_id= ':Abonent_ID$' and aaasss.CHANGE_BALANCE_TIME between ':1-date_start|date$' and ':2-date_end|date$ 23:59:59') dates on dates.abon=a.id |
left join |
(select aas.abonent_id as abon, |
... |
coalesce( iif( |
sum(aas.v)<=u.max_mb_in_d and u.max_mb_in_d is not null, |
'Остаток ' || cast(round(u.max_mb_in_d-sum(aas.v)) as varchar(32)) || 'МБ', |
'Превышение ' || cast(round(sum(aas.v)-u.max_mb_in_d) as varchar(32)) || 'МБ' ), '' ) as limitleft |
from arch_account_stack aas join usluga u on aas.usluga_id=u.id |
from where |
arch_account_stack aas join usluga u on aas.usluga_id=u.id where |
aas.Abonent_ID = ':Abonent_ID$' |
and aas.ttype=2 |
and aas.ttype=2 aas.credit=0 |
and aas.credit=0 |
and v_type_id=1 and aas.CHANGE_BALANCE_TIME between ':1-date_start|date$' and ':2-date_end|date$ 23:59:59' |
group by |
aas.abonent_id,u.name,cast(aas.CHANGE_BALANCE_TIME as date),max_mb_in_d,max_mb_in_m) down on dates.aasdate=down.den and dates.aasusluga=down.usl left join |
... |
coalesce( iif( |
sum(aas.v)<=u.max_mb_in_d and u.max_mb_in_d is not null, |
'Остаток ' || cast(round(u.max_mb_in_d-sum(aas.v)) as varchar(32)) || 'МБ', |
'Превышение ' || cast(round(sum(aas.v)-u.max_mb_in_d) as varchar(32)) || 'МБ' ), '' ) as limitleft |
from arch_account_stack aas join usluga u on aas.usluga_id=u.id |
from where |
arch_account_stack aas join usluga u on aas.usluga_id=u.id where |
aas.Abonent_ID = ':Abonent_ID$' |
and aas.ttype=2 |
and aas.ttype=2 aas.credit=0 |
and aas.credit=0 |
and v_type_id=2 and aas.CHANGE_BALANCE_TIME between ':1-date_start|date$' and ':2-date_end|date$ 23:59:59' |
group by |
aas.abonent_id,u.name,cast(aas.CHANGE_BALANCE_TIME as date),max_mb_in_d,max_mb_in_m) upl on dates.aasdate=upl.den and dates.aasusluga=upl.usl |
where |
a.id= ':Abonent_ID$' and (upl.mbsum is not null or down.mbsum is not null) group by 1,2,down.limm,upl.limm |
order by |
1,2{code} Шаблон для [размещения в личном кабинете|CarbonBilling:Отчёты в личном кабинете] |
... |
</form>{code} # h5. Отчёт по звонкам учтенным для взаиморасчетов между операторами |
{code}select |
calls.service as "Услуга", calls.source as "Источник", |
... |
calls.d_chan as "Назн. транк", calls.cost as "Стоимость" |
from |
(select |
aas.id aasid, vl.id vlid, |
... |
src_chan s_chan, dst_chan d_chan |
from |
voip_log vl |
join arch_account_stack aas |
on vl.id=aas.log_id join usluga u |
on vl.id=aas.log_id aas.usluga_id=u.id |
join usluga u on aas.usluga_id=u.id |
and vl.v_type_id=:Направление|choices[1^]Входящий^[2^]Исходящий^[3^]Транзит]$ |
where |
aas.abonent_id = ':Группа|select[Abonents,is_folder=0,category_id=2,deleted=0]$' |
and s_time |
between ':1-Период начала звонка, от|date$' |
and ':2-Период начала звонка, до|date$ 23:59:59' |
) calls |
union all |
select |
' ', ' ', |
... |
' ', cast(sum(calls.cost) as varchar(32)) |
from |
(select |
aas.id aasid, vl.id vlid, |
... |
src_chan s_chan, dst_chan d_chan |
from |
voip_log vl |
join arch_account_stack aas |
on vl.id=aas.log_id join usluga u |
on vl.id=aas.log_id aas.usluga_id=u.id |
join usluga u on aas.usluga_id=u.id |
and vl.v_type_id=:Направление|choices[1^]Входящий^[2^]Исходящий^[3^]Транзит]$ |
where |
aas.abonent_id = ':Группа|select[Abonents,is_folder=0,category_id=2,deleted=0]$' |
and s_time |
between ':1-Период начала звонка, от|date$' |
and ':2-Период начала звонка, до|date$ 23:59:59' |
) calls |
group by calls.service{code} |
... |
iif(a.home_id is not null, 'Улица: ' || coalesce(h.street,''),'Не выбран дом'), iif(a.home_id is not null and (h.city is null or h.city=''), 'Не указан город', 'Не выбран дом') |
from |
abonents a |
join tarif t on a.tarif_id=t.id |
join abonents p on a.parent_id=p.id |
left join homes h on a.home_id=h.id |
where |
(a.home_id is null or h.city='' or h.city is null) |
and a.is_folder=0 |
and a.is_folder=0 a.category_id<2 |
and a.category_id<2 a.deleted=0 |
and a.deleted=0 |
and a.id>0 and a.parent_id not in (244,1313,16723) |
... |
Отчет расчитан на использование тарифов типа лестница с некоторым объёмом трафика включенного в абонентскую плату, по исчерпании которого начисляется помегабайтная оплата. По каждому абоненту отражены тарифы назначенные абоненту за период, суммарное потребление трафика по тарифу и отдельно трафик сверх включенного, а так же его стоимость. |
{code}select |
aid, ' ', |
... |
from |
traf_counters as tfc |
join abonents ab on tfc.abonent_id=ab.id |
join users_usluga as uu on tfc.users_usluga_id=uu.id |
join usluga usl on uu.usluga_id=usl.id |
left join tarif t on uu.tarif_id=t.id |
join (select tuu.tarif_id as tar, sum(tu.max_mb_in_m) as mbinc |
from tarif_users_usluga tuu |
join usluga tu on tuu.usluga_id=tu.id |
where tu.max_mb_in_m is not null and tu.max_mb_in_m<>0 |
group by tuu.tarif_id ) uslpreord on uu.tarif_id=uslpreord.tar left join (select distinct tuu.tarif_id as tar, tu.id as serv, tu.in_price/10000000000.00 as in_price |
from tarif_users_usluga tuu |
join usluga tu on tuu.usluga_id=tu.id and tu.in_price<>0 ) tar_cost on uu.tarif_id=tar_cost.tar and uu.usluga_id=tar_cost.serv |
where |
tfc.MONTH_NUMBER = (':Месяц|choices[1^]Январь^[2^]Февраль^[3^]Март^[4^]Апрель^[5^]Май^[6^]Июнь^[7^]Июль^[8^]Август^[9^]Сентябрь^[10^]Октябрь^[11^]Ноябрь^[12^]Декабрь]$') |
and tfc.year_number = (':Год|choices[2019^]2019^[2018^]2018^[2017^]2017^[2016^]2016^[2015^]2015^[2014^]2014]$') |
and ab.company = 1 and (usl.max_mb_in_m>0 or usl.in_price>0) --and ab.id in (1172,2575) ) |
where |
(traf_cost<>0 and price<>0) |
group by 1,3,4,5,6 |
union all |
select |
aid, ' ', |
... |
from |
traf_counters as tfc |
join abonents ab on tfc.abonent_id=ab.id |
join users_usluga as uu on tfc.users_usluga_id=uu.id |
join usluga usl on uu.usluga_id=usl.id |
left join tarif t on uu.tarif_id=t.id |
join (select tuu.tarif_id as tar, sum(tu.max_mb_in_m) as mbinc |
from tarif_users_usluga tuu |
join usluga tu on tuu.usluga_id=tu.id |
where tu.max_mb_in_m is not null and tu.max_mb_in_m<>0 |
group by tuu.tarif_id ) uslpreord on uu.tarif_id=uslpreord.tar left join (select distinct tuu.tarif_id as tar, tu.id as serv, tu.in_price/10000000000.00 as in_price |
from tarif_users_usluga tuu |
join usluga tu on tuu.usluga_id=tu.id and tu.in_price<>0 ) tar_cost on uu.tarif_id=tar_cost.tar and uu.usluga_id=tar_cost.serv |
where |
tfc.MONTH_NUMBER = (':Месяц|choices[1^]Январь^[2^]Февраль^[3^]Март^[4^]Апрель^[5^]Май^[6^]Июнь^[7^]Июль^[8^]Август^[9^]Сентябрь^[10^]Октябрь^[11^]Ноябрь^[12^]Декабрь]$') and tfc.year_number = (':Год|choices[2019^]2019^[2018^]2018^[2017^]2017^[2016^]2016^[2015^]2015^[2014^]2014]$') |
... |
--and ab.id in (1172,2575) ) |
where |
(traf_cost<>0 and price<>0) or (traf_cost=0 and price is null) group by 1,2,3,4,mbinc |
... |
from |
traf_counters as tfc |
join abonents ab on tfc.abonent_id=ab.id |
join users_usluga as uu on tfc.users_usluga_id=uu.id |
join usluga usl on uu.usluga_id=usl.id |
left join tarif t on uu.tarif_id=t.id |
join (select tuu.tarif_id as tar, sum(tu.max_mb_in_m) as mbinc |
from tarif_users_usluga tuu |
join usluga tu on tuu.usluga_id=tu.id |
where tu.max_mb_in_m is not null and tu.max_mb_in_m<>0 |
group by tuu.tarif_id ) uslpreord on uu.tarif_id=uslpreord.tar left join (select distinct tuu.tarif_id as tar, tu.id as serv, tu.in_price/10000000000.00 as in_price |
from tarif_users_usluga tuu |
join usluga tu on tuu.usluga_id=tu.id and tu.in_price<>0 ) tar_cost on uu.tarif_id=tar_cost.tar and uu.usluga_id=tar_cost.serv |
where |
tfc.MONTH_NUMBER = (':Месяц|choices[1^]Январь^[2^]Февраль^[3^]Март^[4^]Апрель^[5^]Май^[6^]Июнь^[7^]Июль^[8^]Август^[9^]Сентябрь^[10^]Октябрь^[11^]Ноябрь^[12^]Декабрь]$') and tfc.year_number = (':Год|choices[2019^]2019^[2018^]2018^[2017^]2017^[2016^]2016^[2015^]2015^[2014^]2014]$') |
... |
</tr> {% for row in data %} |
{% if row.1 != ' ' %} |
<tr> <td bgcolor="#F5F5F5"> </td> |
... |
<td bgcolor="#F5F5F5"> </td> <td bgcolor="#F5F5F5"> </td> |
</tr> |
{% endif %} |
{% if row.1 != ' ' and row.2 != ' ' %} |
<tr> <td><a href="/admin/Abonents/Abonents/{{ row.0 }}/" target="_blank">{{ row.1 }}</a></td> |
</tr> |
{% else %} <tr> |
... |
{% endblock %}{code} |
# h5. Цена на направление за период |
# h5. Цены на направления за период |
{code} |
select |
vd.mask as direction_mask, vd.id as direction_id, |
... |