Dela notan när en rätt inte delades
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.
| Nivå | Vad den avgör | Gäller |
|---|---|---|
| Utläggets delningstyp | Hur en delad kostnad fördelas: lika, i procent eller efter viktade andelar | Varje post utan namngivna tilldelade |
| Postens tilldelade | Vem som konsumerade denna rad, och i vilken proportion | Endast den raden |
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.
| Rad | Belopp | Asha | Bhavna | Chetan |
|---|---|---|---|---|
| Delade rätter, inga tilldelade | 3 000 kr | 1 000 kr | 1 000 kr | 1 000 kr |
| Skaldjursfat, Asha och Bhavna | 2 000 kr | 1 000 kr | 1 000 kr | 0 kr |
| Delsumma | 5 000 kr | 2 000 kr | 2 000 kr | 1 000 kr |
| Service 5%, efter delsumma | 250 kr | 100 kr | 100 kr | 50 kr |
| Totalt | 5 250 kr | 2 100 kr | 2 100 kr | 1 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.
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.
| Typ | Effekt på den löpande summan | Varför den är en egen typ |
|---|---|---|
TAX | Lägger till | Endast ordval; identiskt med beräkningen |
TIP | Lägger till | Endast ordval; identiskt med beräkningen |
FEE | Lägger till | Endast ordval; identiskt med beräkningen |
DISCOUNT | Drar ifrån | Den 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.
Populära inlägg
- Journalen som håller delade utgifter exakta8 min läsning
- Varför en ändrad utgift måste ange delningen på nytt8 min läsning
- Sex pengabuggar i utgiftsdelning med flera valutor8 min läsning
- Gör upp: reglera gruppens utgifter med färre överföringar5 min läsning
- Dela hyran rättvist med rumskompisar5 min läsning