Permite marcar un traspaso y distinguirlo en la interfaz

Sin esto el campo is_transfer no es alcanzable: no aparece en los formularios
de gasto ni de ingreso, asi que nadie puede marcar un movimiento como
traspaso.

Ademas, un movimiento que no suma al total tiene que verse distinto o el
usuario no entendera por que sus numeros no cuadran con la tabla. Se anade un
distintivo "Traspaso" en el listado de gastos, en los ultimos movimientos de
home y en los gastos recientes del dashboard, que son los tres sitios donde
se listan movimientos sin agregarlos.

El distintivo usa una variante nueva, .badge-neutral, en vez de reutilizar
.badge-inactive: un traspaso es informacion, no un estado degradado, y
pintarlo con el color de error o de cuenta inactiva daria a entender que algo
va mal. Las variables que usa (--color-chip-bg y --color-text-muted) ya
existen en los dos temas.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
JKuijperM 2026-09-16 08:31:11 +02:00
parent e2b756bcc7
commit 2d7cd8cb68
6 changed files with 29 additions and 4 deletions

View File

@ -27,6 +27,7 @@ class ExpenseForm(forms.ModelForm):
"category", "category",
"account", "account",
"tags", "tags",
"is_transfer",
] ]
widgets = { widgets = {
"date": forms.DateInput(format="%Y-%m-%d", attrs={"type": "date"}), "date": forms.DateInput(format="%Y-%m-%d", attrs={"type": "date"}),
@ -50,7 +51,7 @@ class AccountForm(forms.ModelForm):
class IncomeForm(forms.ModelForm): class IncomeForm(forms.ModelForm):
class Meta: class Meta:
model = Income model = Income
fields = ["account", "name", "amount", "date"] fields = ["account", "name", "amount", "date", "is_transfer"]
widgets = {"date": forms.DateInput(format="%Y-%m-%d", attrs={"type": "date"})} widgets = {"date": forms.DateInput(format="%Y-%m-%d", attrs={"type": "date"})}
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):

View File

@ -732,6 +732,13 @@ tr:hover {
color: var(--color-danger-text); color: var(--color-danger-text);
} }
/* Etiqueta informativa, sin carga de error ni de éxito: marca un movimiento
como lo que es, no como un estado degradado. */
.badge-neutral {
background-color: var(--color-chip-bg);
color: var(--color-text-muted);
}
.row-inactive { .row-inactive {
opacity: 0.55; opacity: 0.55;
} }

View File

@ -215,7 +215,12 @@
<tr> <tr>
<td>{{ exp.date|date:"d/m/Y" }}</td> <td>{{ exp.date|date:"d/m/Y" }}</td>
<td>{{ exp.account.name }}</td> <td>{{ exp.account.name }}</td>
<td>{{ exp.category.name }}</td> <td>
{{ exp.category.name }}
{% if exp.is_transfer %}
<span class="badge badge-neutral">Traspaso</span>
{% endif %}
</td>
<td>{{ exp.description|default:"-" }}</td> <td>{{ exp.description|default:"-" }}</td>
<td style="color: var(--color-danger-accent); font-weight: bold;">{{ exp.amount|floatformat:2 }}</td> <td style="color: var(--color-danger-accent); font-weight: bold;">{{ exp.amount|floatformat:2 }}</td>
</tr> </tr>

View File

@ -117,7 +117,12 @@
{% for expense in page_obj %} {% for expense in page_obj %}
<tr> <tr>
<td>{{ expense.date }}</td> <td>{{ expense.date }}</td>
<td>{{ expense.category.name }}</td> <td>
{{ expense.category.name }}
{% if expense.is_transfer %}
<span class="badge badge-neutral">Traspaso</span>
{% endif %}
</td>
<td>{{ expense.amount }}</td> <td>{{ expense.amount }}</td>
<td>{{ expense.account.name }}</td> <td>{{ expense.account.name }}</td>
<td> <td>

View File

@ -96,7 +96,12 @@
{% for mov in movements %} {% for mov in movements %}
<li class="movement"> <li class="movement">
<span class="movement-date">{{ mov.date }}</span> <span class="movement-date">{{ mov.date }}</span>
<span class="movement-label">{{ mov.label }}</span> <span class="movement-label">
{{ mov.label }}
{% if mov.is_transfer %}
<span class="badge badge-neutral">Traspaso</span>
{% endif %}
</span>
<span class="movement-account muted">{{ mov.account }}</span> <span class="movement-account muted">{{ mov.account }}</span>
<span class="movement-amount {% if mov.kind == 'income' %}amount-positive{% else %}amount-negative{% endif %}"> <span class="movement-amount {% if mov.kind == 'income' %}amount-positive{% else %}amount-negative{% endif %}">
{% if mov.kind == 'income' %}+{% else %}{% endif %}{{ mov.amount|floatformat:2 }}€ {% if mov.kind == 'income' %}+{% else %}{% endif %}{{ mov.amount|floatformat:2 }}€

View File

@ -255,6 +255,7 @@ def home(request):
"label": e.category.name, "label": e.category.name,
"account": e.account.name, "account": e.account.name,
"amount": e.amount, "amount": e.amount,
"is_transfer": e.is_transfer,
} }
for e in recent_expenses for e in recent_expenses
] ]
@ -265,6 +266,7 @@ def home(request):
"label": i.name, "label": i.name,
"account": i.account.name, "account": i.account.name,
"amount": i.amount, "amount": i.amount,
"is_transfer": i.is_transfer,
} }
for i in recent_incomes for i in recent_incomes
], ],