Я робив приблизно як описав adubovskoy, хоча, коли я починав робити, він мені те ж саме і порадив. Тільки у мене сутність містить поля. Можна ще полегшити варіант. Тупо поле з json зробити. Найспритніший варіант - своя таблиця, але тут взагалі повністю код, ніяких КЛІКАНІЙ. Свої UI писати і т.д.
У моєму варіанті за порадою adubovskoy, але з полями суть така, я взяв:
Потім я створив сутність "Транзакція", яка мала такі поля:
- Тип транзакції (0 - віднімання, 1 - поповнення - селект текстовий).
- Сума транзакції (decimal).
- Зв'язок з користувачем (entityreference), до кого прив'язана транзакція.
- Опис транзакції (для призначених для користувача інтерфейсів).
- Технічний опис (для адміна і т.д. бачить тільки адмін).
- І чекбокс "Реальний платіж". Ні на що не впливає, просто зробили, щоб відрізняти то що поповнено з адмінки, а що прийшло, припустимо, з Яндекс.Деньги.
Далі сума щита дуже просто. Робимо запит і смикаємо всі транзакції користувача. Вважаємо суму цих транзакцій і отримуємо поточний баланс.
Для оптимізації, думаю, має сенс кешувати баланс. І повісити якийсь хук на оновлення \ додавання нової транзакції і скидати кеш балансу у користувача до якого транзакція відноситься, щоб у нього вона оновилася.
Для перекладу між користувачами зробити формочку, сума і кому. І виконувати транзакцію. Загалом тут взагалі найлегша частина.