Come dividere un conto con un piatto non condiviso
Una spesa con due regole risolve il conto: indicate chi ha mangiato la riga non condivisa e lasciate che le tasse seguano il consumo.
Dividete in parti uguali una cena da €525 e una persona paga €70 di troppo. Due dei tre commensali hanno mangiato il piatto di pesce da €200 e il terzo no, eppure una divisione uguale addebita €175 a testa a tutti e tre. Dimesum tratta quel conto come una sola spesa: uguale al vertice, con la riga da €200 sostenuta solo dai due che l'hanno ordinata.
I conti quasi uguali con una sola riga non condivisa sono la richiesta più comune per un'app di divisione, e il primo modello di dati di Dimesum non riusciva a esprimerli. Il progetto precedente faceva di ITEMIZED un tipo di divisione, mutuamente esclusivo con EQUAL, PERCENT e SHARES. Un vero conto di ristorante è entrambe le cose insieme.
La suddivisione in voci è un dettaglio della spesa, non un tipo di divisione diverso
Una spesa con voci in Dimesum è una spesa ordinaria che si trova a portare le proprie righe. La spesa mantiene tutto ciò che le spese hanno già: un totale, i partecipanti, un tipo di divisione, uno o più pagatori. A questo aggiunge le voci, le righe del conto, e le rettifiche, cioè tasse, mancia, commissioni e sconti stampati sotto di esse.
Due livelli decidono poi ogni centesimo. Il tipo di divisione della spesa suddivide qualsiasi riga su cui non è indicato nessuno. Una riga con assegnatari è sostenuta esattamente da quelle persone, e da nessun altro.
| Livello | Cosa decide | Si applica a |
|---|---|---|
| Tipo di divisione della spesa | Come si suddivide un costo condiviso: in parti uguali, in percentuale o per quote ponderate | Ogni voce senza assegnatari indicati |
| Assegnatari della voce | Chi ha consumato questa riga, e in quale proporzione | Solo quella riga |
Una cena da €525 in cui chi ha mangiato di meno paga €105
Asha, Bhavna e Chetan cenano insieme, con divisione uguale al vertice. I piatti condivisi arrivano a €300. Un piatto di pesce arriva a €200, e solo Asha e Bhavna l'hanno mangiato. Il servizio è del 5%, e Chetan ha pagato l'intero conto da €525.
| Riga | Importo | Asha | Bhavna | Chetan |
|---|---|---|---|---|
| Piatti condivisi, nessun assegnatario | €300 | €100 | €100 | €100 |
| Piatto di pesce, Asha e Bhavna | €200 | €100 | €100 | €0 |
| Subtotale | €500 | €200 | €200 | €100 |
| Servizio 5%, per subtotale | €25 | €10 | €10 | €5 |
| Totale | €525 | €210 | €210 | €105 |
Chetan ha pagato €525 e deve €105, quindi gli spettano €420: €210 da Asha e €210 da Bhavna. Chi ha pagato è indipendente da chi deve. Il fatto che a pagare sia la persona che ha mangiato appena qualcosa non cambia nessuna delle quote, ed è per questo che Dimesum tiene i pagatori a livello di spesa e gli assegnatari a livello di riga.
Le tasse seguono ciò che avete mangiato, non quanti siete
La quota di Chetan sul servizio da €25 è €5, non €8,33. Ogni rettifica si ripartisce in proporzione al subtotale delle voci di ciascuna persona, quindi la divisione 200:200:100 del cibo decide anche la divisione del servizio. Ripartire in base al numero di persone addebiterebbe a Chetan, senza farlo notare, le tasse su un piatto che non ha mai toccato.
Chi non ha ordinato nulla non paga quindi alcuna tassa e non riceve alcuno sconto. I pesi sono i subtotali prima delle rettifiche anziché il totale progressivo, il che impedisce anche che l'arrotondamento di ogni rettifica si sommi nei pesi di quella successiva.
Le rettifiche si applicano in ordine, quindi uno sconto sposta la base dell'IVA
Un conto che recita "€1.000, meno 10%, più 5% di IVA" applica l'IVA su €900, e la riga dell'IVA è €45. Invertite i due e l'IVA viene applicata su €1.000, dando €50. Le rettifiche sono un elenco ordinato, e una percentuale si applica al totale progressivo nella propria posizione. Entrambi gli ordinamenti sono conti reali, quindi l'elenco è ordinato anziché un insieme.
Ogni rettifica porta la propria position. Un ordinamento che dipendesse dall'ordine di inserimento, o dal fatto che un generatore di id resti monotòno, cambierebbe di nascosto quanto ciascuno deve dopo il ripristino di un database.
Tre controlli si frappongono tra un refuso e l'aritmetica. Un insieme indica o un importo fisso o un'aliquota in punti base, mai entrambi, perché memorizzare entrambi memorizza un numero e la sua stessa derivazione. Un importo negativo viene rifiutato, con un errore che indica DISCOUNT come modo per scrivere una riduzione. Anche un'aliquota superiore a 100.000 punti base viene rifiutata, un tetto fissato molto al di sopra dei 10.000 punti base che indicano il 100%, perché uno sconto del cento per cento è uno sconto reale.
| Tipo | Effetto sul totale progressivo | Perché è un tipo a sé |
|---|---|---|
TAX | Aggiunge | Solo dicitura; identico nel calcolo |
TIP | Aggiunge | Solo dicitura; identico nel calcolo |
FEE | Aggiunge | Solo dicitura; identico nel calcolo |
DISCOUNT | Sottrae | L'unico tipo che cambia l'aritmetica, quindi la direzione viene dal tipo e mai da un segno |
Il totale viene dalle righe, e un totale digitato è solo un codice di controllo
Un totale con voci è derivato: la somma delle voci più la somma delle rettifiche. Le righe dicono già quanto costa il conto, quindi un totale indicato a parte sarebbe una seconda fonte di verità che può divergere dalla prima. Chi inserisce male un conto corregge una riga, che è dove sta davvero l'errore, e il totale ne consegue. Correggere un conto già registrato passa per una modifica che riformula la sua divisione, così la correzione arriva come nuova versione anziché come sovrascrittura.
Un client può comunque inviare amount_minor, e Dimesum lo tratta allora come un codice di controllo anziché come la risposta. La concordanza significa che il client ha letto lo stesso conto. La discordanza ferma la spesa prima che si muova del denaro.
Una versione precedente aggiungeva automaticamente una riga "Altro" per tutto ciò che un totale indicato non spiegava, e rimuoveva la riga quando la differenza si chiudeva. Quella riga funzionava, e non c'è più. Derivare il totale ha dissolto il problema che la riga "Altro" esisteva per gestire, e che sorgeva solo perché il totale veniva indicato due volte.
Perché EXACT e le voci vengono rifiutati insieme
EXACT indica l'importo finale di ciascun membro. Le voci derivano l'importo di ciascun membro. Entrambi insieme sono sovradeterminati: o concordano, e allora uno è ridondante, oppure divergono, e allora la spesa ha due risposte e nessuna regola dice quale prevale. Dimesum rifiuta la combinazione fin dall'ingresso anziché risolverla con una regola di precedenza che nessuno ricorderebbe.
EQUAL, PERCENT e SHARES si combinano tutti con le voci, perché ciascuno è una regola per dividere un costo condiviso anziché un insieme di importi finali.
Dove uno sconto perdeva un centesimo
Ogni ripartizione usa il metodo del resto maggiore, e ciascuna conserva esattamente il proprio totale. In quel metodo i pareggi andavano all'id di membro più basso, il che consegnava al membro più anziano del gruppo il centesimo in più su ogni spesa divisa in parti uguali; ora il pareggio ruota su un hash dell'id della spesa. Le righe condivise vengono raggruppate e divise una volta sola anziché riga per riga, così il centesimo dispari non finisce sullo stesso membro per ogni riga del conto.
La nostra funzione apportion aveva qui un vero difetto. La divisione intera di Go tronca verso lo zero, così un totale negativo veniva arrotondato per difetto nel verso sbagliato e il resto non veniva mai distribuito: −€10,00 su pesi di 100, 200 e 300 tornava come −€9,99. Un centesimo svanito avrebbe fatto fallire a un conto scontato corretto il suo stesso controllo di somma, e all'utente sarebbe stato detto che la sua aritmetica era sbagliata. I totali negativi ora vengono ripartiti per grandezza e rinegati.
Inserite il conto così com'è stampato
Digitate le righe che vedete, indicate le persone che hanno mangiato quelle non condivise, e aggiungete tassa, mancia, commissione e sconto nell'ordine in cui la ricevuta li stampa. Dimesum deriva il totale, ripartisce ogni rettifica in base a ciò che ciascuno ha consumato, e lascia fuori il pagatore. La prossima volta che un piatto costa il doppio di quanto hanno ordinato gli altri, aggiungetelo come riga a sé con due nomi sopra.
Domande frequenti
Come si divide il conto del ristorante se una persona ha ordinato qualcosa di costoso?
Mettete quel piatto su una riga a sé e indicate le persone che l'hanno mangiato. In Dimesum il resto del conto si divide comunque secondo la regola della spesa, di solito in parti uguali, mentre la riga indicata è sostenuta solo dai suoi assegnatari. Tasse e servizio si ripartiscono poi in base al subtotale di ciascuno, così chi ha saltato il piatto paga meno di entrambi.
Le tasse e la mancia vanno divise in parti uguali o in base a ciò che ha ordinato ciascuno?
In base a ciò che ha ordinato ciascuno. Dimesum ripartisce ogni rettifica in proporzione al subtotale delle voci di ciascuno anziché per numero di persone. In una cena da €525 in cui una persona ha mangiato €100 di cibo, quella persona sostiene €5 di un servizio da €25 invece di €8,33. Chi non ha ordinato nulla non paga alcuna tassa.
L'ordine di uno sconto e di una tassa cambia quanto costa il conto?
Sì. Le rettifiche si applicano in ordine su un totale progressivo, così un conto che recita "€1.000, meno 10%, più 5% di IVA" applica l'IVA su €900 e la riga dell'IVA è €45. Mettete prima l'IVA e viene applicata su €1.000, dando €50. Con uno sconto fisso di €100 anche i totali cambiano, €945 contro €950.
Perché non si possono usare importi esatti su un conto con le voci?
EXACT indica l'importo finale di ciascuno e le voci lo derivano, quindi insieme danno a una spesa due risposte. Dimesum rifiuta la combinazione anziché scegliere un vincitore con una regola di precedenza che nessuno ricorderebbe. EQUAL, PERCENT e SHARES funzionano tutti insieme alle voci, perché ciascuno è una regola per dividere righe condivise anziché un insieme di importi finali.
Bisogna digitare il totale di un conto con le voci?
No. Dimesum deriva il totale delle voci come somma delle voci più somma delle rettifiche, perché le righe dicono già quanto costa il conto. Un totale inviato da un client viene verificato come codice di controllo, e una discordanza ferma la spesa prima che si muova del denaro. Correggere una cifra sbagliata significa correggere la riga da cui proviene.
Articoli più letti
- Il registro append-only per spese condivise esatte9 min di lettura
- Perché modificare una spesa ridefinisce la divisione9 min di lettura
- Sei bug di denaro nelle spese multivaluta9 min di lettura
- Saldare le spese di gruppo in pochi bonifici5 min di lettura
- Come dividere l'affitto tra coinquilini in modo equo6 min di lettura