Skip to content

foxeg/test_calculator

Repository files navigation

Описание

Калькулятор доходности по займу. Описание начальных условий: Инвестор дает деньги в заём четырем заёмщикам на полгода. Ожидаемая доходность инвестора – 30% годовых Фактическая доходность считается по историческим данным. Пример исторических данных приведен в прилагаемой таблице.

Описание вкладок таблицы. На вкладке итого приведены формулы для расчета ожидаемой и исторической доходности. На вкладках ЮЛ1-ЮЛ3 собраны исторические данные по выплатам трех ЮЛ-заёмщиков. ЮЛ1 осуществлял выплаты вовремя. ЮЛ2 осуществил полное досрочное погашение в четвертом месяце. ЮЛ3 платил вовремя первые два месяца, а потом стал допускать просрочки.

Задача

  1. Разработать структуру базы данных для хранения исторических данных
  2. Реализовать web-страницу калькулятор, считающую доход инвестора при вложении любой суммы. Калькулятор считает ожидаемую и историческую доходность. Ожидаемая доходность 30%, а фактическая считается по историческим данным из базы.
  3. Быть готовым внести исторические данные по ЮЛ4

Тестовые данные в spec/test_calculator.xlsx

Удачи.

Ход решения

Калькулятор для расчёта задолженности реализован в качестве личного кабинета инвестора (использовал заготовки своего прототипа ЛК, который писал для Рево + вы используте bootstrap и визуально будет привычн). Создание Investor имитирует логин в ЛК, удаление - logout Поскольку сам инвестор является пользователем системы, то список компаний заёмщиков (Lendee) для него предустановлен (db:seed, в реальной системе поидее редактируется в админке администратором). После входа в ЛК пользователю предлагается проинвестировать деньги, заполнив для этого параметры пакета инвестиций. Модель данных пакета строил следующим образом:

  • у всех инвестиций есть фиксированный параметр - срок инвестиции (иначе не ясно как считать общую доходность), его отнес к модели InvestmentPackage
  • несмотря на то, что у всех инвестиций сумма 1000000, предположил, что в общем случаем она может меняться в зависимости от компании, как и ставки (хотя их можно было вынести с Lendee, как рисковые параметры компаний на текущий момент, решил поместить в Investment, поскольку задача стоит сделать калькулятор - калькулятор часто используют для проверки разных вариантов и подбора оптимального [можно "поиграться"]) - эти параметры идут в модель Investment
  • инвестировать внутри одного пакета можно только в одну компанию (иначе сумми) и хотя бы в одну компанию - это определяют валидации на связь с Lendee
  • далее необходимо логировать плановые и фактические платежи по погашению инвестиции, здесь была создана модель InvestmentPlanFact. Разбиение одного платежа на principal, interest и payment задумано для фиксации начального расчета биллинга (боль от текущего проекта, слепок расчетов по займу и переменные, на основе которых делался расчет, сохраняем, поскольку потом они часто меняются и "пересчитать" не получается), также была идей раскладывать фактический платёж, но для автоматизации этого не хватает, например, дат внесения платежа, и вообще это уже совсем глубоко в биллинг уходит. Отдельное внимание стоит уделить формату полей decimal scale: 2, который используется, чтобы не возникало дробных копеек. Неокруленные суммы после расчета подкнимаются вверх до копеек, чтобы последний платёж был меньше (мы у себя в системе также иногда используем округление до 10ков, 100ых, чтобы платежи были удобными для клиенитов, у нас это несколько корректирует плановую ставку, потому что меняется денежный поток)
  • после внесения информации обо всех фактических платежах инвестиция меняет статус на "оплачена" и тогда по ней можно расчитать фактическую доходность (имитация реальной системы: пользователь следит за тем, как его инвестиции возвращаются) Пару слов по поводу вёрстки - изначально была идея сделать mobile friendly, но как только закопался с нюансами валидаций nested attributes бросил эту затею :) Тесты. Тестами покрыл самый важны минимум - расчёт доходности и методы расчёта просрочки и досрочного гашения. Из интересного, с чем столкнулся во время решения
  • долго пытался стандартными валидацими создать пакет инвестиций и не дать ему содержать несколько инвестиций от одной компании, в итоге проверяю в контроллере
  • восстановил и систематизировал свои знания по части locales, factory_girl, rspec, nested_attribues, bootstrap
  • было приятно осознавать, как набитые за время работы шишки, помогают проектировать систему так, чтобы заранее не допускать боли в дальнейшем
  • убедился окончательно, что люблю работать по ночам :) Благодарю за опыт

Е

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published