Когда вы делитесь счётом в HiBill, из рук в руки переходит что-то маленькое, но настоящее. Разделение перестаёт быть вашим. Каждый, кто открывает ссылку, сам решает, что он брал, и сумма рядом с его именем — его собственная: не цифра, которую назначили ему вы, а та, которую он назвал сам.

Оказалось, что это важнее, чем мы думали, — мы поняли это, когда взялись делать обратный путь.
Тупик
До этой недели общий доступ к счёту был дверью в одну сторону. Доступ можно было закрыть, но это убивало только ссылку. Счёт навсегда оставался открытым разделением: настройки разделения скрыты, изменить, как он поделён, нельзя, поделиться снова из самого счёта — тоже. Просто замок, а ключ выброшен.
Никто этого не проектировал. Так выходит само собой, когда «поделиться» и «закрыть доступ» делают двумя положениями одного переключателя и не спрашивают, для чего этот переключатель на самом деле. Закрывая доступ, вы отвечаете на вопрос «могут ли новые люди заявлять свою часть?», но не на вопрос «кому теперь принадлежит разделение?» — а мы молча исходили из того, что второй вопрос снимется сам вместе с первым.
Не снимается.
Две двери, которые выглядят как одна
Представьте очевидное исправление: пусть кнопка «Закрыть доступ» возвращает счёт в прежний вид. Одна кнопка, никаких новых понятий, тупика больше нет.
Мы были в шаге от того, чтобы выпустить именно это. Это неправильно, и причину стоит проговорить.
Отключить ссылку и получить право править доли, которые заявили другие, — разные решения с разной ценой. Первое — уборка: ужин закончился, заявки больше не нужны. Второе меняет то, кто решает, сколько кто должен. Если бы кнопка «Закрыть доступ» делала и то и другое, человек, который просто наводит порядок после ужина, молча получил бы возможность переписать то, что о себе сказали четверо других, — нажав кнопку, которая обещала только отключить URL.

Поэтому дверей две. «Закрыть доступ» отключает ссылку. Вернуть контроль — отдельное действие со своим подтверждением — превращает счёт обратно в обычное разделение, которым управляете вы.

Чего на самом деле стоит «вернуть контроль»
Вот что нам кажется интересным: когда вы забираете разделение себе, ни одна сумма не сдвигается.
Каждый сохраняет то, что заявил. Незаявленный остаток, который неявно лежал на том, кто платил, становится его явной строкой. Позиции из чека остаются. Посчитайте балансы до и после — они совпадут.
Меняются права. Эти суммы перестают быть заявленными лично, а значит, теперь их можете править вы.
Звучит как пустяк — а в этом всё дело. Сумма, которую человек выбрал для себя сам, и сумма, которую назначили ему вы, вызывают разное доверие, даже если это одна и та же цифра. Учёт полезен только потому, что ему верят оба, а вера берётся из понимания, кому что было позволено записать.
Поэтому подтверждение говорит ровно это, а не что-то успокаивающее о том, что ничего не меняется: «Суммы у всех сохранятся, но доли перестанут быть заявленными лично — вы сможете менять чью угодно долю».
Что люди получают взамен
Есть симметрия, которую мы заметили только в процессе.
У доли, заявленной лично, нет кнопок «Подтвердить» и «Отклонить». Да и зачем — нельзя оспорить цифру, которую выбрал сам. Это ваше согласие, уже данное.
Но когда разделение возвращается под ваш контроль, эта логика рушится. Доля больше не то, что человек выбрал сам, — это то, что теперь можете поменять вы. Поэтому, возвращая себе контроль, вы возвращаете кнопки «Подтвердить» и «Отклонить» всем участникам счёта.
Вы получаете право менять их долю. Они получают право сказать ей «нет». Ни одна половина не работает честно без другой, и мы выпустили бы только первую, если бы не стали выяснять, что это изменение на самом деле отнимает у людей.
Один случай, где мы говорим «нет»
Если заявки в сумме больше счёта — двое уверены, что дорогое блюдо брали именно они, — вернуть разделение себе нельзя, пока это не решится.
Мы могли бы подогнать цифры. Уменьшить всё пропорционально или обрезать остаток плательщика до нуля и жить дальше. Оба способа дают счёт, который сходится и при этом тихо искажает то, что сказали люди.
Перебор — это настоящее разногласие между двумя людьми. Решать его нужно между ними, а не арифметической подгонкой, которая прячет конфликт. Поэтому HiBill отказывает, объясняет почему и ждёт.
Общий урок
Мы раз за разом натыкаемся на одно и то же. У функции есть очевидное направление вперёд, кто-то его делает, а обратное остаётся «упражнением для читателя» — не по решению, а просто потому, что никто не спросил.
А потом оказывается, что обратное направление ставит вопрос, на который прямому отвечать не приходилось. Поделиться — это только вопрос «кто это видит?». Перестать делиться — это уже вопрос «кому это теперь принадлежит?», и ответа на него не было в коде, потому что его никогда не было у нас в голове.
Тупик был симптомом. Ошибкой был незаданный вопрос.
Читайте также
Как работает HiBill: простой учёт денег между друзьями — вся модель за одно прочтение: люди, балансы и место общего счёта в ней.
Как разделить счёт на большую компанию без подсчётов за столом — как ссылка для заявок работает со стороны стола, ещё до того, как кто-то вернёт себе контроль.
Открытое разделение счёта — по шагам: как поделиться счётом, закрыть доступ и вернуть разделение себе.