Partager une addition quand un plat n'a pas été partagé
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.
| Niveau | Ce qu'il décide | S'applique à |
|---|---|---|
| Type de partage de la dépense | Comment un coût partagé se divise : à parts égales, par pourcentage ou par parts pondérées | Chaque article sans affectataire nommé |
| Affectataires de l'article | Qui a consommé cette ligne, et dans quelle proportion | Cette ligne uniquement |
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 €.
| Ligne | Montant | Asha | Bhavna | Chetan |
|---|---|---|---|---|
| Plats partagés, aucun affectataire | 300 € | 100 € | 100 € | 100 € |
| Plateau de fruits de mer, Asha et Bhavna | 200 € | 100 € | 100 € | 0 € |
| Sous-total | 500 € | 200 € | 200 € | 100 € |
| Service 5 %, au prorata du sous-total | 25 € | 10 € | 10 € | 5 € |
| Total | 525 € | 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.
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.
| Type | Effet sur le total courant | Pourquoi c'est un type à part entière |
|---|---|---|
TAX | Ajoute | Formulation seulement ; identique au calcul |
TIP | Ajoute | Formulation seulement ; identique au calcul |
FEE | Ajoute | Formulation seulement ; identique au calcul |
DISCOUNT | Soustrait | Le 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.
Articles populaires
- Le grand livre append-only qui garde les soldes exacts9 min de lecture
- Modifier une dépense partagée doit redéfinir le partage9 min de lecture
- Six bugs de devises dans le partage de dépenses10 min de lecture
- Solder les comptes d'un groupe en moins de virements5 min de lecture
- Partager le loyer équitablement entre colocataires6 min de lecture