Отчёт поиск договоров по тарифу

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
(Пример 2)
 
(4 промежуточные версии не показаны)
Строка 4: Строка 4:
kernel_find_contracts_for_tariff.rep.xml
kernel_find_contracts_for_tariff.rep.xml
 +
<source lang="xml">  
<source lang="xml">  
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
-
<report title="Поиск договоров по тарифам CSV (Скат)" type="java">
+
<report title="Поиск договоров по тарифам CSV" type="java">
<contractGroups name="contractGroups" title="Группы договоров"/>
<contractGroups name="contractGroups" title="Группы договоров"/>
<contractGroups name="contractGroups2" title="Исключая группы"/>
<contractGroups name="contractGroups2" title="Исключая группы"/>
Строка 146: Строка 147:
}
}
</source>
</source>
 +
 +
--[[Участник:DimOn|dimOn]] 06:52, 5 августа 2010 (UTC)
== Пример 2 ==
== Пример 2 ==
 +
 +
список 1: какие нужны фильтры для поиска. это поле слева
 +
*1. Статус
 +
*2. Баланс от
 +
*2. Баланс до
 +
*3. Сортировка по адресу или по балансу или по номеру договора
 +
*4.1. Тарифы
 +
*4.2. Группы тарифов
 +
*4.3. Исключая группы
 +
 +
список 2: какие столбцы нужны в таблице. это таблица справа. т.е. какая информация должна отображаться там столбцами.
 +
*1. Номер договора
 +
*2. ФИО
 +
*3. Статус
 +
*4. Тариф
 +
*5. Баланс (на данный момент)
 +
*6. Адрес
 +
 +
PID параметров фио и адрес, берётся из настроек как и для contract_skat_debtor
 +
*report.contract_skat_debtor.fio.pid
 +
*report.contract_skat_debtor.address.pid
 +
 +
kernel_find_contracts_for_tariff_2.rep.xml
 +
 +
<source lang="xml">
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
<report title="Поиск договоров по тарифам CSV 2 (Скат)" type="java">
 +
<list name="status" title="Статус" width="2" x="0" y="0">
 +
<item id="0" title="активен"/>
 +
<item id="1" title="в отключении"/>
 +
<item id="2" title="отключен"/>
 +
<item id="3" title="закрыт"/>
 +
<item id="4" title="приостановлен"/>
 +
<item id="5" title="в подключении"/>
 +
</list>
 +
<textField name="min" title="Баланс от" textBefore="" textAfter="" x="0" y="1"/>
 +
<textField name="max" title="Баланс до" textBefore="" textAfter="" x="1" y="1"/>
 +
<combo name="sort" title="Сортировка" width="2" >
 +
<item id="0" title="-"/>
 +
<item id="1" title="по адресу"/>
 +
<item id="2" title="по балансу"/>
 +
<item id="3" title="по номеру договора"/>
 +
</combo>
 +
<tariffs name="tariffs" title="Тарифы"/>
 +
<tariffGroups name="tariffGroups" title="Группы тарифов"/>
 +
<contractGroups name="contractGroups2" title="Исключая группы"/>
 +
<fields>
 +
<item id="cid" title="#cid"/>
 +
<item id="title" title="Номер договора"/>
 +
<item id="fio" title="ФИО"/>
 +
<item id="status" title="Статус"/>
 +
<item id="tptitle" title="Тариф"/>
 +
<item id="balance" title="Баланс (на данный момент)"/>
 +
<item id="address" title="Адрес"/>
 +
</fields>
 +
</report>
 +
</source>
 +
 +
 +
kernel_find_contracts_for_tariff_2.java
 +
 +
 +
<source lang="java">
 +
import java.sql.*;
 +
import java.util.*;
 +
import java.util.regex.*;
 +
import java.sql.*;
 +
import bitel.billing.server.util.*;
 +
import bitel.billing.server.contract.bean.*;
 +
import bitel.billing.common.TimeUtils;
 +
 +
public void fillReport( con, filter, result )
 +
{
 +
// Статус
 +
String statuss = filter.getStringParam( "status" );
 +
// Баланс от и до
 +
int min = filter.getIntParam( "min", Integer.MIN_VALUE );
 +
int max = filter.getIntParam( "max", Integer.MAX_VALUE );
 +
// Сортировка
 +
// "0" "-"
 +
// "1" "по адресу"
 +
// "2" "по балансу"
 +
// "3" "по номеру договора"
 +
int sort = filter.getIntParam( "sort" );
 +
// Тарифы. Типа "190, 47".
 +
String tariffsList = filter.getStringParam( "tariffs" );
 +
// Группы тарифов
 +
String tariffGroups = filter.getStringParam( "tariffGroups" );
 +
// Исключая группы договоров. Типа 536870912.
 +
long groupMask2 = filter.getLongParam( "contractGroups2" );
 +
// PID параметров фио и адрес, берётся из настроек как и для contract_skat_debtor
 +
int fioPid = filter.getIntParam( "report.contract_skat_debtor.fio.pid", 1 );
 +
int addressPid = filter.getIntParam( "report.contract_skat_debtor.address.pid", 3 );
 +
 +
// удаляем временную таблицу балансов договоров
 +
String query = "DROP TEMPORARY TABLE IF EXISTS temp_balance;"; 
 +
con.createStatement().executeUpdate( query );
 +
// балансы договоров
 +
query =
 +
        "CREATE TEMPORARY TABLE temp_balance ( UNIQUE(cid) ) " +
 +
        "SELECT cid, MAX(yy*12+(mm-1))%12 + 1 AS mm," +
 +
        "FLOOR(MAX(yy*12+(mm-1)) / 12) AS yy " +    
 +
        "FROM contract_balance " +
 +
        "GROUP BY cid"; 
 +
//query = result.sql( query , filter );
 +
//System.out.println( query );                 
 +
con.createStatement().executeUpdate( query );
 +
 +
String query =
 +
" SELECT contract.id, contract.title, contract.comment, contract.status, " +
 +
" fio.val as fio, address.address as address, ( b.summa1 + b.summa2 - b.summa3 - b.summa4) as balance, " +
 +
" tariff_plan.title ";
 +
query += " FROM contract ";
 +
query += " LEFT JOIN temp_balance ON temp_balance.cid=contract.id ";
 +
query += " LEFT JOIN contract_balance as b ON b.cid=contract.id AND b.mm = temp_balance.mm AND b.yy = temp_balance.yy";
 +
 +
query += " LEFT JOIN contract_parameter_type_1 as fio ON contract.id=fio.cid AND fio.pid=" + fioPid;
 +
query += " LEFT JOIN contract_parameter_type_2 as address ON contract.id=address.cid AND address.pid=" + addressPid;
 +
 +
// query += " LEFT JOIN contract_tariff ON contract_tariff.cid=contract.id ";
 +
query += " LEFT JOIN contract_tariff ON contract_tariff.cid=contract.id AND (contract_tariff.date1 <= ? OR contract_tariff.date1 is NULL) AND (contract_tariff.date2 >= ? OR contract_tariff.date2 is NULL) ";
 +
query += " LEFT JOIN tariff_plan ON contract_tariff.tpid=tariff_plan.id ";
 +
query += " LEFT JOIN contract_tariff_group ON  contract_tariff_group.cid=contract.id ";
 +
query += " LEFT JOIN tariff_group ON contract_tariff_group.gid=tariff_group.id ";
 +
query += " WHERE (1) ";
 +
 +
if( groupMask2 > 0 )
 +
{
 +
query += " AND contract.gr&?=0 ";
 +
}
 +
if( tariffsList != null && !tariffsList.isEmpty() )
 +
{
 +
query += " AND contract_tariff.tpid in ("+tariffsList+") ";
 +
}
 +
if( tariffGroups != null && !tariffGroups.isEmpty() )
 +
{
 +
query += " AND contract_tariff_group.gid IN ("+tariffGroups+") ";
 +
}
 +
if( statuss != null && !statuss.isEmpty() )
 +
{
 +
query += " AND contract.status IN (" + statuss + ") ";
 +
}
 +
 +
query += " AND  ( b.summa1 + b.summa2 - b.summa3 - b.summa4) >= " + min;
 +
query += " AND  ( b.summa1 + b.summa2 - b.summa3 - b.summa4) <= " + max; 
 +
 +
if( sort>0 )
 +
{
 +
query +=  " ORDER BY ";
 +
switch( sort )
 +
{
 +
case 1:
 +
query += "address.address";
 +
break;
 +
case 2:
 +
query += "balance";
 +
break;
 +
case 3:
 +
query += "contract.title";
 +
break;
 +
}
 +
}
 +
 +
//System.out.println(query);
 +
ps = con.prepareStatement( query );
 +
 +
int index = 1;
 +
 +
java.sql.Date current = new java.sql.Date( System.currentTimeMillis() );
 +
ps.setDate(index++, current );
 +
ps.setDate(index++, current );
 +
 +
if( groupMask2 > 0 )
 +
{
 +
ps.setLong( index++, groupMask2 );
 +
}
 +
 +
ResultSet rs = ps.executeQuery();
 +
 +
ArrayList data = new ArrayList( 1000 );
 +
while( rs.next() )
 +
{
 +
//<item id="cid" title="#cid"/>
 +
//<item id="title" title="Номер договора"/>
 +
//<item id="fio" title="ФИО"/>
 +
//<item id="status" title="Статус"/>
 +
//<item id="tptitle" title="Тариф"/>
 +
//<item id="balance" title="Баланс (на данный момент)"/>
 +
//<item id="address" title="Адрес"/>
 +
cid = rs.getString("contract.id");
 +
title = rs.getString("contract.title");
 +
comment = rs.getString("contract.comment");
 +
status = rs.getInt("contract.status");
 +
   
 +
    tptitle = rs.getString("tariff_plan.title");
 +
   
 +
    balance = rs.getDouble("balance");
 +
    address = rs.getString("address");
 +
    fio = rs.getString("fio");
 +
 
 +
    map = new HashMap();
 +
    map.put( "cid", cid );
 +
    map.put( "title", title );
 +
    map.put( "fio", fio );
 +
    map.put( "status", ContractStatus.statusToString( status ) );    
 +
    map.put( "tptitle", tptitle );
 +
    map.put( "balance", String.valueOf( balance ) );
 +
    map.put( "address", address );
 +
    data.add( map );
 +
}
 +
 +
result.setData( data );
 +
}
 +
</source>
 +
--[[Участник:DimOn|dimOn]] 05:17, 13 сентября 2010 (UTC)

Текущая версия на 05:19, 13 сентября 2010

Табличный отчёт для демонстрации того, как из отчёта сделать поиск тарифов.

Пример 1

kernel_find_contracts_for_tariff.rep.xml

<?xml version="1.0" encoding="UTF-8"?>
<report title="Поиск договоров по тарифам CSV" type="java">
	<contractGroups name="contractGroups" title="Группы договоров"/>
	<contractGroups name="contractGroups2" title="Исключая группы"/>
	<tariffs name="tariffs" title="Тарифы"/>
	<tariffGroups name="tariffGroups" title="Группы тарифов"/>
	<combo name="isOnlyActive" title="Только активные тарифы и группы тарифов">
		<item id="1" title="Да"/>
		<item id="0" title="Нет"/>
	</combo>
	<list name="status" title="Статус">
		<item id="0" title="активен"/>
		<item id="1" title="в отключении"/>
		<item id="2" title="отключен"/>				
		<item id="3" title="закрыт"/>		
		<item id="4" title="приостановлен"/>		
		<item id="5" title="в подключении"/>		
	</list>
	<fields>
		<item id="title" title="Имя"/>
		<item id="comment" title="Комментарий"/>
		<item id="cid" title="#cid"/>
		<item id="status" title="Статус"/>
		<item id="tptitle" title="Тариф"/>
		<item id="tpdate" title="Период"/>
		<item id="tgtitle" title="Группа тарифа"/>
		<item id="tgdate" title="Период"/>
	</fields>
</report>

kernel_find_contracts_for_tariff.java

import java.sql.*;
import java.util.*;
import java.util.regex.*;
import java.sql.*;
import bitel.billing.server.util.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.common.TimeUtils;
 
public void fillReport( con, filter, result )
{
	// Группы договоров. Типа 536870912.
	long groupMask = filter.getLongParam( "contractGroups" );
	// Исключая группы договоров. Типа 536870912.
	long groupMask2 = filter.getLongParam( "contractGroups2" );
	// Тарифы. Типа "190, 47".
	String tariffsList = filter.getStringParam( "tariffs" );
	// Искать только активные?
	boolean isOnlyActive = filter.getIntParam( "isOnlyActive" ) == 1;
	// Группы тарифов
	String tariffGroups = filter.getStringParam( "tariffGroups" );
	// Статус
	String statuss = filter.getStringParam( "status" );
 
	String query =
		" SELECT contract.id,contract.title,contract.comment,contract.status," +
		"contract_tariff.tpid, contract_tariff.date1, contract_tariff.date2, tariff_plan.title, " +
		"contract_tariff_group.gid, contract_tariff_group.date1, contract_tariff_group.date2, tariff_group.title";
	query += " FROM contract ";
	query += " LEFT JOIN contract_tariff ON contract_tariff.cid=contract.id ";
	query += " LEFT JOIN tariff_plan ON contract_tariff.tpid=tariff_plan.id ";
	query += " LEFT JOIN contract_tariff_group ON  contract_tariff_group.cid=contract.id ";
	query += " LEFT JOIN tariff_group ON contract_tariff_group.gid=tariff_group.id ";
	query += " WHERE (1) ";
 
	if( groupMask > 0 )
	{
		query += " AND contract.gr&?!=0 ";
	}
	if( groupMask2 > 0 )
	{
		query += " AND contract.gr&?=0 ";
	}
	if( tariffsList != null && !tariffsList.isEmpty() )
	{
		query += " AND contract_tariff.tpid in ("+tariffsList+") ";
	}
	if( tariffGroups != null && !tariffGroups.isEmpty() )
	{
		query += " AND contract_tariff_group.gid IN ("+tariffGroups+") ";
	}
	if( statuss != null && !statuss.isEmpty() )
	{
		query += " AND contract.status IN (" + statuss + ") ";
	}
 
	if( isOnlyActive )
	{
		query += " AND (contract_tariff.date1 IS NULL OR TO_DAYS(contract_tariff.date1)<=TO_DAYS(now())) AND (contract_tariff.date2 IS NULL OR TO_DAYS(now())<=TO_DAYS(contract_tariff.date2)) ";
		query += " AND (contract_tariff_group.date1 IS NULL OR TO_DAYS(contract_tariff_group.date1)<=TO_DAYS(now())) AND (contract_tariff_group.date2 IS NULL OR TO_DAYS(now())<=TO_DAYS(contract_tariff_group.date2)) ";
	}
 
	ps = con.prepareStatement( query );
 
	int index = 1;
 
	if( groupMask > 0 )
	{
		ps.setLong( index++, groupMask );
	}
	if( groupMask2 > 0 )
	{
		ps.setLong( index++, groupMask2 );
	}
 
	ResultSet rs = ps.executeQuery();
 
	ArrayList data = new ArrayList( 1000 );
	while( rs.next() )
	{
		cid = rs.getString("contract.id");
	    title = rs.getString("contract.title");
	    comment = rs.getString("contract.comment"); 
	    status = rs.getInt("contract.status");
 
	    tpdate1 = rs.getDate("contract_tariff.date1");
	    tpdate2 = rs.getDate("contract_tariff.date2");
	    tptitle = rs.getString("tariff_plan.title");
 
	    tgdate1 = rs.getDate("contract_tariff_group.date1");
	    tgdate2 = rs.getDate("contract_tariff_group.date2");
	    tgtitle = rs.getString("tariff_group.title");
 
	    map = new HashMap();
	    map.put( "cid", cid );
	    map.put( "title", title );
	    map.put( "comment", comment );
	    map.put( "status", ContractStatus.statusToString( status ) );
	    map.put( "tpdate", TimeUtils.formatPeriod( tpdate1, tpdate2 ) );
	    map.put( "tptitle", tptitle );
	    map.put( "tgdate", TimeUtils.formatPeriod( tgdate1, tgdate2 ) );
	    map.put( "tgtitle", tgtitle );
	    data.add( map );
	}
 
	result.setData( data );
}

--dimOn 06:52, 5 августа 2010 (UTC)

Пример 2

список 1: какие нужны фильтры для поиска. это поле слева

  • 1. Статус
  • 2. Баланс от
  • 2. Баланс до
  • 3. Сортировка по адресу или по балансу или по номеру договора
  • 4.1. Тарифы
  • 4.2. Группы тарифов
  • 4.3. Исключая группы

список 2: какие столбцы нужны в таблице. это таблица справа. т.е. какая информация должна отображаться там столбцами.

  • 1. Номер договора
  • 2. ФИО
  • 3. Статус
  • 4. Тариф
  • 5. Баланс (на данный момент)
  • 6. Адрес

PID параметров фио и адрес, берётся из настроек как и для contract_skat_debtor

  • report.contract_skat_debtor.fio.pid
  • report.contract_skat_debtor.address.pid

kernel_find_contracts_for_tariff_2.rep.xml

<?xml version="1.0" encoding="UTF-8"?>
<report title="Поиск договоров по тарифам CSV 2 (Скат)" type="java">
	<list name="status" title="Статус" width="2" x="0" y="0">
		<item id="0" title="активен"/>
		<item id="1" title="в отключении"/>
		<item id="2" title="отключен"/>				
		<item id="3" title="закрыт"/>		
		<item id="4" title="приостановлен"/>		
		<item id="5" title="в подключении"/>		
	</list>
	<textField name="min" title="Баланс от" textBefore="" textAfter="" x="0" y="1"/>	 
	<textField name="max" title="Баланс до" textBefore="" textAfter="" x="1" y="1"/>
	<combo name="sort" title="Сортировка" width="2" >
		<item id="0" title="-"/>
		<item id="1" title="по адресу"/>
		<item id="2" title="по балансу"/>				
		<item id="3" title="по номеру договора"/>		
	</combo>
	<tariffs name="tariffs" title="Тарифы"/>
	<tariffGroups name="tariffGroups" title="Группы тарифов"/>	
	<contractGroups name="contractGroups2" title="Исключая группы"/>
	<fields>
		<item id="cid" title="#cid"/>
		<item id="title" title="Номер договора"/>
		<item id="fio" title="ФИО"/>
		<item id="status" title="Статус"/>		
		<item id="tptitle" title="Тариф"/>
		<item id="balance" title="Баланс (на данный момент)"/>		
		<item id="address" title="Адрес"/>
	</fields>
</report>


kernel_find_contracts_for_tariff_2.java


import java.sql.*;
import java.util.*;
import java.util.regex.*;
import java.sql.*;
import bitel.billing.server.util.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.common.TimeUtils;
 
public void fillReport( con, filter, result )
{
	// Статус
	String statuss = filter.getStringParam( "status" );
	// Баланс от и до
	int min = filter.getIntParam( "min", Integer.MIN_VALUE );
	int max = filter.getIntParam( "max", Integer.MAX_VALUE );
	// Сортировка
	// "0" "-"
	// "1" "по адресу"
	// "2" "по балансу"			
	// "3" "по номеру договора"
	int sort = filter.getIntParam( "sort" );
	// Тарифы. Типа "190, 47".
	String tariffsList = filter.getStringParam( "tariffs" );
	// Группы тарифов
	String tariffGroups = filter.getStringParam( "tariffGroups" );
	// Исключая группы договоров. Типа 536870912.
	long groupMask2 = filter.getLongParam( "contractGroups2" );
	// PID параметров фио и адрес, берётся из настроек как и для contract_skat_debtor
	int fioPid = filter.getIntParam( "report.contract_skat_debtor.fio.pid", 1 );
	int addressPid = filter.getIntParam( "report.contract_skat_debtor.address.pid", 3 );
 
	// удаляем временную таблицу балансов договоров
	String query = "DROP TEMPORARY TABLE IF EXISTS temp_balance;";  	
	con.createStatement().executeUpdate( query );
	// балансы договоров
	query =
        "CREATE TEMPORARY TABLE temp_balance ( UNIQUE(cid) ) " +
        "SELECT cid, MAX(yy*12+(mm-1))%12 + 1 AS mm," +
        "FLOOR(MAX(yy*12+(mm-1)) / 12) AS yy " + 	    		
        "FROM contract_balance " +
        "GROUP BY cid";  
	//query = result.sql( query , filter );
	//System.out.println( query );                  
	con.createStatement().executeUpdate( query );
 
	String query =
		" SELECT contract.id, contract.title, contract.comment, contract.status, " +
		" fio.val as fio, address.address as address, ( b.summa1 + b.summa2 - b.summa3 - b.summa4) as balance, " +
		" tariff_plan.title ";
	query += " FROM contract ";
	query += " LEFT JOIN temp_balance ON temp_balance.cid=contract.id ";
	query += " LEFT JOIN contract_balance as b ON b.cid=contract.id AND b.mm = temp_balance.mm AND b.yy = temp_balance.yy";
 
	query += " LEFT JOIN contract_parameter_type_1 as fio ON contract.id=fio.cid AND fio.pid=" + fioPid;
	query += " LEFT JOIN contract_parameter_type_2 as address ON contract.id=address.cid AND address.pid=" + addressPid;
 
//	query += " LEFT JOIN contract_tariff ON contract_tariff.cid=contract.id ";
	query += " LEFT JOIN contract_tariff ON contract_tariff.cid=contract.id AND (contract_tariff.date1 <= ? OR contract_tariff.date1 is NULL) AND (contract_tariff.date2 >= ? OR contract_tariff.date2 is NULL) ";
	query += " LEFT JOIN tariff_plan ON contract_tariff.tpid=tariff_plan.id ";
	query += " LEFT JOIN contract_tariff_group ON  contract_tariff_group.cid=contract.id ";
	query += " LEFT JOIN tariff_group ON contract_tariff_group.gid=tariff_group.id ";
	query += " WHERE (1) ";
 
	if( groupMask2 > 0 )
	{
		query += " AND contract.gr&?=0 ";
	}
	if( tariffsList != null && !tariffsList.isEmpty() )
	{
		query += " AND contract_tariff.tpid in ("+tariffsList+") ";
	}
	if( tariffGroups != null && !tariffGroups.isEmpty() )
	{
		query += " AND contract_tariff_group.gid IN ("+tariffGroups+") ";
	}
	if( statuss != null && !statuss.isEmpty() )
	{
		query += " AND contract.status IN (" + statuss + ") ";
	}
 
	query += " AND  ( b.summa1 + b.summa2 - b.summa3 - b.summa4) >= " + min;
	query += " AND  ( b.summa1 + b.summa2 - b.summa3 - b.summa4) <= " + max;   
 
	if( sort>0 )
	{
		query +=  " ORDER BY ";
		switch( sort )
		{
			case 1:
				query += "address.address";
				break;
			case 2:
				query += "balance";
				break;
			case 3:
				query += "contract.title";
				break;
		}
	}
 
//System.out.println(query);
	ps = con.prepareStatement( query );
 
	int index = 1;
 
	java.sql.Date current = new java.sql.Date( System.currentTimeMillis() );
	ps.setDate(index++, current );
	ps.setDate(index++, current );
 
	if( groupMask2 > 0 )
	{
		ps.setLong( index++, groupMask2 );
	}
 
	ResultSet rs = ps.executeQuery();
 
	ArrayList data = new ArrayList( 1000 );
	while( rs.next() )
	{
		//<item id="cid" title="#cid"/>
		//<item id="title" title="Номер договора"/>
		//<item id="fio" title="ФИО"/>
		//<item id="status" title="Статус"/>		
		//<item id="tptitle" title="Тариф"/>
		//<item id="balance" title="Баланс (на данный момент)"/>		
		//<item id="address" title="Адрес"/>
		cid = rs.getString("contract.id");
		title = rs.getString("contract.title");
		comment = rs.getString("contract.comment"); 
		status = rs.getInt("contract.status");
 
	    tptitle = rs.getString("tariff_plan.title");
 
	    balance = rs.getDouble("balance");
	    address = rs.getString("address");
	    fio = rs.getString("fio");
 
	    map = new HashMap();
	    map.put( "cid", cid );
	    map.put( "title", title );
	    map.put( "fio", fio );
	    map.put( "status", ContractStatus.statusToString( status ) );	    
	    map.put( "tptitle", tptitle );
	    map.put( "balance", String.valueOf( balance ) );
	    map.put( "address", address );
	    data.add( map );
	}
 
	result.setData( data );
}

--dimOn 05:17, 13 сентября 2010 (UTC)

Личные инструменты