Добавлены операции с кошельком клиента: пополнение и возврат

- Добавлены view wallet_deposit и wallet_withdraw с защитой (login_required, is_staff, CSRF)
- Новые маршруты: /customers/<pk>/wallet/deposit/ и /customers/<pk>/wallet/withdraw/
- UI на странице клиента: две симметричные формы для пополнения и списания баланса
- Пополнение: произвольная сумма с обязательным описанием (подарки, компенсации)
- Возврат/списание: с ограничением макс. суммы = текущий баланс, обязательное описание
- Все операции логируются в WalletTransaction с типом 'adjustment'
- Защита от операций с системным клиентом
- Компактный симметричный дизайн форм с фиксированной высотой подсказок
This commit is contained in:
2025-11-29 18:09:40 +03:00
parent 3f22677573
commit 4b7241bcfc
3 changed files with 149 additions and 1 deletions

View File

@@ -82,6 +82,82 @@
</div>
</div>
<!-- Операции с кошельком -->
<div class="col-md-12">
<div class="card mb-4">
<div class="card-header">
<h5>Операции с кошельком клиента</h5>
</div>
<div class="card-body">
<div class="row">
<!-- Пополнение -->
<div class="col-md-6">
<h6 class="text-success mb-3"><i class="bi bi-plus-circle"></i> Пополнение кошелька</h6>
<form method="post" action="{% url 'customers:wallet-deposit' customer.pk %}">
{% csrf_token %}
<div class="mb-3">
<label for="wallet_deposit_amount" class="form-label">Сумма, руб.</label>
<input type="number"
step="0.01"
min="0.01"
class="form-control"
id="wallet_deposit_amount"
name="amount"
placeholder="0.00"
required>
<div style="height: 1.25rem;"></div>
</div>
<div class="mb-3">
<label for="wallet_deposit_description" class="form-label">Описание (обязательно)</label>
<textarea class="form-control"
id="wallet_deposit_description"
name="description"
rows="2"
placeholder="Например: Подарок, компенсация за некачественный товар"
required></textarea>
</div>
<button type="submit" class="btn btn-success w-100"><i class="bi bi-plus-circle"></i> Пополнить кошелёк</button>
</form>
</div>
<!-- Возврат / списание -->
<div class="col-md-6">
<h6 class="text-danger mb-3"><i class="bi bi-dash-circle"></i> Возврат / списание с кошелька</h6>
<form method="post" action="{% url 'customers:wallet-withdraw' customer.pk %}">
{% csrf_token %}
<div class="mb-3">
<label for="wallet_withdraw_amount" class="form-label">Сумма, руб.</label>
<input type="number"
step="0.01"
min="0.01"
max="{{ customer.wallet_balance }}"
class="form-control"
id="wallet_withdraw_amount"
name="amount"
placeholder="0.00"
required>
<small class="text-muted d-block" style="height: 1.25rem; line-height: 1.25rem;">Макс: {{ customer.wallet_balance|floatformat:2 }} руб.</small>
</div>
<div class="mb-3">
<label for="wallet_withdraw_description" class="form-label">Описание (обязательно)</label>
<textarea class="form-control"
id="wallet_withdraw_description"
name="description"
rows="2"
placeholder="Например: Возврат наличными, перевод на карту клиента"
required></textarea>
</div>
<button type="submit" class="btn btn-danger w-100"><i class="bi bi-dash-circle"></i> Списать с кошелька</button>
</form>
</div>
</div>
<div class="alert alert-info mb-0 mt-3">
<i class="bi bi-info-circle"></i> Все операции с кошельком автоматически логируются в истории транзакций ниже.
</div>
</div>
</div>
</div>
<!-- История транзакций кошелька -->
<div class="col-md-12">
<div class="card mb-4">