ABACS – биллинговая система
 Главная   Новости   О системе   Статьи   ABACS Inside   Поддержка   Контактная информация   Карта сайта 
Примеры программ на «Q»

Название примера: «Расчет нарушителя»

Задача

Создать модуль расчета тарифного плана "Медиум" для абонентов коммутируемого доступа сети Интернет.

Тарифный план "Медиум" описан следующей таблицей:

Тариф "Медиум" (для физических и юридических лиц)

 

полный доступ

прокси + Интегра

Интегра

Обратный дозвон

Подключение

Бесплатно

Ежемесячная абонентская плата

(включает 1200 минут в месяц)

$9.6

$12.00

Время работы в сети свыше 1200 минут в месяц

$0.0096


Реализация

Файл кода "MediumTarif.src"



module MediumTarif;

import		system;
import		billing;
import		math;
import		ITraff;

using module	system;
using module	billing;
using module	math;
using module	ITraff;
//------------------------------------------------------------
// Объявление глобальных переменных
//------------------------------------------------------------
TContext	Context;
bool		MakeRatingOfMediumTarif();
string		CurrencyAmountStr;	// Итоговая сумма в у.е.
string		RubleAmountStr;		// Итоговая сумма в рублях
string		CostStr;		// Стоимость текущего тарифа в у.е.
//------------------------------------------------------------
// "Точка входа"
//------------------------------------------------------------
void main()
{
	AddContext(Context, CNTX_TRAFFIC, 0);
	if (MakeRatingOfMediumTarif() == false) _Exit(E_GET_RATING);
}
//------------------------------------------------------------
// Алгоритм начисления
//------------------------------------------------------------
bool MakeRatingOfMediumTarif()
{
	int		DayCount;		// Количество дней для расчета
	int		i, j, k;
	int		FlagAccessType;		// Флаг вида доступа
	int		CountDayMonth;		// Количество дней в расчетном месяце
	int		Period;			// Количество дней в расчетном периоде
	string		PeriodStr;
	int		DayCountPeriod;		// Кол-во дней использования услуги
	float		NightTime	= 0,	// Накопительные переменные для времени
			DayTime 	= 0,	// ночного и дневного доступа
			Time		= 0;	// + переменныя полного времени
	string		NightTimeStr,
			DayTimeStr,
			TimeStr;
	float		CurrRate;		// Текущий курс у.е.
	float		AmountCurrencyAll = 0;	// Общая сумма у.е.
	string		AmountCurrencyAllStr;	// Строка с общей суммой в у.е.
	float		UsersPayment;		// Стоимость абон.платы
	float		DayTarif,		// Стоимость дневного
			NightTarif;		// и ночного времени свыше лимита
	string		DayTarifStr,
			NightTarifStr;
	float		BorderTime;		// Порог зачтенного времени
	string		BorderTimeStr;
	float		CostTimeDay,
			CostTimeNight;
	string		CostTimeDayStr,
			CostTimeNightStr;
	string		Login,			// имя пользователя (login),
			nDate,			// начальная дата,
			kDate;			// конечная дата из контекста
	string		tmp;
	string		sAccessType;
	int		nDateInt,
			kDateInt;

	// Получить параметры контекста
	Login		= GetStringFromContext	( Context, "itDriveNumerStr"	);
	nDate		= GetDateFromContext	( Context, "itBegDate"		);
	nDateInt	= DateStrLongToInt	( nDate				);
	kDate		= GetDateFromContext	( Context, "itEndDate"		);
	kDateInt	= DateStrLongToInt	( kDate				);
	// Запросить значение абон.платы
	if ( GetFAFloatConst( UsersPayment, 
		GetIntFromContext( Context, "itC1" ) ) == false ) return( false );

	if ( GetFAFloatConst(	BorderTime, 
		GetIntFromContext( Context, "itC2" ) ) == false ) return( false );

	BorderTime	*= 60;			// перевести в секунды

	// Получить кол-во дней использования услуги в расчетном периоде
	DayCountPeriod	= GetIntFromContext( Context, "ServiceUnionAmmountDays" );

	// Подсчитать абон.плату и лимит времени пропорционально дням.
	CountDayMonth	= GetCountDayMonth	( kDateInt			);
	Period		= SubDate		( nDateInt, kDateInt		);

	if ( DayCountPeriod != -1 ) Period=DayCountPeriod;
	if ( CountDayMonth ! =Period ) {
		UsersPayment	= UsersPayment / CountDayMonth * Period;
		BorderTime	= ( BorderTime / CountDayMonth ) * Period;
		BorderTime	= RoundFloat	( BorderTime, 0			);
	}

	// Запросить константы из параметров алгоритма расчета
	if ( GetFAFloatConst( DayTarif,
		GetIntFromContext( Context, "itC3" ) ) == false ) return( false );

	// Получить курс у.е. на дату расчета
	if ( GetCalcRate( CurrRate ) == false ) return( false );

	// Инициализировать объект доступа к трафику
	itInitTraffic();

	// Получить данные по трафику абонента
	// за определенный интервал времени
	itGetTraffic(Login, nDate, kDate, 0, 0);

	// Если данные о трафике не получены - завершить алгоритм
	if ( itReady() == false ) return( false );

	_sprintf( CostStr,	"%0.3f",	UsersPayment	);
	_sprintf( PeriodStr,	"%0.0f",	Period		);

	PutDetailRecord( "Количество дней в расчетном периоде",
			PeriodStr, " ", " ", " ", " ", " ", " ",
			" ", " ", "", " ", "", " ", " ", " " );
		
	PutDetailRecord( "Тариф Медиум. Ежемесячная абон. плата.",
			" ", " ", " ", " ", CostStr, " ", " ",
			CostStr + "$", " ", "", " ", "", " ", " ", " " );

	//------------------------------------------------------------
	// Подсчет времени в сети
	//------------------------------------------------------------

	// Вычислить кол-во дней в расчетном периоде
	DayCount	= itGetCountDays();
	itFirstDay();
	for( i = 0; i < DayCount; i += 1 ) {
		for( j = 0; j <= 23; j += 1 ) {
			for( k = 0; k < itGetCountAccessType() ; k += 1 ) {
				itSetHour( j );
				itSetAccessType( k );
				if ( Time < BorderTime ) {
					Time += itGetCurForegroundTimeByHour();
					if ( Time > BorderTime )
						DayTime = Time - BorderTime;
				}
				else DayTime += itGetCurForegroundTimeByHour();
			}
		}
		itNextDay();
	}
	DayTime		= RoundFloat	( DayTime / 60,		0 );
	Time		= RoundFloat	( Time/60,		0 );
	BorderTime	= RoundFloat	( BorderTime / 60,	0 );
	if ( Time > BorderTime ) Time = BorderTime;
	_sprintf( TimeStr, "%.0f", Time + DayTime );
	PutDetailRecord( "Время работы в сети (всего):",
			" ", TimeStr, " ", " ", " ", " ", " ",
			" ", " ", " ", " ", " ", " ", " ", " " );

	// Детализация превышения лимита времени
	_sprintf( BorderTimeStr,
		"Время работы в сети свыше %0.0f мин.",
		BorderTime );
	_sprintf( DayTimeStr,		"%0.0f",	DayTime		);
	_sprintf( DayTarifStr,		"%0.4f $",	DayTarif	);
	CostTimeDay	= RoundFloat	( DayTime*DayTarif,	4 	);
	_sprintf( CostTimeDayStr,	"%0.4f $",	CostTimeDay	);

	PutDetailRecord( BorderTimeStr, " ", DayTimeStr,
		" ", " ", DayTarifStr, " ", " ", CostTimeDayStr,
		" ", " ", " ", " ", " ", " ", " " );
			
	// Подсчитать общую сумму в у.е.
	AmountCurrencyAll	= UsersPayment + CostTimeDay;

	// Детализация общего результата
	_sprintf( CurrencyAmountStr,	"%0.4f", AmountCurrencyAll		);
	_sprintf( RubleAmountStr,	"%0.4f", AmountCurrencyAll * CurrRate	);

	PutDetailResult( "Тариф Медиум. Всего:",
		" ", " ", " ", " ", " ", RubleAmountStr, " ",
		CurrencyAmountStr, " ", " ", " ", " ", " ", " ", " " );

	// Запись (сохранение) результата расчета
	SetFloatInContext( 	Context,
				AmountCurrencyAll * CurrRate,
				"itAmountRouble" );
	return( true );
}   
//---------------------- Конец файла --------------------------


Примеры:

 


Подробнее об «ABACS»  


Яндекс.Метрика