Я бы хотел внести предложение об изменении основных параметров, с точки зрения UX, если вы не против ужасно.
Независимо от того, относятся ли его услуги или продукты к группе, иногда этими вещами можно поделиться. Например, закуска или частный / полуприватный сеанс на конференции.
Для таких вещей, как поднос с закусками, подразумевается, что у всех есть доступ, но не обязательно, чтобы у всех он был. Поручить каждому человеку разделить расходы, если, скажем, только 30% участников приняли участие в конфликте, когда дело доходит до разделения счета. Другие группы людей могут не заботиться вообще. Таким образом, с точки зрения алгоритма, вы должны сначала решить, какой из этих трех вариантов будет использоваться, вероятно, для каждого расхода:
Универсальное разбиение
Разделить на тех, кто принимал участие, равномерно
Разделить на пропорцию на участника
Я лично предпочитаю второй в целом, потому что у него есть полезность, чтобы обрабатывать полное владение расходами за расходы, используемые только одним человеком, некоторыми людьми и всей группой в целом. Это также устраняет этический вопрос о пропорциональных различиях с общим обобщением того, что, если вы принимаете участие, вы платите равномерное разделение независимо от того, сколько у вас на самом деле было. В качестве социального элемента я бы рассмотрел кого-то, у кого была «небольшая выборка» чего-то, чтобы просто попробовать, а затем решил, что больше не будет оправданием удалять этого человека из людей, разделяющих расходы.
Итак, small-sampling != partaking
;)
Затем вы берете на себя все расходы и перебираете группу тех, кто принимал участие в этом, и атомарно обрабатывает каждый из этих предметов, и в конце вы получаете общее количество на человека.
Итак, в итоге вы берете свой список расходов и перебираете их с каждым человеком. В конце проверки индивидуальных расходов вы берете людей, которые приняли участие, и применяете равномерное разделение этих расходов к каждому человеку, и обновляете текущее разделение счета каждого участника.
Простите за псевдокод:
list_of_expenses[] = getExpenseList()
list_of_agents_to_charge[] = getParticipantList()
for each expense in list_of_expenses
list_of_partakers[] = getPartakerList(expense)
for each partaker in list_of_partakers
addChargeToAgent(expense.price / list_of_partakers.size, list_of_agents_to_charge[partaker])
Затем просто переберите ваш list_of_agents_to_charge[]
и сообщите каждый итог каждому агенту.
Вы можете добавить поддержку чаевых, просто рассматривая чаевые как дополнительные расходы в своем списке расходов.
Прошу прощения, если я полностью сошел с вас, ОП.
ps: Я бы хотел написать мобильное приложение, чтобы сделать это сейчас xD Вот что я получаю за проверку SO перед уходом с работы ...