dimesum

Forsiden / Blogg / Penger

Penger

Slik deler du en regning når én rett ikke ble delt

· 9 min lesing ·

Del en middag på 525 kr likt, og én person betaler stille 70 kr for en rett vedkommende aldri rørte, løsningen er én utgift med to regler.

Del en middag på 525 kr likt og én person betaler 70 kr for mye. To av de tre spiste sjømatfatet til 200 kr og den tredje gjorde det ikke, likevel belaster en lik deling alle tre med 175 kr. Dimesum håndterer den regningen som én utgift: likt på toppen, med linjen på 200 kr båret bare av de to som bestilte den.

Regninger som stort sett er like, med én linje som ikke ble delt, er det vanligste en delingsapp blir bedt om å gjøre, og Dimesums første datamodell kunne ikke uttrykke en slik. Den tidligere utformingen gjorde ITEMIZED til en delingstype, gjensidig utelukkende med EQUAL, PERCENT og SHARES. En ekte restaurantregning er begge deler samtidig.

Spesifisering er en detalj ved en utgift, ikke en annen type deling

En spesifisert utgift i Dimesum er en vanlig utgift som tilfeldigvis bærer sine linjer. Utgiften beholder alt utgifter allerede har: en total, deltakere, en delingstype, en eller flere betalere. Til det legger den varer, linjene på regningen, og justeringer, avgiftene, driksen, gebyrene og rabattene som er trykt under dem.

To nivåer avgjør så hver eneste øre. Utgiftens delingstype deler enhver linje uten noen navngitt på den. En linje med tilordnede bæres av nøyaktig de personene, og av ingen andre.

De to nivåene som avgjør delingen av en linje, fra docs/tech/18-itemized-expenses.md §1.
NivåHva det avgjørGjelder for
Utgiftens delingstypeHvordan en delt kostnad deles: likt, etter prosent, eller etter vektede andelerHver vare uten navngitte tilordnede
Varens tilordnedeHvem som forbrukte denne linjen, og i hvilken andelBare den linjen
En linje uten tilordnede deles etter utgiftens delingstype; en linje med tilordnede bæres bare av personene den navngir NIVÅ 1: INGEN NAVNGITT PÅ LINJEN Delte retter 300 kr ingen tilordnet EQUAL over 3 Asha 100 kr Bhavna 100 kr Chetan 100 kr NIVÅ 2: LINJEN NAVNGIR HVEM SOM SPISTE DEN Ikke-vegetarrett 200 kr tilordnet: Asha, Bhavna dens 2 tilordnede Asha 100 kr Bhavna 100 kr Chetan 0 kr
De to nivåene på maten til 500 kr. Delte retter navngir ingen, så EQUAL deler dem på tre; sjømatretten navngir to personer, så Chetans delsum for mat stopper på 100 kr.

En middag på 525 kr der den som spiste minst betaler 105 kr

Asha, Bhavna og Chetan spiser middag, delt likt på toppen. Delte retter kommer på 300 kr. En sjømatrett kommer på 200 kr, og bare Asha og Bhavna spiste den. Servering er 5 %, og Chetan betalte hele 525 kr.

Regneeksempel: én regning, to linjer, én justering, og andelen hver person bærer.
LinjeBeløpAshaBhavnaChetan
Delte retter, ingen tilordnet300 kr100 kr100 kr100 kr
Sjømatfat, Asha og Bhavna200 kr100 kr100 kr0 kr
Delsum500 kr200 kr200 kr100 kr
Servering 5 %, etter delsum25 kr10 kr10 kr5 kr
Total525 kr210 kr210 kr105 kr

Chetan betalte 525 kr og skylder 105 kr, så han har 420 kr til gode: 210 kr fra Asha og 210 kr fra Bhavna. Hvem som betalte er uavhengig av hvem som skylder. At betaleren er personen som knapt spiste endrer ingen av andelene, og derfor holder Dimesum betalere på utgiftsnivå og tilordnede på linjenivå.

Avgift følger hva du spiste, ikke hvor mange dere er

Chetans andel av serveringsgebyret på 25 kr er 5 kr, ikke 8,33 kr. Hver justering fordeles i forhold til hver persons delsum for varer, så 200:200:100-delingen av maten avgjør delingen av serveringsgebyret også. Å fordele etter antall personer ville stille belaste Chetan avgift for en rett han aldri rørte.

Noen som ikke bestilte noe betaler derfor ingen avgift og får ingen rabatt. Vektene er delsummene før justering i stedet for den løpende summen, noe som også hindrer at avrundingen for hver justering forplanter seg inn i vektene for den neste.

Justeringer gjelder i rekkefølge, så en rabatt flytter GST-grunnlaget

En regning som lyder «1 000 kr, minus 10 %, pluss 5 % GST» belaster GST på 900 kr, og GST-linjen er 45 kr. Snu de to og GST belastes på 1 000 kr, som gir 50 kr. Justeringer er en ordnet liste, og en prosentsats gjelder den løpende summen i sin egen posisjon. Begge rekkefølgene er ekte regninger, så listen er ordnet i stedet for et sett.

Samme rabatt og GST i to rekkefølger, som viser grunnlaget hver belastes på og totalen hver gir Rabatt først GST først Delsum for varer 1 000 kr minus 10 % av 1 000 kr rabatt på 100 kr 900 kr pluss 5 % GST av 900 kr GST på 45 kr 945 kr Regningens total 945 kr Delsum for varer 1 000 kr pluss 5 % GST av 1 000 kr GST på 50 kr 1 050 kr minus 10 % av 1 050 kr rabatt på 105 kr 945 kr Regningens total 945 kr SAMME REGNING, FAST 100 KR AVSLAG I STEDET FOR 10 % 100 kr avslag, så GST 945 kr GST, så 100 kr avslag 950 kr
To prosentsatser lander på de samme 945 kr fordi multiplikasjonen kommuterer, likevel er GST-linjen ulik: 45 kr mot 50 kr. Bytt den prosentvise rabatten med en fast 100 kr og summene skiller lag også, 945 kr mot 950 kr. Rekkefølge er aritmetikk her, ikke presentasjon.
Hvorfor rekkefølgen lagres eksplisitt

Hver justering bærer sin egen position. En rekkefølge som hvilte på innsettingsrekkefølge, eller på at en id-generator holder seg monoton, ville stille endre hva alle skylder etter en gjenoppretting av databasen.

Tre valideringer står mellom en skrivefeil og aritmetikken. En pool angir enten et fast beløp eller en sats i basispunkter, aldri begge, fordi å lagre begge lagrer et tall og dets egen utledning. Et negativt beløp avvises, med en feil som navngir DISCOUNT som måten å skrive en reduksjon på. En sats over 100 000 basispunkter avvises også, en grense satt langt over de 10 000 basispunktene som betyr 100 %, fordi hundre prosent avslag er en ekte rabatt.

De fire justeringstypene i internal/platform/splitcalc, og hva hver gjør med den løpende summen.
TypeEffekt på den løpende summenHvorfor den er sin egen type
TAXLegger tilBare ordlyd; identisk med beregningen
TIPLegger tilBare ordlyd; identisk med beregningen
FEELegger tilBare ordlyd; identisk med beregningen
DISCOUNTTrekker fraDen eneste typen som endrer aritmetikken, så retningen kommer fra typen og aldri fra et fortegn

Totalen kommer fra linjene, og en inntastet total er bare en kontrollsum

En spesifisert total er utledet: summen av varene pluss summen av justeringene. Linjene sier allerede hva regningen koster, så en separat oppgitt total ville være en andre sannhetskilde som kan være uenig med den første. Noen som taster inn en regning feil retter en linje, som er der feilen faktisk er, og totalen følger med. Å rette en regning som allerede er postert går gjennom en redigering som omformulerer delingen sin, så rettingen lander som en ny versjon i stedet for som en overskriving.

En klient kan fortsatt sende amount_minor, og Dimesum behandler det da som en kontrollsum i stedet for som svaret. Enighet betyr at klienten leste den samme regningen. Uenighet stopper utgiften før noen penger flyttes.

En tidligere versjon la automatisk til en «Annet»-linje for det en oppgitt total ikke gjorde rede for, og fjernet linjen når gapet lukket seg. Den linjen fungerte, og den er borte. Å utlede totalen løste opp problemet «Annet»-linjen fantes for å håndtere, som bare oppsto fordi totalen ble oppgitt to ganger.

Hvorfor EXACT og varelinjer avvises sammen

EXACT navngir hvert medlems endelige beløp. Varelinjer utleder hvert medlems beløp. Begge samtidig er overbestemt: enten er de enige, og da er den ene overflødig, eller de er uenige, og da har utgiften to svar og ingen regel sier hvilket som vinner. Dimesum avviser kombinasjonen ved døren i stedet for å avgjøre den med en presedensregel ingen ville huske.

EQUAL, PERCENT og SHARES kombineres alle med varelinjer, fordi hver av dem er en regel for å dele en delt kostnad i stedet for et sett med endelige beløp.

Der en rabatt pleide å miste en øre

Hver fordeling bruker metoden med største rest, og hver av dem bevarer sin egen total nøyaktig. Uavgjort i den metoden pleide å gå til laveste medlems-id, noe som ga gruppens eldste medlem den ekstra øren på hver likt delte utgift; uavgjort roterer nå på en hash av utgiftens id. Delte linjer samles og deles én gang i stedet for linje for linje, så den odde øren lander ikke på det samme medlemmet for hver linje på regningen.

Vår apportion-funksjon hadde en reell feil her. Gos heltallsdivisjon avkorter mot null, så en negativ total ble rundet feil vei og resten ble aldri delt ut: −10,00 kr over vekter på 100, 200 og 300 kom tilbake som −9,99 kr. En forsvunnet øre ville ha gjort at en korrekt rabattert regning strøk på sin egen sumkontroll, og brukeren ville ha fått beskjed om at aritmetikken var feil. Negative totaler fordeles nå etter størrelse og negeres tilbake.

Legg inn regningen slik den er trykt

Tast inn linjene du kan se, navngi personene som spiste dem som ikke ble delt, og legg til avgift, driks, gebyr og rabatt i den rekkefølgen kvitteringen trykker dem. Dimesum utleder totalen, fordeler hver justering etter hva hver person forbrukte, og holder betaleren utenfor. Neste gang én rett koster dobbelt så mye som det alle andre bestilte, legg den til som sin egen linje med to navn på.

Vanlige spørsmål

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

Legg den retten på sin egen linje og navngi personene som spiste den. I Dimesum deles resten av regningen fortsatt etter utgiftens egen regel, vanligvis likt, mens den navngitte linjen bæres bare av dem den er tilordnet. Avgift og servering fordeles så etter hver persons delsum, slik at den som hoppet over retten betaler mindre av begge deler.

Skal avgifter og driks deles likt eller etter hva hver enkelt bestilte?

Etter hva hver enkelt bestilte. Dimesum fordeler hver justering i forhold til hver persons delsum for varer i stedet for etter antall personer. I en middag på 525 kr der én person spiste for 100 kr, bærer den personen 5 kr av et serveringsgebyr på 25 kr i stedet for 8,33 kr. Den som ikke bestilte noe betaler ingen avgift i det hele tatt.

Endrer rekkefølgen på rabatt og avgift hva regningen koster?

Ja. Justeringer legges til i rekkefølge mot en løpende sum, så en regning som lyder «1 000 kr, minus 10 %, pluss 5 % GST» belaster GST på 900 kr, og GST-linjen er 45 kr. Sett GST først, og den belastes på 1 000 kr, som gir 50 kr. Med en fast rabatt på 100 kr blir summene også ulike, 945 kr mot 950 kr.

Hvorfor kan man ikke bruke eksakte beløp på en spesifisert regning?

EXACT navngir hver persons endelige beløp og varelinjer utleder det, så de to sammen gir én utgift to svar. Dimesum avviser kombinasjonen i stedet for å velge en vinner med en presedensregel ingen ville huske. EQUAL, PERCENT og SHARES fungerer alle sammen med varelinjer, fordi hver av dem er en regel for å dele delte linjer i stedet for et sett med endelige beløp.

Må man skrive inn totalsummen på en spesifisert regning?

Nei. Dimesum utleder en spesifisert total som summen av varene pluss summen av justeringene, fordi linjene allerede sier hva regningen koster. En total sendt av en klient sjekkes som en kontrollsum, og et avvik stopper utgiften før penger flyttes. Å rette et feil tall betyr å rette linjen det kom fra.