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 );
}
//---------------------- Конец файла --------------------------
|