dimesum

Home / Blog / Geld

Geld

Een restaurantrekening eerlijk splitten

· 9 min leestijd ·

Verdeel een diner van €525 gelijk en iemand betaalt stil €70 voor een gerecht dat hij nooit aanraakte.

Verdeel een diner van €525 gelijk en één persoon betaalt €70 te veel. Twee van de drie aten de zeevruchtenschotel van €200 en de derde niet, toch rekent een gelijke verdeling alle drie €175 aan. Dimesum behandelt die rekening als één uitgave: gelijk aan de bovenkant, waarbij de regel van €200 alleen wordt gedragen door de twee die hem bestelden.

Grotendeels gelijke rekeningen met één niet-gedeelde regel zijn het meest voorkomende waar een deel-app om wordt gevraagd, en het eerste datamodel van Dimesum kon er geen uitdrukken. Het eerdere ontwerp maakte ITEMIZED een verdeeltype, wederzijds uitsluitend met EQUAL, PERCENT en SHARES. Een echte restaurantrekening is beide tegelijk.

Specificeren is detail op een uitgave, geen ander soort verdeling

Een gespecificeerde uitgave in Dimesum is een gewone uitgave die toevallig haar regels meedraagt. De uitgave houdt alles wat uitgaven al hebben: een totaal, deelnemers, een verdeeltype, één of meerdere betalers. Daaraan voegt ze items toe, de regels van de rekening, en aanpassingen, de belasting, fooi, kosten en kortingen die eronder gedrukt staan.

Twee niveaus bepalen dan elke cent. Het verdeeltype van de uitgave verdeelt elke regel waarop niemand is genoemd. Een regel met toegewezen personen wordt gedragen door precies die personen, en door niemand anders.

De twee niveaus die de verdeling van een regel bepalen, uit docs/tech/18-itemized-expenses.md §1.
NiveauWat het bepaaltVan toepassing op
Verdeeltype van de uitgaveHoe gedeelde kosten worden verdeeld: gelijk, per percentage, of via gewogen aandelenElk item zonder toegewezen personen
Toegewezen personen van een itemWie deze regel heeft geconsumeerd, en in welke verhoudingAlleen die regel
Een regel zonder toegewezen personen wordt verdeeld volgens het verdeeltype van de uitgave; een regel met toegewezen personen wordt alleen gedragen door de personen die hij noemt NIVEAU 1: NIEMAND GENOEMD OP DE REGEL Gedeelde gerechten €300 geen toegewezen personen EQUAL over 3 Asha €100 Bhavna €100 Chetan €100 NIVEAU 2: DE REGEL NOEMT WIE HET AT Niet-vegetarisch gerecht €200 toegewezen: Asha, Bhavna zijn 2 toegewezen personen Asha €100 Bhavna €100 Chetan €0
De twee niveaus op de €500 aan eten. Gedeelde gerechten noemen niemand, dus EQUAL verdeelt ze in drieën; het zeevruchtengerecht noemt twee personen, dus het eten-subtotaal van Chetan stopt bij €100.

Een diner van €525 waar de persoon die het minst at €105 betaalt

Asha, Bhavna en Chetan eten samen, gelijk verdeeld aan de bovenkant. Gedeelde gerechten komen op €300. Een zeevruchtengerecht komt op €200, en alleen Asha en Bhavna aten het. De bediening is 5%, en Chetan betaalde de hele €525.

Uitgewerkt voorbeeld: één rekening, twee regels, één aanpassing, en het aandeel dat elke persoon draagt.
RegelBedragAshaBhavnaChetan
Gedeelde gerechten, geen toegewezen personen€300€100€100€100
Zeevruchtenschotel, Asha en Bhavna€200€100€100€0
Subtotaal€500€200€200€100
Bediening 5%, naar subtotaal€25€10€10€5
Totaal€525€210€210€105

Chetan betaalde €525 en is €105 verschuldigd, dus hij krijgt €420 terug: €210 van Asha en €210 van Bhavna. Wie betaalde staat los van wie verschuldigd is. Dat de betaler de persoon is die nauwelijks at verandert niets aan de aandelen, en daarom houdt Dimesum betalers op uitgaveniveau en toegewezen personen op regelniveau.

Belasting volgt wat je at, niet met hoeveel jullie zijn

Chetans aandeel in de bedieningstoeslag van €25 is €5, niet €8,33. Elke aanpassing wordt toegewezen in verhouding tot ieders item-subtotaal, dus de verdeling 200:200:100 van het eten bepaalt ook de verdeling van de bedieningstoeslag. Toewijzen naar hoofdtelling zou Chetan stilletjes belasting aanrekenen op een gerecht dat hij nooit aanraakte.

Iemand die niets bestelde betaalt daarom geen belasting en ontvangt geen korting. De gewichten zijn de subtotalen vóór aanpassing en niet het lopende totaal, wat ook voorkomt dat de afronding van elke aanpassing doorwerkt in de gewichten van de volgende.

Aanpassingen worden op volgorde toegepast, dus een korting verschuift de GST-grondslag

Een rekening die luidt "€1.000, min 10%, plus 5% GST" rekent GST op €900, en de GST-regel is €45. Draai de twee om en GST wordt op €1.000 gerekend, wat €50 geeft. Aanpassingen vormen een geordende lijst, en een percentage geldt voor het lopende totaal op zijn eigen positie. Beide volgordes zijn echte rekeningen, dus de lijst is geordend en geen verzameling.

Dezelfde korting en GST in twee volgordes, met de grondslag waarop elk wordt gerekend en het totaal dat elk oplevert Korting eerst GST eerst Item-subtotaal €1.000 min 10% van €1.000 korting van €100 €900 plus 5% GST van €900 GST van €45 €945 Rekeningtotaal €945 Item-subtotaal €1.000 plus 5% GST van €1.000 GST van €50 €1.050 min 10% van €1.050 korting van €105 €945 Rekeningtotaal €945 ZELFDE REKENING, VAST €100 KORTING IN PLAATS VAN 10% €100 korting, dan GST €945 GST, dan €100 korting €950
Twee percentages komen op dezelfde €945 uit omdat de vermenigvuldiging commuteert, toch verschilt de GST-regel: €45 tegen €50. Vervang de procentuele korting door een vaste €100 en dan lopen ook de totalen uiteen, €945 tegen €950. Volgorde is hier rekenkunde, geen presentatie.
Waarom de volgorde expliciet wordt opgeslagen

Elke aanpassing draagt haar eigen position. Een ordening die berustte op invoegvolgorde, of op een id-generator die monotoon blijft, zou stilletjes veranderen wat iedereen verschuldigd is na een database-herstel.

Drie validaties staan tussen een typefout en de rekenkunde. Een pool geeft ofwel een vast bedrag ofwel een tarief in basispunten aan, nooit beide, want beide opslaan slaat een getal en zijn eigen afleiding op. Een negatief bedrag wordt geweigerd, met een fout die DISCOUNT noemt als de manier om een verlaging te schrijven. Een tarief boven 100.000 basispunten wordt eveneens geweigerd, een grens ver boven de 10.000 basispunten die 100% betekenen, want honderd procent korting is een echte korting.

De vier soorten aanpassingen in internal/platform/splitcalc, en wat elk doet met het lopende totaal.
SoortEffect op het lopende totaalWaarom het een eigen soort is
TAXTelt opAlleen bewoording; identiek aan de berekening
TIPTelt opAlleen bewoording; identiek aan de berekening
FEETelt opAlleen bewoording; identiek aan de berekening
DISCOUNTTrekt afDe enige soort die de rekenkunde verandert, dus de richting komt van de soort en nooit van een teken

Het totaal komt van de regels, en een ingetypt totaal is slechts een controlegetal

Een gespecificeerd totaal is afgeleid: de som van de items plus de som van de aanpassingen. De regels zeggen al wat de rekening kost, dus een apart vermeld totaal zou een tweede bron van waarheid zijn die kan afwijken van de eerste. Iemand die een rekening verkeerd invoert corrigeert een regel, waar de fout werkelijk zit, en het totaal volgt. Een rekening corrigeren die al is geboekt gaat via een bewerking die de verdeling opnieuw vaststelt, dus de correctie landt als een nieuwe versie in plaats van als een overschrijving.

Een client kan nog steeds amount_minor sturen, en Dimesum behandelt het dan als een controlegetal in plaats van als het antwoord. Overeenstemming betekent dat de client dezelfde rekening las. Onenigheid stopt de uitgave voordat er geld beweegt.

Een eerdere versie voegde automatisch een regel "Overig" toe voor alles wat een vermeld totaal niet verantwoordde, en verwijderde de regel wanneer het verschil sloot. Die regel werkte, en hij is weg. Het afleiden van het totaal loste het probleem op dat de regel "Overig" beheerde, dat alleen ontstond doordat het totaal twee keer werd vermeld.

Waarom EXACT en items samen worden geweigerd

EXACT noemt het eindbedrag van elk lid. Items leiden het bedrag van elk lid af. Beide tegelijk is overbepaald: ofwel komen ze overeen, in welk geval er één overbodig is, ofwel wijken ze af, in welk geval de uitgave twee antwoorden heeft en geen regel zegt welke wint. Dimesum weigert de combinatie aan de deur in plaats van haar te beslechten met een voorrangsregel die niemand zou onthouden.

EQUAL, PERCENT en SHARES combineren allemaal met items, want elk is een regel voor het verdelen van gedeelde kosten en geen set eindbedragen.

Waar een korting vroeger een cent verloor

Elke toewijzing gebruikt de methode van het grootste restant, en elke behoudt haar eigen totaal exact. Gelijke standen in die methode gingen vroeger naar het laagste lid-id, wat het oudste lid van de groep de extra cent gaf bij elke gelijk verdeelde uitgave; de gelijke stand roteert nu op een hash van het uitgave-id. Gedeelde regels worden samengevoegd en één keer verdeeld in plaats van regel voor regel, zodat de losse cent niet bij elke regel van de rekening op hetzelfde lid landt.

Onze functie apportion had hier een echt gebrek. De gehele-getaldeling van Go kapt af richting nul, dus een negatief totaal werd de verkeerde kant op afgerond en het restant werd nooit uitgedeeld: −€10,00 over gewichten van 100, 200 en 300 kwam terug als −€9,99. Een verdwenen cent zou een correcte rekening met korting zijn eigen somcontrole hebben laten falen, en de gebruiker zou zijn verteld dat zijn rekenkunde fout was. Negatieve totalen worden nu naar grootte toegewezen en teruggenegeerd.

Voer de rekening in zoals hij is afgedrukt

Typ de regels die je ziet, noem de personen die de niet-gedeelde regels aten, en voeg de belasting, fooi, kosten en korting toe in de volgorde waarin de bon ze afdrukt. Dimesum leidt het totaal af, wijst elke aanpassing toe naar wat elke persoon consumeerde, en laat de betaler erbuiten. De volgende keer dat één gerecht twee keer zoveel kost als wat de rest bestelde, voeg je het toe als een eigen regel met twee namen erop.

Veelgestelde vragen

Hoe verdeel je een restaurantrekening als iemand iets duurs heeft besteld?

Zet dat gerecht op een eigen regel en noem de personen die het aten. In Dimesum wordt de rest van de rekening nog steeds verdeeld volgens de eigen regel van de uitgave, meestal gelijk, terwijl de genoemde regel alleen door zijn toegewezen personen wordt gedragen. Belasting en bediening worden daarna toegewezen naar ieders subtotaal, dus wie het gerecht oversloeg betaalt van beide minder.

Moeten belasting en fooi gelijk worden verdeeld of naar wat elke persoon bestelde?

Naar wat elke persoon bestelde. Dimesum wijst elke aanpassing toe in verhouding tot ieders item-subtotaal in plaats van naar hoofdtelling. Bij een diner van €525 waar één persoon voor €100 at, draagt die persoon €5 van een bedieningstoeslag van €25 in plaats van €8,33. Wie niets bestelde betaalt helemaal geen belasting.

Verandert de volgorde van een korting en een belasting wat de rekening kost?

Ja. Aanpassingen worden op volgorde toegepast op een lopend totaal, dus een rekening die luidt "€1.000, min 10%, plus 5% GST" rekent de GST op €900 en de GST-regel is €45. Zet de GST eerst en hij wordt op €1.000 gerekend, wat €50 geeft. Bij een vaste korting van €100 verschillen de totalen eveneens, €945 tegen €950.

Waarom kun je geen exacte bedragen gebruiken op een gespecificeerde rekening?

EXACT noemt het eindbedrag van elke persoon en items leiden het af, dus de twee samen geven één uitgave twee antwoorden. Dimesum weigert de combinatie in plaats van een winnaar te kiezen met een voorrangsregel die niemand zou onthouden. EQUAL, PERCENT en SHARES werken allemaal naast items, want elk is een regel voor het verdelen van gedeelde regels en geen set eindbedragen.

Moet je het totaal van een gespecificeerde rekening intypen?

Nee. Dimesum leidt een gespecificeerd totaal af als de som van de items plus de som van de aanpassingen, want de regels zeggen al wat de rekening kost. Een totaal dat door een client wordt gestuurd wordt gecontroleerd als een controlegetal, en een verschil stopt de uitgave voordat er geld beweegt. Een verkeerd getal corrigeren betekent de regel corrigeren waar het vandaan kwam.