Skip to content

Адаптировать калькуляторы автокурса (PR #71) под формат данных Manul #89

@dapi

Description

@dapi

Контекст

PR #71 (feat: Улучшить алгоритм автокурса) имеет конфликт слияния после влития PR #81 "Use Manul for external rates".

Причина конфликта: PR #71 разрабатывался под старый формат данных BestChange::Service, который возвращал объекты с методами. После влития PR #81 источник данных изменился на Manul API, который возвращает хеши.

Проблема

Калькуляторы автокурса из PR #71 используют API, которого больше нет:

# PositionAware калькулятор ожидает объекты:
rate.target_rate_percent   # ❌ Manul возвращает хеш, не объект
rate.exchanger_id          # ❌ В Manul это rate['changer_id']

Текущий формат данных Manul:

# Gera.manul_client.top_exchangers("305-89") возвращает:
[
  { 'changer_id' => 123, 'changer_name' => 'ExchangerName', 'rate' => '0.95', 'reserve' => '100000.00' },
  { 'changer_id' => 456, 'changer_name' => 'AnotherExchanger', 'rate' => '0.94', 'reserve' => '50000.00' },
  ...
]

Техническое задание

Цель

Адаптировать калькуляторы автокурса (Legacy, PositionAware) для работы с форматом данных Manul API без создания промежуточных адаптеров.

Требования

  1. Калькуляторы должны работать с хешами Manul напрямую

    • Не создавать wrapper-классы или адаптеры
    • Вычислять target_rate_percent внутри калькулятора из rate['rate']
  2. Маппинг полей

    Старый API (объект) Новый API (хеш Manul)
    rate.target_rate_percent Вычислять через calculate_rate_commission(rate['rate'], base_rate)
    rate.exchanger_id rate['changer_id']
  3. Обратная совместимость

    • Не требуется поддержка старого формата BestChange::Service
    • Полный переход на Manul

Файлы для изменения

  1. app/services/gera/autorate_calculators/base.rb

    • Добавить метод target_rate_percent(rate) для вычисления комиссии из курса
    • Добавить приватный метод calculate_rate_commission(finite_rate, base_rate)
    • Обновить external_rates_in_target_comission для использования нового метода
  2. app/services/gera/autorate_calculators/legacy.rb

    • Заменить rate.target_rate_percent на target_rate_percent(rate)
  3. app/services/gera/autorate_calculators/position_aware.rb

    • Заменить все rate.target_rate_percent на target_rate_percent(rate)
    • Заменить rate.exchanger_id на rate['changer_id']
  4. app/services/gera/rate_comission_calculator.rb

    • Разрешить git-конфликт в пользу делегирования в autorate_calculator_class
    • Удалить дублирующийся код calculate_rate_commission (будет в Base)
  5. Тесты

    • spec/services/gera/autorate_calculators/legacy_spec.rb
    • spec/services/gera/autorate_calculators/position_aware_spec.rb
    • spec/services/gera/autorate_calculators/isolated_spec.rb
    • spec/services/gera/autorate_calculators/standalone_spec.rb
    • Обновить mock-данные под формат хешей Manul

План реализации

Этап 1: Подготовка

  • Создать ветку на основе актуального master

Этап 2: Адаптация Base калькулятора

  • Добавить calculate_rate_commission(finite_rate, base_rate) в Base
  • Добавить target_rate_percent(rate) в Base
  • Обновить external_rates_in_target_comission в Base

Этап 3: Адаптация Legacy калькулятора

  • Заменить rate.target_rate_percenttarget_rate_percent(rate)

Этап 4: Адаптация PositionAware калькулятора

  • Заменить все rate.target_rate_percenttarget_rate_percent(rate)
  • Заменить rate.exchanger_idrate['changer_id']

Этап 5: Разрешение конфликта

  • В rate_comission_calculator.rb принять версию PR (делегирование в калькулятор)
  • Удалить дублирующийся calculate_rate_commission

Этап 6: Обновление тестов

  • Обновить фабрики/mock-данные под формат Manul
  • Убедиться что все тесты проходят (440 тестов ✅)

Этап 7: Финализация

Acceptance Criteria

Связанные задачи

Результат

PR #90: #90
Сравнение с оригиналом: #91

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions