dimesum

Accueil / Blog / Argent

Argent

Partager une addition quand un plat n'a pas été partagé

· 10 min de lecture ·

Diviser un dîner de 525 € à parts égales fait payer à une personne 70 € pour un plat qu'elle n'a jamais touché, et la solution tient en une dépense avec deux règles.

Divisez un dîner de 525 € à parts égales et une personne paie 70 € de trop. Deux des trois convives ont mangé le plateau de fruits de mer à 200 € et le troisième non, pourtant un partage égal facture 175 € à chacun. Dimesum traite cette addition comme une seule dépense : égalité au sommet, la ligne de 200 € étant portée uniquement par les deux qui l'ont commandée.

Les additions presque égales avec une seule ligne non partagée sont la demande la plus courante faite à une application de partage, et le premier modèle de données de Dimesum ne savait pas l'exprimer. La conception antérieure faisait de ITEMIZED un type de partage, mutuellement exclusif avec EQUAL, PERCENT et SHARES. Une vraie addition de restaurant est les deux à la fois.

Le détail est une précision sur la dépense, pas un autre type de partage

Une dépense détaillée dans Dimesum est une dépense ordinaire qui porte simplement ses lignes. La dépense garde tout ce que les dépenses ont déjà : un total, des participants, un type de partage, un ou plusieurs payeurs. Elle y ajoute les articles, les lignes de l'addition, et les ajustements, soit la taxe, le pourboire, les frais et les remises inscrits en dessous.

Deux niveaux décident ensuite chaque centime. Le type de partage de la dépense divise toute ligne où personne n'est nommé. Une ligne avec des affectataires est portée exactement par ces personnes, et par personne d'autre.

Les deux niveaux qui décident le partage d'une ligne, d'après docs/tech/18-itemized-expenses.md §1.
NiveauCe qu'il décideS'applique à
Type de partage de la dépenseComment un coût partagé se divise : à parts égales, par pourcentage ou par parts pondéréesChaque article sans affectataire nommé
Affectataires de l'articleQui a consommé cette ligne, et dans quelle proportionCette ligne uniquement
Une ligne sans affectataire se divise selon le type de partage de la dépense ; une ligne avec affectataires est portée uniquement par les personnes qu'elle nomme NIVEAU 1 : PERSONNE N'EST NOMMÉ SUR LA LIGNE Plats partagés 300 € aucun affectataire EQUAL sur 3 Asha 100 € Bhavna 100 € Chetan 100 € NIVEAU 2 : LA LIGNE NOMME QUI L'A MANGÉ Plat non végétarien 200 € affectataires : Asha, Bhavna ses 2 affectataires Asha 100 € Bhavna 100 € Chetan 0 €
Les deux niveaux sur les 500 € de nourriture. Les plats partagés ne nomment personne, donc EQUAL les divise en trois ; le plat de fruits de mer nomme deux personnes, donc le sous-total nourriture de Chetan s'arrête à 100 €.

Un dîner de 525 € où la personne qui a le moins mangé paie 105 €

Asha, Bhavna et Chetan dînent, partage égal au sommet. Les plats partagés reviennent à 300 €. Un plat de fruits de mer revient à 200 €, et seuls Asha et Bhavna en ont mangé. Le service est de 5 %, et Chetan a payé la totalité des 525 €.

Exemple chiffré : une addition, deux lignes, un ajustement, et la part que chacun porte.
LigneMontantAshaBhavnaChetan
Plats partagés, aucun affectataire300 €100 €100 €100 €
Plateau de fruits de mer, Asha et Bhavna200 €100 €100 €0 €
Sous-total500 €200 €200 €100 €
Service 5 %, au prorata du sous-total25 €10 €10 €5 €
Total525 €210 €210 €105 €

Chetan a payé 525 € et doit 105 €, il lui revient donc 420 € : 210 € d'Asha et 210 € de Bhavna. Qui a payé est indépendant de qui doit. Le fait que le payeur soit la personne qui a à peine mangé ne change aucune des parts, et c'est pourquoi Dimesum garde les payeurs au niveau de la dépense et les affectataires au niveau de la ligne.

La taxe suit ce que vous avez mangé, pas votre nombre

La part de Chetan sur les 25 € de service est de 5 €, pas de 8,33 €. Chaque ajustement se répartit au prorata du sous-total d'articles de chacun, donc la répartition 200:200:100 de la nourriture décide aussi celle du service. Répartir par tête ferait discrètement payer à Chetan une taxe sur un plat auquel il n'a jamais touché.

Une personne qui n'a rien commandé ne paie donc aucune taxe et ne reçoit aucune remise. Les poids sont les sous-totaux avant ajustement plutôt que le total courant, ce qui empêche aussi l'arrondi de chaque ajustement de se répercuter dans les poids du suivant.

Les ajustements s'appliquent dans l'ordre, donc une remise déplace la base de TVA

Une addition indiquant « 1 000 €, moins 10 %, plus 5 % de TVA » facture la TVA sur 900 €, et la ligne de TVA est de 45 €. Inversez les deux et la TVA est facturée sur 1 000 €, soit 50 €. Les ajustements forment une liste ordonnée, et un pourcentage s'applique au total courant à sa propre position. Les deux ordres sont de vraies additions, donc la liste est ordonnée plutôt qu'un ensemble.

La même remise et la même TVA dans deux ordres, montrant la base facturée dans chaque cas et le total obtenu Remise d'abord TVA d'abord Sous-total d'articles 1 000 € moins 10 % de 1 000 € remise de 100 € 900 € plus 5 % de TVA sur 900 € TVA de 45 € 945 € Total de l'addition 945 € Sous-total d'articles 1 000 € plus 5 % de TVA sur 1 000 € TVA de 50 € 1 050 € moins 10 % de 1 050 € remise de 105 € 945 € Total de l'addition 945 € MÊME ADDITION, 100 € FIXES DE REMISE AU LIEU DE 10 % 100 € de remise, puis TVA 945 € TVA, puis 100 € de remise 950 €
Deux pourcentages aboutissent au même 945 € car la multiplication est commutative, pourtant la ligne de TVA diffère : 45 € contre 50 €. Remplacez la remise en pourcentage par 100 € fixes et les totaux se séparent aussi, 945 € contre 950 €. Ici l'ordre relève de l'arithmétique, pas de la présentation.
Pourquoi l'ordre est stocké explicitement

Chaque ajustement porte sa propre position. Un ordre reposant sur l'ordre d'insertion, ou sur un générateur d'identifiants restant monotone, changerait discrètement ce que chacun doit après une restauration de base de données.

Trois validations se dressent entre une faute de frappe et l'arithmétique. Un pool indique soit un montant fixe, soit un taux en points de base, jamais les deux, car stocker les deux revient à stocker un nombre et sa propre dérivation. Un montant négatif est refusé, avec une erreur désignant DISCOUNT comme la manière d'écrire une réduction. Un taux supérieur à 100 000 points de base est également refusé, un plafond fixé bien au-dessus des 10 000 points de base qui valent 100 %, car cent pour cent de remise est une vraie remise.

Les quatre types d'ajustement dans internal/platform/splitcalc, et l'effet de chacun sur le total courant.
TypeEffet sur le total courantPourquoi c'est un type à part entière
TAXAjouteFormulation seulement ; identique au calcul
TIPAjouteFormulation seulement ; identique au calcul
FEEAjouteFormulation seulement ; identique au calcul
DISCOUNTSoustraitLe seul type qui change l'arithmétique, donc le sens vient du type et jamais d'un signe

Le total vient des lignes, et un total saisi n'est qu'une somme de contrôle

Un total détaillé est dérivé : la somme des articles plus la somme des ajustements. Les lignes disent déjà ce que coûte l'addition, donc un total indiqué séparément serait une seconde source de vérité pouvant contredire la première. Celui qui saisit mal une addition corrige une ligne, là où se trouve réellement l'erreur, et le total suit. Corriger une addition déjà enregistrée passe par une modification qui reformule son partage, de sorte que la correction arrive comme une nouvelle version plutôt que comme un écrasement.

Un client peut tout de même envoyer amount_minor, et Dimesum le traite alors comme une somme de contrôle plutôt que comme la réponse. Un accord signifie que le client a lu la même addition. Un désaccord arrête la dépense avant qu'aucun argent ne bouge.

Une version antérieure ajoutait automatiquement une ligne « Autre » pour tout ce qu'un total indiqué n'expliquait pas, et retirait la ligne quand l'écart se refermait. Cette ligne fonctionnait, et elle a disparu. Dériver le total a dissous le problème que la ligne « Autre » servait à gérer, un problème qui ne surgissait que parce que le total était indiqué deux fois.

Pourquoi EXACT et les articles sont refusés ensemble

EXACT nomme le montant final de chaque membre. Les articles dérivent le montant de chaque membre. Les deux à la fois sont surdéterminés : soit ils concordent, auquel cas l'un est redondant, soit ils divergent, auquel cas la dépense a deux réponses et aucune règle ne dit laquelle l'emporte. Dimesum refuse la combinaison dès l'entrée plutôt que de la trancher avec une règle de priorité que personne ne retiendrait.

EQUAL, PERCENT et SHARES se combinent tous avec les articles, car chacun est une règle pour diviser un coût partagé plutôt qu'un ensemble de montants finaux.

Là où une remise perdait autrefois un centime

Chaque répartition utilise la méthode du plus fort reste, et chacune conserve exactement son propre total. Les égalités dans cette méthode allaient autrefois au plus petit identifiant de membre, ce qui remettait au membre le plus ancien du groupe le centime supplémentaire sur chaque dépense partagée à parts égales ; l'égalité pivote désormais sur un hachage de l'identifiant de la dépense. Les lignes partagées sont regroupées et divisées une seule fois plutôt que ligne par ligne, de sorte que le centime en trop ne retombe pas sur le même membre pour chaque ligne de l'addition.

Notre fonction apportion avait ici un vrai défaut. La division entière de Go tronque vers zéro, donc un total négatif était arrondi du mauvais côté et le reliquat n'était jamais distribué : −10,00 € répartis sur des poids de 100, 200 et 300 revenaient à −9,99 €. Un centime disparu aurait fait échouer une addition remisée pourtant correcte à sa propre vérification de somme, et l'on aurait dit à l'utilisateur que son calcul était faux. Les totaux négatifs sont désormais répartis par magnitude puis leur signe négatif est rétabli.

Saisissez l'addition telle qu'elle est imprimée

Saisissez les lignes que vous voyez, nommez les personnes qui ont mangé celles qui n'étaient pas partagées, et ajoutez la taxe, le pourboire, les frais et la remise dans l'ordre où le ticket les imprime. Dimesum dérive le total, répartit chaque ajustement selon ce que chacun a consommé, et laisse le payeur en dehors de tout cela. La prochaine fois qu'un plat coûte deux fois plus que ce que les autres ont commandé, ajoutez-le comme sa propre ligne avec deux noms dessus.

Questions fréquentes

Comment partager une addition quand une personne a commandé un plat cher ?

Mettez ce plat sur sa propre ligne et nommez les personnes qui l'ont mangé. Dans Dimesum, le reste de l'addition se divise toujours selon la règle propre à la dépense, souvent à parts égales, tandis que la ligne nommée est portée uniquement par ses affectataires. La taxe et le service se répartissent ensuite selon le sous-total de chacun, donc celui qui a évité le plat paie moins des deux.

Faut-il partager la taxe et le pourboire à parts égales ou selon ce que chacun a commandé ?

Selon ce que chacun a commandé. Dimesum répartit chaque ajustement au prorata du sous-total d'articles de chacun plutôt que par tête. Dans un dîner de 525 € où une personne a mangé pour 100 € de nourriture, cette personne porte 5 € d'un service de 25 € au lieu de 8,33 €. Quiconque n'a rien commandé ne paie aucune taxe.

L'ordre d'une remise et d'une taxe change-t-il le montant de l'addition ?

Oui. Les ajustements s'appliquent dans l'ordre sur un total courant, donc une addition indiquant « 1 000 €, moins 10 %, plus 5 % de TVA » facture la TVA sur 900 € et la ligne de TVA est de 45 €. Placez la TVA en premier et elle est facturée sur 1 000 €, soit 50 €. Avec une remise fixe de 100 €, les totaux diffèrent aussi, 945 € contre 950 €.

Peut-on utiliser des montants exacts sur une addition détaillée ?

EXACT nomme le montant final de chaque personne et les articles le dérivent, donc les deux ensemble donnent deux réponses à une même dépense. Dimesum refuse la combinaison plutôt que de désigner un gagnant avec une règle de priorité que personne ne retiendrait. EQUAL, PERCENT et SHARES fonctionnent tous aux côtés des articles, car chacun est une règle pour diviser des lignes partagées plutôt qu'un ensemble de montants finaux.

Faut-il saisir le total d'une addition détaillée ?

Non. Dimesum dérive un total détaillé comme la somme des articles plus la somme des ajustements, car les lignes disent déjà ce que coûte l'addition. Un total envoyé par un client est vérifié comme une somme de contrôle, et un écart arrête la dépense avant que l'argent ne bouge. Corriger un chiffre erroné, c'est corriger la ligne dont il provient.