В системе есть много участников, между которыми требуется правильно распределить деньги: клиент, который оплачивает услугу; несколько исполнителей, каждый из которых выполняет свою часть работы; сервис, который забирает свою комиссию. В операциях участвуют несколько видов валюты: наличные и безналичные деньги, бонусные баллы двух видов.
Большое количество правил, несколько примеров:
1. Если у исполнителя есть бонусные баллы, то определенную часть комиссии (не всю) он сможет компенсировать этими баллами. То есть у него на руках остается больше наличных денег от клиента, а комиссию он оплачивает баллами (1 к 1).
2. У клиента может быть промокод на скидку N%, но заработок исполнителей не должен уменьшиться. Разницу сервис компенсирует баллами или безналом.
3. Есть дополнительные услуги сервиса, которые клиент оплачивает, а исполнители должны только передать эти деньги сервису. То есть эти деньги не являются комиссией для исполнителей, и это нужно учитывать.
4. Исполнители могут быть назначены сразу на несколько заказов разных клиентов. И если у исполнителя всего 500 баллов, и 400 из них будут списаны после выполнения первого заказа, то при расчете заработка для второго заказа нужно учитывать, что у исполнителя осталось всего 10 баллов.
4. Десятки других подобных правил...
Сейчас это всё реализовано «в лоб» и кое-как работает в продакшене. Любой релиз, затрагивающий финансовую часть, приводит к ошибках. Пришло время рефакторить, бизнес готов переписать систему с нуля.
Как правильно реализовать подобную систему и минимизировать ошибки? Интересуют: ваш собственный опыт решения подобных задач, библиотеки (предпочтительно PHP), паттерны проектирования, фреймворки, статьи, выступления с конференций, которые могут помочь в этом деле или подсказать правильную идею.
Наймите того, кто в этом разбирается. Или сделайте декомпозицию и возвращайтесь сюда с конкретными вопросами (отдельно задаваемыми), а не с полным тех. заданием.