Контекст
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 без создания промежуточных адаптеров.
Требования
-
Калькуляторы должны работать с хешами Manul напрямую
- Не создавать wrapper-классы или адаптеры
- Вычислять
target_rate_percent внутри калькулятора из rate['rate']
-
Маппинг полей
| Старый API (объект) |
Новый API (хеш Manul) |
rate.target_rate_percent |
Вычислять через calculate_rate_commission(rate['rate'], base_rate) |
rate.exchanger_id |
rate['changer_id'] |
-
Обратная совместимость
- Не требуется поддержка старого формата BestChange::Service
- Полный переход на Manul
Файлы для изменения
-
app/services/gera/autorate_calculators/base.rb
- Добавить метод
target_rate_percent(rate) для вычисления комиссии из курса
- Добавить приватный метод
calculate_rate_commission(finite_rate, base_rate)
- Обновить
external_rates_in_target_comission для использования нового метода
-
app/services/gera/autorate_calculators/legacy.rb
- Заменить
rate.target_rate_percent на target_rate_percent(rate)
-
app/services/gera/autorate_calculators/position_aware.rb
- Заменить все
rate.target_rate_percent на target_rate_percent(rate)
- Заменить
rate.exchanger_id на rate['changer_id']
-
app/services/gera/rate_comission_calculator.rb
- Разрешить git-конфликт в пользу делегирования в
autorate_calculator_class
- Удалить дублирующийся код
calculate_rate_commission (будет в Base)
-
Тесты
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: Подготовка
Этап 2: Адаптация Base калькулятора
Этап 3: Адаптация Legacy калькулятора
Этап 4: Адаптация PositionAware калькулятора
Этап 5: Разрешение конфликта
Этап 6: Обновление тестов
Этап 7: Финализация
Acceptance Criteria
Связанные задачи
Результат
PR #90: #90
Сравнение с оригиналом: #91
Контекст
PR #71 (feat: Улучшить алгоритм автокурса) имеет конфликт слияния после влития PR #81 "Use Manul for external rates".
Причина конфликта: PR #71 разрабатывался под старый формат данных
BestChange::Service, который возвращал объекты с методами. После влития PR #81 источник данных изменился на Manul API, который возвращает хеши.Проблема
Калькуляторы автокурса из PR #71 используют API, которого больше нет:
Текущий формат данных Manul:
Техническое задание
Цель
Адаптировать калькуляторы автокурса (
Legacy,PositionAware) для работы с форматом данных Manul API без создания промежуточных адаптеров.Требования
Калькуляторы должны работать с хешами Manul напрямую
target_rate_percentвнутри калькулятора изrate['rate']Маппинг полей
rate.target_rate_percentcalculate_rate_commission(rate['rate'], base_rate)rate.exchanger_idrate['changer_id']Обратная совместимость
Файлы для изменения
app/services/gera/autorate_calculators/base.rbtarget_rate_percent(rate)для вычисления комиссии из курсаcalculate_rate_commission(finite_rate, base_rate)external_rates_in_target_comissionдля использования нового методаapp/services/gera/autorate_calculators/legacy.rbrate.target_rate_percentнаtarget_rate_percent(rate)app/services/gera/autorate_calculators/position_aware.rbrate.target_rate_percentнаtarget_rate_percent(rate)rate.exchanger_idнаrate['changer_id']app/services/gera/rate_comission_calculator.rbautorate_calculator_classcalculate_rate_commission(будет в Base)Тесты
spec/services/gera/autorate_calculators/legacy_spec.rbspec/services/gera/autorate_calculators/position_aware_spec.rbspec/services/gera/autorate_calculators/isolated_spec.rbspec/services/gera/autorate_calculators/standalone_spec.rbПлан реализации
Этап 1: Подготовка
masterЭтап 2: Адаптация Base калькулятора
calculate_rate_commission(finite_rate, base_rate)вBasetarget_rate_percent(rate)вBaseexternal_rates_in_target_comissionвBaseЭтап 3: Адаптация Legacy калькулятора
rate.target_rate_percent→target_rate_percent(rate)Этап 4: Адаптация PositionAware калькулятора
rate.target_rate_percent→target_rate_percent(rate)rate.exchanger_id→rate['changer_id']Этап 5: Разрешение конфликта
rate_comission_calculator.rbпринять версию PR (делегирование в калькулятор)calculate_rate_commissionЭтап 6: Обновление тестов
Этап 7: Финализация
bundle exec rspecbundle exec rubocopAcceptance Criteria
Связанные задачи
Результат
PR #90: #90
Сравнение с оригиналом: #91