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",
"account",
"tags",
"is_transfer",
]
widgets = {
"date": forms.DateInput(format="%Y-%m-%d", attrs={"type": "date"}),
@ -50,7 +51,7 @@ class AccountForm(forms.ModelForm):
class IncomeForm(forms.ModelForm):
class Meta:
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"})}
def __init__(self, *args, **kwargs):

View File

@ -732,6 +732,13 @@ tr:hover {
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 {
opacity: 0.55;
}

View File

@ -215,7 +215,12 @@
<tr>
<td>{{ exp.date|date:"d/m/Y" }}</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 style="color: var(--color-danger-accent); font-weight: bold;">{{ exp.amount|floatformat:2 }}</td>
</tr>

View File

@ -117,7 +117,12 @@
{% for expense in page_obj %}
<tr>
<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.account.name }}</td>
<td>

View File

@ -96,7 +96,12 @@
{% for mov in movements %}
<li class="movement">
<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-amount {% if mov.kind == 'income' %}amount-positive{% else %}amount-negative{% endif %}">
{% if mov.kind == 'income' %}+{% else %}{% endif %}{{ mov.amount|floatformat:2 }}€

View File

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