При решении задачи были выделены следующие сущности:
- CallDataRecord - класс, отвечающий за временное хранение CDR, прочитанного из строки
- Call - класс, отвечающий за хранение итоговых данных вызова (продолжительность, стоимость и тд.)
- CallType - тип тарифа (входящий/исходящий)
- Tariff - тариф и его наследники - разные виды тарифов. Все классы-тарифы переопределяют метод для вычисления стоимости одного звонка. Также тариф может иметь фиксированную стоимость
- Subscriber - класс абонента, содержит номер, тариф и отсортированное множество звонков. Отвечает за вычисление стоимости звонков конкретного абонента по его тарифу
- ReportBuilder - собиратель отчетов
Основной идеей решения является то, что все вызовы абонента производятся по одному тарифу, следовательно, можно не смотреть на тариф в каждом CDR, а сразу присвоить нужный тариф абоненту и вычислять стоимость звонков по нему. Главным преимуществом такого решения является расширяемость - чтобы добавить новый тариф, нужно просто создать новый класс и указать индекс тарифа в фабричном методе в классе Tariff
- Парсинг файла с CDR в коллекцию абонентов
- Чтение очередной строки с CDR
- Создание абонента, если его еще не было
- Расчет стоимости по тарифу и добавление данных о вызове абоненту
- Создание отчета для каждого абонента
CDR - сall data record - формат файла, содержащего в себе информацию о времени, стоимости и типа вызова абонента.
В зависимости от вендора, cdr может быть в разном формате, но всегда содержит следующие данные:
- номер абонента (все номера сгенерированы. все совпадения случайны)
- тип вызова (01 - исходящие, 02 - входящие)
- дата и время начала звонка (YYYYMMDDHH24MMSS)
- дата и время окончания звонка
- тип тарифа (см. ниже)
Вот пример готовой записи cdr:
02, 79876543221, 20230321160455, 20230321163211, 11
300 минут - за тарифный период* стоят фиксированную сумму - 100р. Каждая последующая минута - 1р.
*Тарифным периодом будем считать все звонки совершенные в текущей выгрузке.
1 минута разговора - 1.5 рубля.
Входящие - бесплатно, исходящие - первые 100 минут по 0.5р/минута, после по тарифу "поминутный".
Конечная задача будет протарифицировать абонентов: т.е. сгенерировать файл отчета для каждого абонента, содержащий в себе номер, индекс тарифа, все совершенные звонки в календарном порядке с выпиской их стоимости по тарифу (для безлимита первые 300 минут - 0р, а с 301 уже расчет), продолжительность звонка, итоговая сумма списания.
Для реализации функционала разрешается использовать только средства стандартной библиотеки java (JDK 11). Система сборки - maven. Приложение должно содержать рабочий метод main() для запуска генератора отчетов. Отчеты собирать в директорию reports в корневой папке проекта.