dimesum

Forside / Blog / Penge

Penge

Del regningen når én ret ikke blev delt

· 8 min læsning ·

Del en middag til 3.675 kr ligeligt, og én person betaler i stilhed 490 kr for en ret de aldrig rørte, og løsningen er én udgift med to regler, navngiv hvem der spiste den udelte linje, og lad skatten følge forbruget.

Del en middag til 3.675 kr ligeligt, og én person betaler 490 kr for meget. To af de tre spiste havplatten til 1.400 kr, og den tredje gjorde ikke, men en ligelig deling opkræver alle tre 1.225 kr. Dimesum håndterer den regning som én udgift: ligeligt i toppen, med linjen på 1.400 kr båret kun af de to der bestilte den.

Regninger der næsten er ligelige med én udelt linje er det mest almindelige en delingsapp bliver bedt om, og Dimesums første datamodel kunne ikke udtrykke sådan en. Det tidligere design gjorde ITEMIZED til en delingstype, gensidigt udelukkende med EQUAL, PERCENT og SHARES. En rigtig restaurantregning er begge dele på én gang.

At specificere er en detalje på en udgift, ikke en anden slags deling

En specificeret udgift i Dimesum er en almindelig udgift der tilfældigvis bærer sine linjer. Udgiften beholder alt hvad udgifter allerede har: en total, deltagere, en delingstype, en eller flere betalere. Til det føjer den varelinjer, regningens linjer, og justeringer, momsen, drikkepengene, gebyrerne og rabatterne der står trykt under dem.

To niveauer afgør så hver øre. Udgiftens delingstype deler enhver linje uden nogen navngivet på den. En linje med tildelte bæres af præcis de personer og af ingen andre.

De to niveauer der afgør en linjes deling, fra docs/tech/18-itemized-expenses.md §1.
NiveauHvad det afgørGælder for
Udgiftens delingstypeHvordan en delt omkostning deles: ligeligt, efter procent eller efter vægtede andeleHver vare uden nogen tildelt navngivet
Vares tildelteHvem der forbrugte denne linje, og i hvilken andelKun den linje
En linje uden tildelte deles efter udgiftens delingstype; en linje med tildelte bæres kun af de personer den navngiver NIVEAU 1: INGEN NAVNGIVET PÅ LINJEN Delte retter 2.100 kr ingen tildelte EQUAL over 3 Asha 700 kr Bhavna 700 kr Chetan 700 kr NIVEAU 2: LINJEN NAVNGIVER HVEM DER SPISTE DEN Kødret 1.400 kr tildelte: Asha, Bhavna dens 2 tildelte Asha 700 kr Bhavna 700 kr Chetan 0 kr
De to niveauer på maden til 3.500 kr. Delte retter navngiver ingen, så EQUAL deler dem tre veje; havretten navngiver to personer, så Chetans mad-subtotal stopper ved 700 kr.

En middag til 3.675 kr hvor den der spiste mindst betaler 735 kr

Asha, Bhavna og Chetan spiser middag, delt ligeligt i toppen. Delte retter kommer til 2.100 kr. En havret kommer til 1.400 kr, og kun Asha og Bhavna spiste den. Service er 5%, og Chetan betalte hele beløbet på 3.675 kr.

Gennemregnet eksempel: én regning, to linjer, én justering, og den andel hver person bærer.
LinjeBeløbAshaBhavnaChetan
Delte retter, ingen tildelte2.100 kr700 kr700 kr700 kr
Havplatte, Asha og Bhavna1.400 kr700 kr700 kr0 kr
Subtotal3.500 kr1.400 kr1.400 kr700 kr
Service 5%, efter subtotal175 kr70 kr70 kr35 kr
Total3.675 kr1.470 kr1.470 kr735 kr

Chetan betalte 3.675 kr og skylder 735 kr, så han har 2.940 kr til gode: 1.470 kr fra Asha og 1.470 kr fra Bhavna. Hvem der betalte er uafhængigt af hvem der skylder. At betaleren er den person der næsten ikke spiste ændrer ingen af andelene, hvilket er grunden til at Dimesum holder betalere på udgiftsniveau og tildelte på linjeniveau.

Skat følger hvad du spiste, ikke hvor mange I er

Chetans andel af servicegebyret på 175 kr er 35 kr, ikke 58,33 kr. Hver justering fordeles i forhold til hver persons vare-subtotal, så madens deling 1.400:1.400:700 afgør også delingen af servicegebyret. At fordele efter hovedtal ville stille og roligt opkræve Chetan skat på en ret han aldrig rørte.

En der ikke bestilte noget betaler derfor ingen skat og får ingen rabat. Vægtene er subtotalerne før justering frem for den løbende total, hvilket også forhindrer hver justerings afrunding i at vokse ind i den næstes vægte.

Justeringer gælder i rækkefølge, så en rabat flytter momsgrundlaget

En regning der lyder "7.000 kr, minus 10%, plus 5% moms" opkræver moms på 6.300 kr, og momslinjen er 315 kr. Byt de to om, og momsen opkræves på 7.000 kr, hvilket giver 350 kr. Justeringer er en ordnet liste, og en procentdel gælder for den løbende total på sin egen plads. Begge rækkefølger er rigtige regninger, så listen er ordnet frem for en mængde.

Den samme rabat og moms i to rækkefølger, der viser grundlaget hver især opkræves på og den total hver især giver Rabat først Moms først Vare-subtotal 7.000 kr minus 10% af 7.000 kr rabat på 700 kr 6.300 kr plus 5% moms af 6.300 kr moms på 315 kr 6.615 kr Regningens total 6.615 kr Vare-subtotal 7.000 kr plus 5% moms af 7.000 kr moms på 350 kr 7.350 kr minus 10% af 7.350 kr rabat på 735 kr 6.615 kr Regningens total 6.615 kr SAMME REGNING, FAST 700 KR AF I STEDET FOR 10% 700 kr af, så moms 6.615 kr moms, så 700 kr af 6.650 kr
To procenter lander på de samme 6.615 kr fordi multiplikationen er kommutativ, men momslinjen er forskellig: 315 kr mod 350 kr. Byt den procentvise rabat ud med faste 700 kr, og totalerne skiller sig også, 6.615 kr mod 6.650 kr. Rækkefølge er aritmetik her, ikke præsentation.
Hvorfor rækkefølgen gemmes eksplicit

Hver justering bærer sin egen position. En rækkefølge der hvilede på indsætningsrækkefølge, eller på at en id-generator forblev monoton, ville stille og roligt ændre hvad alle skylder efter en databasegendannelse.

Tre valideringer står mellem en tastefejl og aritmetikken. En pulje angiver enten et fast beløb eller en sats i basispoint, aldrig begge, fordi at gemme begge gemmer et tal og dets egen udledning. Et negativt beløb afvises, med en fejl der navngiver DISCOUNT som måden at skrive en reduktion. En sats over 100.000 basispoint afvises også, et loft sat langt over de 10.000 basispoint der betyder 100%, fordi hundrede procent rabat er en rigtig rabat.

De fire justeringstyper i internal/platform/splitcalc, og hvad hver især gør ved den løbende total.
TypeEffekt på den løbende totalHvorfor det er sin egen type
TAXLægger tilKun ordvalg; identisk med beregningen
TIPLægger tilKun ordvalg; identisk med beregningen
FEELægger tilKun ordvalg; identisk med beregningen
DISCOUNTTrækker fraDen eneste type der ændrer aritmetikken, så retningen kommer fra typen og aldrig fra et fortegn

Totalen kommer fra linjerne, og en indtastet total er kun en kontrolsum

En specificeret total udledes: summen af varerne plus summen af justeringerne. Linjerne siger allerede hvad regningen koster, så en separat angivet total ville være en anden kilde til sandhed der kan være uenig med den første. En der taster en regning forkert ind retter en linje, hvor fejlen faktisk er, og totalen følger med. At rette en regning der allerede er bogført går gennem en redigering der genudtrykker sin deling, så rettelsen lander som en ny version frem for som en overskrivning.

En klient kan stadig sende amount_minor, og Dimesum behandler det så som en kontrolsum frem for som svaret. Enighed betyder at klienten læste den samme regning. Uenighed stopper udgiften før nogen penge flytter sig.

En tidligere version tilføjede automatisk en "Andet"-linje for hvad end en angivet total ikke gjorde rede for, og fjernede linjen når forskellen lukkede. Den linje virkede, og den er væk. At udlede totalen opløste det problem "Andet"-linjen fandtes for at håndtere, som kun opstod fordi totalen blev angivet to gange.

Hvorfor EXACT og varer afvises sammen

EXACT navngiver hvert medlems endelige beløb. Varer udleder hvert medlems beløb. Begge på én gang er overbestemt: enten er de enige, i hvilket tilfælde den ene er overflødig, eller de er uenige, i hvilket tilfælde udgiften har to svar og ingen regel siger hvilket der vinder. Dimesum afviser kombinationen ved døren frem for at afgøre den med en forrangsregel ingen ville huske.

EQUAL, PERCENT og SHARES kombineres alle med varer, fordi hver især er en regel for at dele en delt omkostning frem for en mængde endelige beløb.

Hvor en rabat plejede at miste en øre

Hver fordeling bruger største rest-metoden, og hver enkelt bevarer sin egen total præcist. Uafgjorte i den metode gik før til det laveste medlems-id, hvilket gav gruppens ældste medlem den ekstra øre på hver ligeligt delt udgift; det uafgjorte roterer nu på et hash af udgiftens id. Delte linjer puljes og deles én gang frem for linje for linje, så den skæve øre ikke lander på det samme medlem for hver linje på regningen.

Vores apportion-funktion havde en rigtig defekt her. Go's heltalsdivision afkorter mod nul, så en negativ total blev afrundet den forkerte vej og resten blev aldrig delt ud: −70,00 kr over vægtene 100, 200 og 300 kom tilbage som −69,99 kr. En forsvundet øre ville have fået en korrekt rabatteret regning til at fejle sin egen sumkontrol, og brugeren ville være blevet fortalt at deres aritmetik var forkert. Negative totaler fordeles nu efter størrelse og negeres tilbage.

Indtast regningen som den er trykt

Tast de linjer du kan se, navngiv de personer der spiste dem der ikke blev delt, og tilføj moms, drikkepenge, gebyr og rabat i den rækkefølge kvitteringen trykker dem. Dimesum udleder totalen, fordeler hver justering efter hvad hver person forbrugte, og lader betaleren være udenfor. Næste gang én ret koster dobbelt så meget som alle andre bestilte, tilføj den som sin egen linje med to navne på.

Ofte stillede spørgsmål

Hvordan deler man en restaurantregning når én har bestilt noget dyrt?

Sæt den ret på sin egen linje og navngiv de personer der spiste den. I Dimesum deles resten af regningen stadig efter udgiftens egen regel, som regel ligeligt, mens den navngivne linje kun bæres af sine tildelte. Skat og service fordeles derefter efter hver persons subtotal, så den der sprang retten over betaler mindre af begge.

Skal skat og drikkepenge deles ligeligt eller efter hvad hver har bestilt?

Efter hvad hver person bestilte. Dimesum fordeler hver justering i forhold til hver persons vare-subtotal frem for efter hovedtal. I en middag til 3.675 kr hvor én person spiste mad for 700 kr, bærer den person 35 kr af et servicegebyr på 175 kr i stedet for 58,33 kr. Enhver der ikke bestilte noget betaler slet ingen skat.

Ændrer rækkefølgen af en rabat og en moms hvad regningen koster?

Ja. Justeringer gælder i rækkefølge mod en løbende total, så en regning der lyder '7.000 kr, minus 10%, plus 5% moms' opkræver momsen på 6.300 kr, og momslinjen er 315 kr. Sæt momsen først, og den opkræves på 7.000 kr, hvilket giver 350 kr. Med en fast rabat på 700 kr er totalerne også forskellige, 6.615 kr mod 6.650 kr.

Hvorfor kan man ikke bruge præcise beløb på en specificeret regning?

EXACT navngiver hver persons endelige beløb og varer udleder det, så de to sammen giver én udgift to svar. Dimesum afviser kombinationen frem for at kåre en vinder med en forrangsregel ingen ville huske. EQUAL, PERCENT og SHARES virker alle sammen med varer, fordi hver især er en regel for at dele delte linjer frem for en mængde endelige beløb.

Skal man taste totalen på en specificeret regning?

Nej. Dimesum udleder en specificeret total som summen af varerne plus summen af justeringerne, fordi linjerne allerede siger hvad regningen koster. En total sendt af en klient tjekkes som en kontrolsum, og en uoverensstemmelse stopper udgiften før penge flytter sig. At rette et forkert tal betyder at rette den linje det kom fra.