dimesum

Home / Blog / Denaro

Denaro

Come dividere un conto con un piatto non condiviso

· 9 min di lettura ·

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.

I due livelli che decidono la divisione di una riga, da docs/tech/18-itemized-expenses.md §1.
LivelloCosa decideSi applica a
Tipo di divisione della spesaCome si suddivide un costo condiviso: in parti uguali, in percentuale o per quote ponderateOgni voce senza assegnatari indicati
Assegnatari della voceChi ha consumato questa riga, e in quale proporzioneSolo quella riga
Una riga senza assegnatari si divide secondo il tipo di divisione della spesa; una riga con assegnatari è sostenuta solo dalle persone che nomina LIVELLO 1: NESSUNO INDICATO SULLA RIGA Piatti condivisi €300 nessun assegnatario EQUAL su 3 Asha €100 Bhavna €100 Chetan €100 LIVELLO 2: LA RIGA INDICA CHI L'HA MANGIATA Piatto non veg €200 assegnatari: Asha, Bhavna i suoi 2 assegnatari Asha €100 Bhavna €100 Chetan €0
I due livelli sui €500 di cibo. I piatti condivisi non indicano nessuno, quindi EQUAL li divide in tre; il piatto di pesce indica due persone, quindi il subtotale del cibo di Chetan si ferma a €100.

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.

Esempio pratico: un conto, due righe, una rettifica, e la quota che ciascuna persona sostiene.
RigaImportoAshaBhavnaChetan
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.

Lo stesso sconto e la stessa IVA in due ordini, con la base su cui ciascuno viene applicato e il totale che ciascuno produce Prima lo sconto Prima l'IVA Subtotale voci €1.000 meno 10% di €1.000 sconto di €100 €900 più 5% di IVA su €900 IVA di €45 €945 Totale conto €945 Subtotale voci €1.000 più 5% di IVA su €1.000 IVA di €50 €1.050 meno 10% di €1.050 sconto di €105 €945 Totale conto €945 STESSO CONTO, SCONTO FISSO DI €100 INVECE DEL 10% €100 di sconto, poi IVA €945 IVA, poi €100 di sconto €950
Due percentuali arrivano allo stesso €945 perché la moltiplicazione è commutativa, eppure la riga dell'IVA cambia: €45 contro €50. Sostituite lo sconto percentuale con uno fisso di €100 e anche i totali si separano, €945 contro €950. Qui l'ordine è aritmetica, non presentazione.
Perché l'ordine è memorizzato esplicitamente

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.

I quattro tipi di rettifica in internal/platform/splitcalc, e cosa fa ciascuno al totale progressivo.
TipoEffetto sul totale progressivoPerché è un tipo a sé
TAXAggiungeSolo dicitura; identico nel calcolo
TIPAggiungeSolo dicitura; identico nel calcolo
FEEAggiungeSolo dicitura; identico nel calcolo
DISCOUNTSottraeL'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.