dimesum

Inicio / Blog / Dinero

Dinero

Dividir la cuenta cuando un plato no se compartió

· 10 min de lectura ·

Divide una cena de 525 € a partes iguales y alguien paga 70 € por un plato que no probó; la solución es un gasto con dos reglas: nombra quién comió la línea no compartida y deja que el impuesto siga al consumo.

Divide una cena de 525 € a partes iguales y una persona paga 70 € de más. Dos de los tres comieron la fuente de marisco de 200 € y el tercero no, y aun así una división a partes iguales cobra a los tres 175 €. Dimesum gestiona esa cuenta como un solo gasto: a partes iguales en lo general, con la línea de 200 € asumida solo por los dos que la pidieron.

Las cuentas casi iguales con una sola línea no compartida son lo más habitual que se le pide a una app de división, y el primer modelo de datos de Dimesum no podía expresarlo. El diseño anterior hacía de ITEMIZED un tipo de división, mutuamente excluyente con EQUAL, PERCENT y SHARES. Una cuenta real de restaurante es ambas cosas a la vez.

Detallar es un dato del gasto, no un tipo distinto de división

Un gasto detallado en Dimesum es un gasto corriente que además lleva sus líneas. El gasto conserva todo lo que los gastos ya tienen: un total, participantes, un tipo de división, uno o varios pagadores. A eso añade los artículos, las líneas de la cuenta, y los ajustes, los impuestos, la propina, las comisiones y los descuentos impresos debajo.

Dos niveles deciden entonces cada céntimo. El tipo de división del gasto reparte cualquier línea en la que no se nombre a nadie. Una línea con asignados la asumen exactamente esas personas, y nadie más.

Los dos niveles que deciden la división de una línea, de docs/tech/18-itemized-expenses.md §1.
NivelQué decideSe aplica a
Tipo de división del gastoCómo se reparte un coste compartido: a partes iguales, por porcentaje o por participaciones ponderadasTodo artículo sin asignados nombrados
Asignados del artículoQuién consumió esta línea, y en qué proporciónSolo esa línea
Una línea sin asignados se reparte según el tipo de división del gasto; una línea con asignados la asumen solo las personas que nombra NIVEL 1: NADIE NOMBRADO EN LA LÍNEA Platos compartidos 300 € sin asignados EQUAL entre 3 Asha 100 € Bhavna 100 € Chetan 100 € NIVEL 2: LA LÍNEA NOMBRA A QUIEN LO COMIÓ Plato no vegetariano 200 € asignados: Asha, Bhavna sus 2 asignados Asha 100 € Bhavna 100 € Chetan 0 €
Los dos niveles sobre los 500 € de comida. Los platos compartidos no nombran a nadie, así que EQUAL los reparte entre tres; el plato de marisco nombra a dos personas, así que el subtotal de comida de Chetan se queda en 100 €.

Una cena de 525 € en la que quien menos comió paga 105 €

Asha, Bhavna y Chetan cenan juntos, con división a partes iguales en lo general. Los platos compartidos suman 300 €. Un plato de marisco suma 200 €, y solo Asha y Bhavna lo comieron. El servicio es del 5 %, y Chetan pagó los 525 € completos.

Ejemplo resuelto: una cuenta, dos líneas, un ajuste, y la parte que asume cada persona.
LíneaImporteAshaBhavnaChetan
Platos compartidos, sin asignados300 €100 €100 €100 €
Fuente de marisco, Asha y Bhavna200 €100 €100 €0 €
Subtotal500 €200 €200 €100 €
Servicio 5 %, por subtotal25 €10 €10 €5 €
Total525 €210 €210 €105 €

Chetan pagó 525 € y debe 105 €, así que le deben 420 €: 210 € de Asha y 210 € de Bhavna. Quién pagó es independiente de quién debe. Que el pagador sea la persona que apenas comió no cambia ninguna de las partes, y por eso Dimesum mantiene los pagadores a nivel de gasto y los asignados a nivel de línea.

El impuesto sigue lo que comiste, no cuántos sois

La parte de Chetan del cargo por servicio de 25 € es de 5 €, no de 8,33 €. Cada ajuste se reparte en proporción al subtotal de artículos de cada persona, así que la división 200:200:100 de la comida decide también la división del cargo por servicio. Repartir por número de comensales cobraría en silencio a Chetan un impuesto sobre un plato que nunca probó.

Por tanto, quien no pidió nada no paga impuesto y no recibe descuento. Los pesos son los subtotales previos al ajuste y no el total acumulado, lo que además evita que el redondeo de cada ajuste se acumule en los pesos del siguiente.

Los ajustes se aplican en orden, así que un descuento mueve la base del GST

Una cuenta que dice "1.000 €, menos 10 %, más 5 % de GST" cobra el GST sobre 900 €, y la línea del GST es de 45 €. Invierte los dos y el GST se cobra sobre 1.000 €, dando 50 €. Los ajustes son una lista ordenada, y un porcentaje se aplica al total acumulado en su propia posición. Ambos órdenes son cuentas reales, así que la lista está ordenada y no es un conjunto.

El mismo descuento y GST en dos órdenes, mostrando la base sobre la que se cobra cada uno y el total que produce Descuento primero GST primero Subtotal de artículos 1.000 € menos 10 % de 1.000 € descuento de 100 € 900 € más 5 % de GST de 900 € GST de 45 € 945 € Total de la cuenta 945 € Subtotal de artículos 1.000 € más 5 % de GST de 1.000 € GST de 50 € 1.050 € menos 10 % de 1.050 € descuento de 105 € 945 € Total de la cuenta 945 € MISMA CUENTA, 100 € FIJOS EN LUGAR DEL 10 % 100 € de descuento, luego GST 945 € GST, luego 100 € de descuento 950 €
Dos porcentajes caen en los mismos 945 € porque la multiplicación conmuta, y aun así la línea del GST difiere: 45 € frente a 50 €. Cambia el descuento porcentual por 100 € fijos y los totales también se separan, 945 € frente a 950 €. El orden aquí es aritmética, no presentación.
Por qué el orden se guarda de forma explícita

Cada ajuste lleva su propia position. Un orden que dependiera del orden de inserción, o de que un generador de id se mantuviera monótono, cambiaría en silencio lo que cada uno debe tras una restauración de la base de datos.

Tres validaciones se interponen entre una errata y la aritmética. Un fondo indica o un importe fijo o una tasa en puntos básicos, nunca ambos, porque guardar ambos guarda un número y su propia derivación. Un importe negativo se rechaza, con un error que nombra DISCOUNT como la forma de escribir una reducción. Una tasa por encima de 100.000 puntos básicos también se rechaza, un tope fijado muy por encima de los 10.000 puntos básicos que significan el 100 %, porque un cien por cien de descuento es un descuento real.

Los cuatro tipos de ajuste en internal/platform/splitcalc, y qué hace cada uno al total acumulado.
TipoEfecto sobre el total acumuladoPor qué es un tipo propio
TAXSumaSolo redacción; idéntico al cálculo
TIPSumaSolo redacción; idéntico al cálculo
FEESumaSolo redacción; idéntico al cálculo
DISCOUNTRestaEl único tipo que cambia la aritmética, así que la dirección viene del tipo y nunca de un signo

El total sale de las líneas, y un total escrito es solo una suma de comprobación

Un total detallado es derivado: la suma de los artículos más la suma de los ajustes. Las líneas ya dicen lo que cuesta la cuenta, así que un total indicado por separado sería una segunda fuente de verdad que puede discrepar de la primera. Quien introduce mal una cuenta corrige una línea, que es donde está el error de verdad, y el total la sigue. Corregir una cuenta ya publicada pasa por una edición que replantea su división, así que la corrección llega como una versión nueva y no como una sobrescritura.

Un cliente todavía puede enviar amount_minor, y Dimesum lo trata entonces como una suma de comprobación y no como la respuesta. La concordancia significa que el cliente leyó la misma cuenta. La discrepancia detiene el gasto antes de que se mueva dinero alguno.

Una versión anterior añadía de forma automática una línea "Otros" para lo que un total indicado no llegaba a cuadrar, y quitaba la línea cuando el hueco se cerraba. Esa línea funcionaba, y ya no está. Derivar el total disolvió el problema que la línea "Otros" existía para gestionar, que solo surgía porque el total se indicaba dos veces.

Por qué EXACT y los artículos se rechazan juntos

EXACT nombra el importe final de cada miembro. Los artículos derivan el importe de cada miembro. Ambos a la vez está sobredeterminado: o concuerdan, en cuyo caso uno es redundante, o discrepan, en cuyo caso el gasto tiene dos respuestas y ninguna regla dice cuál gana. Dimesum rechaza la combinación en la puerta en lugar de resolverla con una regla de precedencia que nadie recordaría.

EQUAL, PERCENT y SHARES se combinan todos con los artículos, porque cada uno es una regla para repartir un coste compartido y no un conjunto de importes finales.

Dónde un descuento solía perder un céntimo

Cada reparto usa el método del resto mayor, y cada uno conserva su propio total con exactitud. Los empates en ese método solían ir al id de miembro más bajo, lo que entregaba al miembro más antiguo del grupo el céntimo extra en cada gasto dividido a partes iguales; el empate ahora rota según un hash del id del gasto. Las líneas compartidas se agrupan y se reparten una sola vez en lugar de línea por línea, así que el céntimo suelto no cae sobre el mismo miembro en cada línea de la cuenta.

Nuestra función apportion tenía aquí un defecto real. La división entera de Go trunca hacia cero, así que un total negativo se redondeaba hacia el lado equivocado y el resto nunca se repartía: −10,00 € sobre pesos de 100, 200 y 300 daba −9,99 €. Un céntimo desaparecido habría hecho que una cuenta con descuento correcta fallara su propia comprobación de suma, y se le habría dicho al usuario que su aritmética estaba mal. Los totales negativos ahora se reparten por magnitud y se vuelven a negar.

Introduce la cuenta tal como está impresa

Escribe las líneas que ves, nombra a las personas que comieron las que no se compartieron, y añade el impuesto, la propina, la comisión y el descuento en el orden en que el recibo los imprime. Dimesum deriva el total, reparte cada ajuste según lo que consumió cada persona, y deja al pagador fuera de ello. La próxima vez que un plato cueste el doble que lo que pidieron los demás, añádelo como su propia línea con dos nombres.

Preguntas frecuentes

¿Cómo se divide la cuenta de un restaurante si alguien pidió algo caro?

Pon ese plato en su propia línea y nombra a quienes lo comieron. En Dimesum el resto de la cuenta se sigue dividiendo según la regla del gasto, normalmente a partes iguales, mientras que la línea nombrada la asumen solo sus asignados. Los impuestos y el servicio se reparten después según el subtotal de cada persona, así que quien no tomó el plato paga menos de ambos.

¿Los impuestos y la propina se dividen a partes iguales o según lo que pidió cada uno?

Según lo que pidió cada uno. Dimesum reparte cada ajuste en proporción al subtotal de artículos de cada persona y no por número de comensales. En una cena de 525 € donde una persona comió 100 € de comida, esa persona asume 5 € de un cargo por servicio de 25 € en lugar de 8,33 €. Quien no pidió nada no paga ningún impuesto.

¿El orden de un descuento y un impuesto cambia lo que cuesta la cuenta?

Sí. Los ajustes se aplican en orden sobre un total acumulado, así que una cuenta que dice "1.000 €, menos 10 %, más 5 % de GST" cobra el GST sobre 900 € y la línea del GST es de 45 €. Pon el GST primero y se cobra sobre 1.000 €, dando 50 €. Con un descuento fijo de 100 € los totales también difieren, 945 € frente a 950 €.

¿Por qué no se pueden usar importes exactos en una cuenta detallada?

EXACT nombra el importe final de cada persona y los artículos lo derivan, así que juntos dan a un gasto dos respuestas. Dimesum rechaza la combinación en lugar de elegir un ganador con una regla de precedencia que nadie recordaría. EQUAL, PERCENT y SHARES funcionan todos junto a los artículos, porque cada uno es una regla para repartir líneas compartidas y no un conjunto de importes finales.

¿Hay que escribir el total de una cuenta detallada?

No. Dimesum deriva el total detallado como la suma de los artículos más la suma de los ajustes, porque las líneas ya dicen lo que cuesta la cuenta. Un total enviado por un cliente se comprueba como una suma de comprobación, y una discrepancia detiene el gasto antes de que se mueva dinero. Corregir una cifra equivocada significa corregir la línea de la que salió.