dimesum

Início / Blog / Dinheiro

Dinheiro

Como dividir uma conta detalhada de restaurante

· 10 min de leitura ·

Uma única despesa com duas regras resolve a conta em que um prato não foi de todos: nomeie quem comeu a linha não compartilhada e deixe o imposto seguir o consumo.

Divida um jantar de R$ 525 igualmente e uma pessoa paga R$ 70 a mais. Duas das três comeram a travessa de frutos do mar de R$ 200 e a terceira não, mas uma divisão igual cobra R$ 175 de cada uma. A Dimesum trata essa conta como uma única despesa: igual no topo, com a linha de R$ 200 sustentada apenas pelas duas que a pediram.

Contas quase iguais com uma linha não compartilhada são a tarefa mais comum que se pede a um aplicativo de divisão, e o primeiro modelo de dados da Dimesum não conseguia expressar isso. O design anterior fazia de ITEMIZED um tipo de divisão, mutuamente exclusivo com EQUAL, PERCENT e SHARES. Uma conta de restaurante real é as duas coisas ao mesmo tempo.

Detalhar é um pormenor de uma despesa, não um tipo diferente de divisão

Uma despesa detalhada na Dimesum é uma despesa comum que por acaso carrega suas linhas. A despesa mantém tudo o que as despesas já têm: um total, participantes, um tipo de divisão, um ou vários pagadores. A isso ela acrescenta itens, as linhas da conta, e ajustes, os impostos, a gorjeta, as taxas e os descontos impressos abaixo delas.

Dois níveis então decidem cada centavo. O tipo de divisão da despesa reparte qualquer linha sem ninguém nomeado nela. Uma linha com responsáveis é sustentada exatamente por essas pessoas, e por mais ninguém.

Os dois níveis que decidem a divisão de uma linha, de docs/tech/18-itemized-expenses.md §1.
NívelO que ele decideAplica-se a
Tipo de divisão da despesaComo um custo compartilhado se reparte: igualmente, por percentual ou por cotas ponderadasTodo item sem responsáveis nomeados
Responsáveis do itemQuem consumiu esta linha, e em que proporçãoApenas essa linha
Uma linha sem responsáveis é repartida pelo tipo de divisão da despesa; uma linha com responsáveis é sustentada apenas pelas pessoas que ela nomeia NÍVEL 1: NINGUÉM NOMEADO NA LINHA Pratos compartilhados R$ 300 sem responsáveis EQUAL entre 3 Asha R$ 100 Bhavna R$ 100 Chetan R$ 100 NÍVEL 2: A LINHA NOMEIA QUEM COMEU Prato não vegetariano R$ 200 responsáveis: Asha, Bhavna seus 2 responsáveis Asha R$ 100 Bhavna R$ 100 Chetan R$ 0
Os dois níveis sobre os R$ 500 de comida. Os pratos compartilhados não nomeiam ninguém, então EQUAL os reparte em três; o prato de frutos do mar nomeia duas pessoas, então o subtotal de comida de Chetan para em R$ 100.

Um jantar de R$ 525 em que quem comeu menos paga R$ 105

Asha, Bhavna e Chetan jantam, com divisão igual no topo. Os pratos compartilhados somam R$ 300. Um prato de frutos do mar sai por R$ 200, e apenas Asha e Bhavna o comeram. O serviço é de 5%, e Chetan pagou os R$ 525 inteiros.

Exemplo prático: uma conta, duas linhas, um ajuste, e a parte que cada pessoa carrega.
LinhaValorAshaBhavnaChetan
Pratos compartilhados, sem responsáveisR$ 300R$ 100R$ 100R$ 100
Travessa de frutos do mar, Asha e BhavnaR$ 200R$ 100R$ 100R$ 0
SubtotalR$ 500R$ 200R$ 200R$ 100
Serviço 5%, por subtotalR$ 25R$ 10R$ 10R$ 5
TotalR$ 525R$ 210R$ 210R$ 105

Chetan pagou R$ 525 e deve R$ 105, então tem R$ 420 a receber: R$ 210 de Asha e R$ 210 de Bhavna. Quem pagou é ortogonal a quem deve. O fato de o pagador ser a pessoa que quase não comeu não muda nenhuma das partes, e é por isso que a Dimesum mantém os pagadores no nível da despesa e os responsáveis no nível da linha.

O imposto segue o que você comeu, não quantos vocês são

A parte de Chetan na taxa de serviço de R$ 25 é R$ 5, não R$ 8,33. Todo ajuste é alocado em proporção ao subtotal de itens de cada pessoa, então a divisão 200:200:100 da comida decide também a divisão da taxa de serviço. Alocar por número de pessoas cobraria silenciosamente de Chetan o imposto sobre um prato que ele nunca tocou.

Alguém que não pediu nada, portanto, não paga imposto e não recebe desconto. Os pesos são os subtotais anteriores aos ajustes, e não o total corrente, o que também impede que o arredondamento de cada ajuste se acumule nos pesos do seguinte.

Os ajustes se aplicam em ordem, então um desconto move a base do GST

Uma conta que diz "R$ 1.000, menos 10%, mais 5% de GST" cobra o GST sobre R$ 900, e a linha do GST é R$ 45. Inverta as duas e o GST é cobrado sobre R$ 1.000, dando R$ 50. Os ajustes são uma lista ordenada, e um percentual se aplica ao total corrente na sua própria posição. As duas ordens são contas reais, então a lista é ordenada e não um conjunto.

O mesmo desconto e o GST em duas ordens, mostrando a base sobre a qual cada um é cobrado e o total que cada um produz Desconto primeiro GST primeiro Subtotal de itens R$ 1.000 menos 10% de R$ 1.000 desconto de R$ 100 R$ 900 mais 5% de GST sobre R$ 900 GST de R$ 45 R$ 945 Total da conta R$ 945 Subtotal de itens R$ 1.000 mais 5% de GST sobre R$ 1.000 GST de R$ 50 R$ 1.050 menos 10% de R$ 1.050 desconto de R$ 105 R$ 945 Total da conta R$ 945 MESMA CONTA, R$ 100 FIXOS DE DESCONTO EM VEZ DE 10% R$ 100 de desconto, depois GST R$ 945 GST, depois R$ 100 de desconto R$ 950
Dois percentuais chegam ao mesmo R$ 945 porque a multiplicação é comutativa, mas a linha do GST difere: R$ 45 contra R$ 50. Troque o desconto percentual por R$ 100 fixos e os totais também se separam, R$ 945 contra R$ 950. A ordem aqui é aritmética, não apresentação.
Por que a ordem é armazenada explicitamente

Cada ajuste carrega sua própria position. Uma ordenação que dependesse da ordem de inserção, ou de um gerador de id se manter monotônico, mudaria silenciosamente o que cada um deve depois de uma restauração do banco de dados.

Três validações ficam entre um erro de digitação e a aritmética. Um conjunto declara ou um valor fixo ou uma taxa em pontos-base, nunca os dois, porque armazenar os dois armazena um número e a sua própria derivação. Um valor negativo é recusado, com um erro que aponta DISCOUNT como a forma de escrever uma redução. Uma taxa acima de 100.000 pontos-base também é recusada, um limite fixado bem acima dos 10.000 pontos-base que significam 100%, porque cem por cento de desconto é um desconto real.

Os quatro tipos de ajuste em internal/platform/splitcalc, e o que cada um faz ao total corrente.
TipoEfeito no total correntePor que é um tipo próprio
TAXSomaApenas redação; idêntico ao cálculo
TIPSomaApenas redação; idêntico ao cálculo
FEESomaApenas redação; idêntico ao cálculo
DISCOUNTSubtraiO único tipo que muda a aritmética, então a direção vem do tipo e nunca de um sinal

O total vem das linhas, e um total digitado é apenas uma soma de verificação

Um total detalhado é derivado: a soma dos itens mais a soma dos ajustes. As linhas já dizem quanto a conta custa, então um total declarado à parte seria uma segunda fonte de verdade que pode divergir da primeira. Quem digita uma conta errada corrige uma linha, que é onde o erro de fato está, e o total acompanha. Corrigir uma conta que já foi lançada passa por uma edição que reafirma a sua divisão, então a correção entra como uma nova versão e não como uma sobrescrita.

Um cliente ainda pode enviar amount_minor, e a Dimesum então o trata como uma soma de verificação e não como a resposta. Concordância significa que o cliente leu a mesma conta. Divergência interrompe a despesa antes que qualquer dinheiro se mova.

Uma versão anterior acrescentava automaticamente uma linha "Outros" para o que um total declarado não explicasse, e removia a linha quando a diferença fechava. Essa linha funcionava, e já não existe. Derivar o total dissolveu o problema que a linha "Outros" existia para administrar, que só surgia porque o total era declarado duas vezes.

Por que EXACT e itens são recusados juntos

EXACT nomeia o valor final de cada membro. Os itens derivam o valor de cada membro. Os dois ao mesmo tempo é sobredeterminado: ou eles concordam, caso em que um é redundante, ou divergem, caso em que a despesa tem duas respostas e nenhuma regra diz qual vence. A Dimesum recusa a combinação logo na porta em vez de resolvê-la com uma regra de precedência de que ninguém se lembraria.

EQUAL, PERCENT e SHARES todos se combinam com itens, porque cada um é uma regra para repartir um custo compartilhado e não um conjunto de valores finais.

Onde um desconto costumava perder um centavo

Toda alocação usa o método do maior resto, e cada uma conserva o seu próprio total exatamente. Os empates nesse método antes iam para o menor id de membro, o que entregava o centavo extra ao membro mais antigo do grupo em toda despesa dividida igualmente; o empate agora gira sobre um hash do id da despesa. As linhas compartilhadas são agrupadas e repartidas de uma vez, e não linha por linha, então o centavo sobressalente não cai no mesmo membro em cada linha da conta.

Nossa função apportion tinha um defeito real aqui. A divisão inteira de Go trunca em direção a zero, então um total negativo era arredondado para o lado errado e a sobra nunca era distribuída: −R$ 10,00 sobre pesos de 100, 200 e 300 voltava como −R$ 9,99. Um centavo sumido teria feito uma conta com desconto correta falhar na sua própria verificação de soma, e o usuário teria sido informado de que a sua aritmética estava errada. Os totais negativos agora são repartidos por magnitude e negados de volta.

Digite a conta do jeito que ela vem impressa

Digite as linhas que você vê, nomeie as pessoas que comeram as que não foram compartilhadas, e acrescente o imposto, a gorjeta, a taxa e o desconto na ordem em que o recibo os imprime. A Dimesum deriva o total, aloca cada ajuste pelo que cada pessoa consumiu, e deixa o pagador de fora. Da próxima vez que um prato custar o dobro do que todos os outros pediram, acrescente-o como sua própria linha com dois nomes nela.

Perguntas frequentes

Como dividir a conta do restaurante quando uma pessoa pediu algo caro?

Coloque esse prato em uma linha separada e nomeie as pessoas que o comeram. Na Dimesum o resto da conta continua dividido pela regra da própria despesa, normalmente em partes iguais, enquanto a linha nomeada é sustentada apenas pelos seus responsáveis. O imposto e o serviço então são alocados pelo subtotal de cada pessoa, então quem pulou o prato paga menos dos dois.

Imposto e gorjeta devem ser divididos igualmente ou pelo que cada um pediu?

Pelo que cada um pediu. A Dimesum aloca cada ajuste em proporção ao subtotal de itens de cada pessoa, e não por número de pessoas. Em um jantar de R$ 525 em que uma pessoa comeu R$ 100 de comida, essa pessoa carrega R$ 5 de uma taxa de serviço de R$ 25 em vez de R$ 8,33. Quem não pediu nada não paga imposto nenhum.

A ordem de um desconto e de um imposto muda quanto a conta custa?

Sim. Os ajustes se aplicam em ordem contra um total corrente, então uma conta que diz "R$ 1.000, menos 10%, mais 5% de GST" cobra o GST sobre R$ 900 e a linha do GST é R$ 45. Coloque o GST primeiro e ele é cobrado sobre R$ 1.000, dando R$ 50. Com um desconto fixo de R$ 100 os totais também diferem, R$ 945 contra R$ 950.

Por que não dá para usar valores exatos em uma conta detalhada?

EXACT nomeia o valor final de cada pessoa e os itens o derivam, então os dois juntos dão duas respostas a uma despesa. A Dimesum recusa a combinação em vez de escolher um vencedor com uma regra de precedência de que ninguém se lembraria. EQUAL, PERCENT e SHARES todos funcionam ao lado dos itens, porque cada um é uma regra para repartir linhas compartilhadas e não um conjunto de valores finais.

É preciso digitar o total de uma conta detalhada?

Não. A Dimesum deriva o total detalhado como a soma dos itens mais a soma dos ajustes, porque as linhas já dizem quanto a conta custa. Um total enviado por um cliente é conferido como uma soma de verificação, e uma divergência interrompe a despesa antes que o dinheiro se mova. Corrigir um número errado significa corrigir a linha de onde ele veio.