Возьми ОпСоСа под контроль! Мингулов Денис Хакер, номер #070, стр. 070-126-3 Все точно так же для SMS и MMS - их цена тоже может варьироваться, ведь обычно длинные SMS оплачиваются как несколько коротких. Помни, что данные о длительности звонка на твоем телефоне могут не совпадать с данными оператора, как и твои часы с часами оператора при отслеживании изменения тарифа. Делаем базу данных для тарифа Различаем виды звонков Для всех звонков, совершенных на номера > = strPhoneFirst и < strPhoneLast, будут использоваться соответствующие тарифы. const TInt KStrPhoneLength=32; TInt32 iTariffLen; // всего тарифов поддерживается TInt32 *arrayTariff; // массив тарифов для входящих звонков TBuf<KStrPhoneLength> strPhoneFirst; // первый телефонный номер TBuf<KStrPhoneLength> strPhoneLast; // следующий за последним телефонный номер При таком задании базы можно использовать сокращенные номера, например, +7-902 как strPhoneFirst и +7-903 как strPhoneLast - в это множество попадут все номера от +7-902-000-0000 до +7-902-999-9999. О каждом тарифе по его номеру мы узнаем, какой он - для входящего или исходящего звонка, SMS или MMS. В TInt32 iTariffNum храним номера тарифов верхнего уровня, зависящих от времени. Зависимость от времени TInt32 iTariffCostLen; // длина массива с ценами CTimeTariff *arrayTariffCost; // номера тарифов с ценами В CTimeTariff задается промежуток времени - с днем недели, флагом праздничного дня Для обсчета события из лога надо найти в нашей базе соответствующий времени тариф, проверить, чтобы тип записи подходил нашему событию, и вычислить, во сколько оно нам обошлось. Если же событие лежит на границе тарифов (например, звонок в 23:58 на 10 минут, а с 00:00 начинается льготное время), то надо знать, как оно будет учитываться – по одному тарифу или двум. В некоторых тарифах цена минуты разговора в этом случае не будет меняться до конца звонка. Так что в CTimeTariff также задаем флаг, что делать в такой ситуации. Цены TInt32 iQuant; // единица тарификации - в секундах TInt16 iCostLen; // длина массива с ценами TReal *arrayCost; // массив цен TInt32 iNext; // что делать, если звонок больше: n - кольцо с n-ой (0 - считать с начала, =iCostLen-1 - повторять последнюю) Для SMS достаточно знать стоимость одного сообщения - TInt16 iCost. Кроме того, не забудь, что надо включить в нашу базу абонентскую плату. Особенности подсчета стоимости GPRS К сожалению, у многих операторов очень непростая тарификация GPRS, и со стороны пользователя узнать, сколько было потрачено, можно лишь приблизительно, ведь из логов ты можешь узнать только время начала соединения, длительность и общий трафик - полученный и посланный. А операторы предпочитают делить эту большую сессию на подсессии по 15-20 минут, так как соединение с GPRS может длиться месяцами, если нет никаких проблем. Таким образом, большая сессия из лога телефона в 4 часа 10 минут может быть поделена на 16 подсессий по 15 минут и одну 10-минутную, для каждой из них будет отдельно учтен бесплатный порог и сделано округление. |