@disSpector

Как правильно добавить операцию переноса средств между счетами пользователя (финансовый калькулятор на Yii2)?

Всем привет.
Пишу что-то вроде финансового калькулятора на Yii2 для себя. Уже написал бОльшую часть функционала, но столкнулся с проблемой при добавлении новой фичи.
Итак, по задумке пользователь может добавлять свои финансовые операции и просматривать их. Для хранения операций в моей БД есть таблица 'operations':

id | user_id | category_id | source_id | sum | name | type | date

Расшифровка:
- category_id - id категории расходов/доходов пользователя (продукты, транспорт и т.д), внешний ключ на таблицу 'category', где есть описание всех категорий,

- source_id - id платежного средства пользователя (банковская карта, кошелек с наличными и т.д.), внешний ключ на таблицу 'sources', где есть описание всех средств,

- type - тип операции, где 1 - это расход, 2 - доход.

Когда пользователь переходит по адресу operation/create, он может создать новую операцию, выбрав ее тип (расход или доход), категорию, платежное средство, сумму, добавить описание и т.д.

Когда пользователь переходит по адресу operation/view, он может просматривать все свои операции, сгруппированные по датам. При щелчке на какую-либо операцию происходит переход к ее редактированию (operation/update).

Всё это работало замечательно, пока я не решил добавить новый тип операций - "перенос средств пользователя между счетами" (когда человек, например, решил снять деньги с карты и положить их в свой кошелек с наличными).

Сначала я решил реализовать это через сценарии Yii-модели (Active Record) Operations. То есть когда на странице operation/create пользователь выбирает пункт "Перенос средств между счетами", аяксом загружается форма, в которой есть поля "Источник 1", "Источник 2" и "Сумма".

При отправке этой формы я думал создавать в одной транзакции 2 операции (списание с одного счета + зачисление на другой счет). При создании этих двух операций проблем нет. Проблемы возникают на странице просмотра операций operation/view, где по логике будут отображены обе. И если пользователь решит обновить одну из них, мне нужно будет найти вторую и обновить ее. Мне показалось, что это не лучший способ.

Тогда я подумал, что, может быть, следует создать новую таблицу - 'transfers', где будут храниться только операции перевода с одного счета на другой. Но тогда возникает другая проблема - когда пользователь будет переходить на страницу просмотра операций operation/view, мне нужно будет отображать данные не только из таблицы 'operations', но и из таблицы 'transfers', сгруппированные по датам. Мне кажется, что такой подход тоже противоречит нормальной архитектуре приложения.

Поделитесь, пожалуйста, своим опытом - как лучше добавить функционал переноса средств между счетами?

Заранее спасибо.
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
myks92
@myks92
Нашёл решение — пометь вопрос ответом!
Пользователь вообще не должен редактировать такие операции. Если это просто учет каких-то финансов - то проблем тут критичных нет. Но если это работа с реальными средствами, то сразу же большая проблема. Представьте себя при взаимодействии с банкоматом. Приходите и редактируете себе баланс с 1 рубля на 1000 рублей)) Ну это будет странно.

Решение:
1. Убрать возможность редактирования вообще. Только + (пополнение) и - (снятие) ну и максимум удалить операцию, но тут надо только админам))
2. То же самое что и первое + добавить новый тип "перевод" и новую колонку transfer_id
При переводе мы вписываем в тип "перевод", а в колонку transfer_id добавляем id платежного средства пользователя (банковская карта, кошелек с наличными и т.д.), внешний ключ на таблицу 'sources', где есть описание всех средств
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы