dimesum

Startsida / Blogg / Pengar

Pengar

Dela notan när en rätt inte delades

· 9 min läsning ·

Dela en middag på 5 250 kr lika och någon betalar i tysthet 700 kr för en rätt hen aldrig rörde, medan lösningen är ett utlägg med två regler som namnger vem som åt den odelade raden och låter skatten följa konsumtionen.

Dela en middag på 5 250 kr lika och en person betalar 700 kr för mycket. Två av de tre åt skaldjursfatet på 2 000 kr och den tredje gjorde det inte, men en lika delning debiterar alla tre 1 750 kr. Dimesum hanterar den notan som ett enda utlägg: lika högst upp, med raden på 2 000 kr buren enbart av de två som beställde den.

Notor som mestadels delas lika men har en enda odelad rad är det vanligaste en delningsapp ombeds göra, och Dimesums första datamodell kunde inte uttrycka en sådan. Den tidigare designen gjorde ITEMIZED till en delningstyp, ömsesidigt uteslutande med EQUAL, PERCENT och SHARES. En riktig restaurangnota är bådadera på en gång.

Specificering är en detalj på ett utlägg, inte en annan sorts delning

Ett specificerat utlägg i Dimesum är ett vanligt utlägg som råkar bära sina rader. Utlägget behåller allt som utlägg redan har: en totalsumma, deltagare, en delningstyp, en eller flera betalare. Till det lägger det poster, notans rader, och justeringar, alltså skatt, dricks, avgifter och rabatter som trycks under dem.

Två nivåer avgör sedan varenda öre. Utläggets delningstyp fördelar varje rad där ingen är namngiven. En rad med tilldelade bärs av exakt de personerna, och av ingen annan.

De två nivåerna som avgör hur en rad delas, från docs/tech/18-itemized-expenses.md §1.
NivåVad den avgörGäller
Utläggets delningstypHur en delad kostnad fördelas: lika, i procent eller efter viktade andelarVarje post utan namngivna tilldelade
Postens tilldeladeVem som konsumerade denna rad, och i vilken proportionEndast den raden
En rad utan tilldelade fördelas efter utläggets delningstyp; en rad med tilldelade bärs enbart av de personer den namnger NIVÅ 1: INGEN NAMNGIVEN PÅ RADEN Delade rätter 3 000 kr inga tilldelade EQUAL på 3 Asha 1 000 kr Bhavna 1 000 kr Chetan 1 000 kr NIVÅ 2: RADEN NAMNGER VEM SOM ÅT DEN Icke-vegetarisk rätt 2 000 kr tilldelade: Asha, Bhavna dess 2 tilldelade Asha 1 000 kr Bhavna 1 000 kr Chetan 0 kr
De två nivåerna på maten för 5 000 kr. Delade rätter namnger ingen, så EQUAL fördelar dem på tre; skaldjursrätten namnger två personer, så Chetans matdelsumma stannar vid 1 000 kr.

En middag på 5 250 kr där den som åt minst betalar 1 050 kr

Asha, Bhavna och Chetan äter middag, delad lika högst upp. Delade rätter blir 3 000 kr. En skaldjursrätt blir 2 000 kr, och bara Asha och Bhavna åt den. Serviceavgiften är 5%, och Chetan betalade hela 5 250 kr.

Räkneexempel: en nota, två rader, en justering, och andelen var och en bär.
RadBeloppAshaBhavnaChetan
Delade rätter, inga tilldelade3 000 kr1 000 kr1 000 kr1 000 kr
Skaldjursfat, Asha och Bhavna2 000 kr1 000 kr1 000 kr0 kr
Delsumma5 000 kr2 000 kr2 000 kr1 000 kr
Service 5%, efter delsumma250 kr100 kr100 kr50 kr
Totalt5 250 kr2 100 kr2 100 kr1 050 kr

Chetan betalade 5 250 kr och är skyldig 1 050 kr, så han har 4 200 kr till godo: 2 100 kr från Asha och 2 100 kr från Bhavna. Vem som betalade är oberoende av vem som är skyldig. Att betalaren är den som knappt åt ändrar ingen av andelarna, vilket är varför Dimesum håller betalare på utläggsnivå och tilldelade på radnivå.

Skatt följer vad du åt, inte hur många ni är

Chetans andel av serviceavgiften på 250 kr är 50 kr, inte 83,33 kr. Varje justering fördelas i proportion till var och ens delsumma av posterna, så matens fördelning 200:200:100 avgör även fördelningen av serviceavgiften. Att fördela efter antal personer skulle i tysthet debitera Chetan skatt för en rätt han aldrig rörde.

Den som inte beställde något betalar därför ingen skatt och får ingen rabatt. Vikterna är delsummorna före justering snarare än den löpande summan, vilket också hindrar varje justerings avrundning från att byggas in i nästa justerings vikter.

Justeringar tillämpas i ordning, så en rabatt flyttar GST-basen

En nota som lyder "10 000 kr, minus 10%, plus 5% GST" debiterar GST på 9 000 kr, och GST-raden är 450 kr. Byt ordning på de två och GST debiteras på 10 000 kr, vilket ger 500 kr. Justeringar är en ordnad lista, och en procentsats tillämpas på den löpande summan vid sin egen position. Båda ordningarna är riktiga notor, så listan är ordnad snarare än en mängd.

Samma rabatt och GST i två ordningar, som visar basen var och en debiteras på och totalsumman var och en ger Rabatt först GST först Delsumma varor 10 000 kr minus 10% av 10 000 kr rabatt på 1 000 kr 9 000 kr plus 5% GST av 9 000 kr GST på 450 kr 9 450 kr Notans totalsumma 9 450 kr Delsumma varor 10 000 kr plus 5% GST av 10 000 kr GST på 500 kr 10 500 kr minus 10% av 10 500 kr rabatt på 1 050 kr 9 450 kr Notans totalsumma 9 450 kr SAMMA NOTA, FAST RABATT 1 000 kr I STÄLLET FÖR 10% 1 000 kr av, sedan GST 9 450 kr GST, sedan 1 000 kr av 9 500 kr
Två procentsatser landar på samma 9 450 kr eftersom multiplikationen är kommutativ, ändå skiljer sig GST-raden: 450 kr mot 500 kr. Byt den procentuella rabatten mot en fast rabatt på 1 000 kr och totalsummorna skiljer sig också, 9 450 kr mot 9 500 kr. Ordning är aritmetik här, inte presentation.
Varför ordningen lagras explicit

Varje justering bär sin egen position. En ordning som vilade på insättningsordning, eller på att en id-generator förblev monoton, skulle i tysthet ändra vad alla är skyldiga efter en databasåterställning.

Tre valideringar står mellan ett skrivfel och aritmetiken. En pool anger antingen ett fast belopp eller en sats i baspunkter, aldrig båda, eftersom att lagra båda lagrar ett tal och dess egen härledning. Ett negativt belopp avvisas, med ett fel som namnger DISCOUNT som sättet att skriva en minskning. En sats över 100 000 baspunkter avvisas också, ett tak satt långt över de 10 000 baspunkter som betyder 100%, eftersom hundra procent av är en riktig rabatt.

De fyra justeringstyperna i internal/platform/splitcalc, och vad var och en gör med den löpande summan.
TypEffekt på den löpande summanVarför den är en egen typ
TAXLägger tillEndast ordval; identiskt med beräkningen
TIPLägger tillEndast ordval; identiskt med beräkningen
FEELägger tillEndast ordval; identiskt med beräkningen
DISCOUNTDrar ifrånDen enda typen som ändrar aritmetiken, så riktningen kommer från typen och aldrig från ett tecken

Totalsumman kommer från raderna, och en inskriven total är bara en kontrollsumma

En specificerad total är härledd: summan av posterna plus summan av justeringarna. Raderna säger redan vad notan kostar, så en separat angiven total skulle vara en andra sanningskälla som kan motsäga den första. Den som skriver in en nota fel rättar en rad, vilket är där felet faktiskt sitter, och totalen följer. Att rätta en nota som redan är bokförd sker genom en ändring som återger dess uppdelning, så rättelsen landar som en ny version snarare än som en överskrivning.

En klient kan ändå skicka amount_minor, och Dimesum behandlar det då som en kontrollsumma snarare än som svaret. Överensstämmelse betyder att klienten läste samma nota. Oenighet stoppar utlägget innan några pengar rör sig.

En tidigare version lade automatiskt till en "Övrigt"-rad för det som en angiven total inte täckte, och tog bort raden när glappet slöts. Den raden fungerade, och den är borta. Att härleda totalen upplöste problemet som "Övrigt"-raden fanns för att hantera, vilket bara uppstod eftersom totalen angavs två gånger.

Varför EXACT och poster avvisas tillsammans

EXACT namnger varje medlems slutbelopp. Poster härleder varje medlems belopp. Båda på en gång är överbestämt: antingen stämmer de överens, då är den ena överflödig, eller så motsäger de varandra, då har utlägget två svar och ingen regel säger vilket som vinner. Dimesum avvisar kombinationen vid dörren snarare än att lösa den med en företrädesregel som ingen skulle minnas.

EQUAL, PERCENT och SHARES kombineras alla med poster, eftersom var och en är en regel för att dela en delad kostnad snarare än en uppsättning slutbelopp.

Där en rabatt förr tappade ett öre

Varje fördelning använder metoden med största rest, och var och en bevarar sin egen total exakt. Lika fall i den metoden gick förr till lägsta medlems-id, vilket gav gruppens äldsta medlem det extra öret på varje lika delat utlägg; det lika fallet roterar nu på en hash av utläggets id. Delade rader poolas och fördelas en gång snarare än rad för rad, så det udda öret landar inte på samma medlem för varje rad på notan.

Vår apportion-funktion hade en verklig defekt här. Gos heltalsdivision trunkerar mot noll, så en negativ total avrundades åt fel håll och resten delades aldrig ut: −100,00 kr över vikter på 100, 200 och 300 kom tillbaka som −99,99 kr. Ett försvunnet öre skulle ha fått en korrekt rabatterad nota att missa sin egen summakontroll, och användaren skulle ha fått höra att deras aritmetik var fel. Negativa totaler fördelas nu efter storlek och negeras tillbaka.

Skriv in notan som den är tryckt

Skriv in raderna du kan se, namnge dem som åt de rader som inte delades, och lägg till skatt, dricks, avgift och rabatt i den ordning kvittot trycker dem. Dimesum härleder totalen, fördelar varje justering efter vad var och en konsumerade, och håller betalaren utanför. Nästa gång en rätt kostar dubbelt så mycket som allt annat någon beställde, lägg till den som en egen rad med två namn på.

Vanliga frågor

Hur delar man restaurangnotan när en person beställt något dyrt?

Lägg den rätten på en egen rad och namnge personerna som åt den. I Dimesum delas resten av notan fortfarande efter utläggets egen regel, oftast lika, medan den namngivna raden bärs enbart av sina tilldelade. Skatt och service fördelas sedan efter var och ens delsumma, så den som hoppade över rätten betalar mindre av båda.

Ska moms och dricks delas lika eller efter vad var och en beställde?

Efter vad var och en beställde. Dimesum fördelar varje justering i proportion till var och ens delsumma av posterna snarare än efter antal personer. På en middag på 5 250 kr där en person åt mat för 1 000 kr bär den personen 50 kr av en serviceavgift på 250 kr i stället för 83,33 kr. Den som inte beställde något betalar ingen skatt alls.

Påverkar ordningen på rabatt och moms vad notan kostar?

Ja. Justeringar tillämpas i ordning mot en löpande summa, så en nota som lyder "10 000 kr, minus 10%, plus 5% GST" debiterar GST på 9 000 kr och GST-raden blir 450 kr. Sätt GST först och den debiteras på 10 000 kr, vilket ger 500 kr. Med en fast rabatt på 1 000 kr skiljer sig totalerna också, 9 450 kr mot 9 500 kr.

Varför kan man inte använda exakta belopp på en specificerad nota?

EXACT namnger varje persons slutbelopp och poster härleder det, så de två tillsammans ger ett utlägg två svar. Dimesum vägrar kombinationen i stället för att välja en vinnare med en företrädesregel som ingen skulle minnas. EQUAL, PERCENT och SHARES fungerar alla vid sidan av poster, eftersom var och en är en regel för att dela gemensamma rader snarare än en uppsättning slutbelopp.

Måste man skriva in totalsumman på en specificerad nota?

Nej. Dimesum härleder en specificerad total som summan av posterna plus summan av justeringarna, eftersom raderna redan säger vad notan kostar. En total som skickas av en klient kontrolleras som en kontrollsumma, och en avvikelse stoppar utlägget innan pengar rör sig. Att rätta en felaktig siffra betyder att rätta raden den kom från.